Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Code Break: Can set visible after for lesson #33869

Merged
merged 10 commits into from
Mar 31, 2020
13 changes: 13 additions & 0 deletions dashboard/app/dsl/script_dsl.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ def initialize
@stage = nil
@stage_flex_category = nil
@stage_lockable = false
@stage_visible_after = nil
@concepts = []
@skin = nil
@current_scriptlevel = nil
Expand Down Expand Up @@ -82,19 +83,30 @@ def stage(name, properties = {})
if @stage
@stages << {
stage: @stage,
visible_after: @stage_visible_after,
scriptlevels: @scriptlevels,
stage_extras_disabled: @stage_extras_disabled,
}.compact
end
@stage = name
@stage_flex_category = properties[:flex_category]
@stage_lockable = properties[:lockable]
@stage_visible_after = determine_visible_after_time(properties[:visible_after])
@scriptlevels = []
@concepts = []
@skin = nil
@stage_extras_disabled = nil
end

def determine_visible_after_time(visible_after_value)
current_time = Time.now
raw_diff_to_wed = 3 - current_time.wday
diff_to_wed = raw_diff_to_wed > 0 ? raw_diff_to_wed : 7 + raw_diff_to_wed
dmcavoy marked this conversation as resolved.
Show resolved Hide resolved
next_wednesday = current_time + diff_to_wed.day
next_wednesday_8_am_pst = Time.new(next_wednesday.year, next_wednesday.month, next_wednesday.day, 8, 0, 0, '-07:00').to_s
visible_after_value == '' ? next_wednesday_8_am_pst : visible_after_value
dmcavoy marked this conversation as resolved.
Show resolved Hide resolved
end

def parse_output
stage(nil)
{
Expand Down Expand Up @@ -314,6 +326,7 @@ def self.serialize_stages(script)
t = "stage '#{escape(stage.name)}'"
t += ', lockable: true' if stage.lockable
t += ", flex_category: '#{escape(stage.flex_category)}'" if stage.flex_category
t += ", visible_after: '#{escape(stage.visible_after)}'" if stage.visible_after
s << t
stage.script_levels.each do |sl|
type = 'level'
Expand Down
1 change: 1 addition & 0 deletions dashboard/app/models/script.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1060,6 +1060,7 @@ def self.add_script(options, raw_stages, new_suffix: nil, editor_experiment: nil

raw_stage = raw_stages.find {|rs| rs[:stage].downcase == stage.name.downcase}
stage.stage_extras_disabled = raw_stage[:stage_extras_disabled]
stage.visible_after = raw_stage[:visible_after]
stage.save! if stage.changed?
end

Expand Down
1 change: 1 addition & 0 deletions dashboard/app/models/stage.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class Stage < ActiveRecord::Base

serialized_attrs %w(
stage_extras_disabled
visible_after
)

# A stage has an absolute position and a relative position. The difference between the two is that relative_position
Expand Down
66 changes: 66 additions & 0 deletions dashboard/test/dsl/script_dsl_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,72 @@ def setup
assert_equal expected, output
end

test 'Script DSL with blank stage visible after date with set visible after to next wednesday at 8 am PST' do
Timecop.freeze(Time.new(2020, 3, 27))

input_dsl = <<~DSL
stage 'Stage1', visible_after: ''
level 'Level 1'
level 'Level 2'
DSL
expected = DEFAULT_PROPS.merge(
{
stages: [
{
stage: "Stage1",
visible_after: '2020-04-01 08:00:00 -0700',
scriptlevels: [
{stage: "Stage1", levels: [{name: "Level 1"}]},
{stage: "Stage1", levels: [{name: "Level 2"}]},
]
}
]
}
)

output, _ = ScriptDSL.parse(input_dsl, 'test.script', 'test')
assert_equal expected, output
Timecop.return
end

test 'Script DSL with stage visible after date' do
input_dsl = <<~DSL
stage 'Stage1', visible_after: '2020-04-01 10:00:00 -0700'
level 'Level 1'
level 'Level 2'
DSL
expected = DEFAULT_PROPS.merge(
{
stages: [
{
stage: "Stage1",
visible_after: '2020-04-01 10:00:00 -0700',
scriptlevels: [
{stage: "Stage1", levels: [{name: "Level 1"}]},
{stage: "Stage1", levels: [{name: "Level 2"}]},
]
}
]
}
)

output, _ = ScriptDSL.parse(input_dsl, 'test.script', 'test')
assert_equal expected, output
end

test 'serialize visible after for stage' do
level = create :maze, name: 'maze 1', level_num: 'custom'
script = create :script, hidden: true
stage = create :stage, name: 'stage 1', script: script, visible_after: '2020-04-01 08:00:00 -0800'
script_level = create :script_level, levels: [level], stage: stage, script: script
script_text = ScriptDSL.serialize_to_string(script_level.script)
expected = <<~SCRIPT
stage 'stage 1', visible_after: '2020-04-01 08:00:00 -0800'
level 'maze 1'
SCRIPT
assert_equal expected, script_text
end

test 'Script DSL with project_sharing' do
input_dsl = 'project_sharing true'
expected = DEFAULT_PROPS.merge(
Expand Down