pipely 0.8.3 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pipely/build.rb +2 -16
  3. data/lib/pipely/build/daily_scheduler.rb +1 -1
  4. data/lib/pipely/build/definition.rb +30 -2
  5. data/lib/pipely/build/environment_config.rb +24 -1
  6. data/lib/pipely/build/s3_path_builder.rb +65 -33
  7. data/lib/pipely/deploy/bootstrap.rb +17 -14
  8. data/lib/pipely/deploy/bootstrap_context.rb +87 -10
  9. data/lib/pipely/deploy/bootstrap_registry.rb +45 -0
  10. data/lib/pipely/deploy/client.rb +33 -18
  11. data/lib/pipely/deploy/json_definition.rb +51 -0
  12. data/lib/pipely/pipeline_date_time/pipeline_date.rb +62 -0
  13. data/lib/pipely/pipeline_date_time/pipeline_date_pattern.rb +42 -0
  14. data/lib/pipely/pipeline_date_time/pipeline_date_range_base.rb +44 -0
  15. data/lib/pipely/pipeline_date_time/pipeline_day_range.rb +14 -0
  16. data/lib/pipely/pipeline_date_time/pipeline_month_range.rb +26 -0
  17. data/lib/pipely/pipeline_date_time/pipeline_year_range.rb +25 -0
  18. data/lib/pipely/tasks/definition.rb +7 -0
  19. data/lib/pipely/tasks/deploy.rb +7 -0
  20. data/lib/pipely/tasks/upload_pipeline_as_gem.rb +19 -9
  21. data/lib/pipely/version.rb +1 -1
  22. data/spec/fixtures/bootstrap_contexts/green.rb +9 -0
  23. data/spec/fixtures/bootstrap_contexts/simple.rb +9 -0
  24. data/spec/fixtures/templates/bootstrap.sh.erb +4 -0
  25. data/spec/lib/pipely/build/environment_config_spec.rb +58 -0
  26. data/spec/lib/pipely/build/s3_path_builder_spec.rb +34 -2
  27. data/spec/lib/pipely/build/template_spec.rb +10 -10
  28. data/spec/lib/pipely/build_spec.rb +29 -0
  29. data/spec/lib/pipely/deploy/bootstrap_context_spec.rb +102 -14
  30. data/spec/lib/pipely/deploy/bootstrap_registry_spec.rb +32 -0
  31. data/spec/lib/pipely/deploy/bootstrap_spec.rb +41 -24
  32. data/spec/lib/pipely/pipeline_date_time/pipeline_date_pattern_spec.rb +181 -0
  33. data/spec/lib/pipely/pipeline_date_time/pipeline_date_range_base_spec.rb +39 -0
  34. data/spec/lib/pipely/pipeline_date_time/pipeline_date_spec.rb +110 -0
  35. data/spec/lib/pipely/pipeline_date_time/pipeline_day_range_spec.rb +23 -0
  36. data/spec/lib/pipely/pipeline_date_time/pipeline_month_range_spec.rb +93 -0
  37. data/spec/lib/pipely/pipeline_date_time/pipeline_year_range_spec.rb +93 -0
  38. data/spec/lib/pipely/tasks/upload_pipeline_as_gem_spec.rb +59 -0
  39. metadata +49 -3
@@ -0,0 +1,181 @@
1
+ # encoding: utf-8
2
+ require 'pipely/pipeline_date_time/pipeline_date_pattern'
3
+
4
+ TestSelection = Struct.new(:num_days_back, :target_date, :target_all_time)
5
+
6
+ class TestDatePatternMatcher
7
+ attr_accessor :day_offsets, :month_offsets, :year_offsets
8
+
9
+ PipelineDate = Pipely::PipelineDateTime::PipelineDate
10
+
11
+ def initialize(date_pattern, target_date, sep)
12
+ @day_offsets, @month_offsets, @year_offsets = [], [], []
13
+ date_pattern.split(sep).each do |part|
14
+ days, format = days_and_format(part, target_date)
15
+ case format
16
+ when PipelineDate::DEFAULT_YEAR_FORMAT then @year_offsets << days
17
+ when PipelineDate::DEFAULT_MONTH_FORMAT then @month_offsets << days
18
+ when PipelineDate::DEFAULT_DAY_FORMAT then @day_offsets << days
19
+ end
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def days_and_format(part, target_date)
26
+ trimmed = part.gsub("\#{format(", '').gsub("\")}", '')
27
+ days_expr, format = trimmed.split(", \"")
28
+ if days_expr == target_date
29
+ days = 0
30
+ else
31
+ days = days_expr.gsub("minusDays(#{target_date}, ", '').gsub(')', '')
32
+ end
33
+ return days.to_i, format
34
+ end
35
+ end
36
+
37
+ class TestPipelineDatePattern
38
+ include Pipely::PipelineDateTime::PipelineDatePattern
39
+
40
+ attr_reader :selection
41
+
42
+ def initialize
43
+ @selection = TestSelection.new
44
+ @selection.target_all_time = false
45
+ end
46
+
47
+ def num_days_back=(num_days_back)
48
+ @selection.num_days_back = num_days_back
49
+ end
50
+
51
+ def target_date=(target_date)
52
+ @selection.target_date = target_date
53
+ end
54
+
55
+ def any_string(parts)
56
+ if parts.empty?
57
+ nil
58
+ elsif parts.count == 1
59
+ parts.first
60
+ else
61
+ "#{parts.join('|')}"
62
+ end
63
+ end
64
+ end
65
+
66
+ describe TestPipelineDatePattern do
67
+ let(:target_date) { '@scheduledStartTime' }
68
+ let(:sep) { '|' }
69
+ subject { described_class.new }
70
+
71
+ before { subject.target_date = target_date }
72
+
73
+ context 'with 0 days back' do
74
+ before { subject.num_days_back = 0 }
75
+
76
+ describe '#date_pattern' do
77
+ let(:pattern_matcher) do
78
+ TestDatePatternMatcher.new(subject.date_pattern, target_date, sep)
79
+ end
80
+
81
+ it 'contains just target_date' do
82
+ expect(pattern_matcher.day_offsets).to eq([0])
83
+ expect(pattern_matcher.month_offsets).to eq([])
84
+ expect(pattern_matcher.year_offsets).to eq([])
85
+ end
86
+ end
87
+ end
88
+
89
+ context 'with 59 days back' do
90
+ before { subject.num_days_back = 59 }
91
+
92
+ describe '#date_pattern' do
93
+ let(:pattern_matcher) do
94
+ TestDatePatternMatcher.new(subject.date_pattern, target_date, sep)
95
+ end
96
+
97
+ it 'contains 60 individual days' do
98
+ expect(pattern_matcher.day_offsets.sort).to eq((0..59).to_a)
99
+ end
100
+
101
+ it 'contains no months' do
102
+ expect(pattern_matcher.month_offsets).to eq([])
103
+ end
104
+
105
+ it 'contains no years' do
106
+ expect(pattern_matcher.year_offsets).to eq([])
107
+ end
108
+ end
109
+ end
110
+
111
+ context 'with 60 days back' do
112
+ before { subject.num_days_back = 60 }
113
+
114
+ describe '#date_pattern' do
115
+ let(:pattern_matcher) do
116
+ TestDatePatternMatcher.new(subject.date_pattern, target_date, sep)
117
+ end
118
+
119
+ it 'contains 60 individual days' do
120
+ expected_days = (0..29).to_a + (31..60).to_a
121
+ expect(pattern_matcher.day_offsets.sort).to eq(expected_days)
122
+ end
123
+
124
+ it 'contains 1 month' do
125
+ expect(pattern_matcher.month_offsets).to eq([30])
126
+ end
127
+
128
+ it 'contains no years' do
129
+ expect(pattern_matcher.year_offsets).to eq([])
130
+ end
131
+ end
132
+ end
133
+
134
+ context 'with 729 days back' do
135
+ before { subject.num_days_back = 729 }
136
+
137
+ describe '#date_pattern' do
138
+ let(:pattern_matcher) do
139
+ TestDatePatternMatcher.new(subject.date_pattern, target_date, sep)
140
+ end
141
+
142
+ it 'contains 60 individual days' do
143
+ expected_days = (0..29).to_a + (700..729).to_a
144
+ expect(pattern_matcher.day_offsets.sort).to eq(expected_days)
145
+ end
146
+
147
+ it 'contains 24 individual months' do
148
+ expected_months = ((30..674).step(28)).to_a
149
+ expect(pattern_matcher.month_offsets.sort).to eq(expected_months)
150
+ end
151
+
152
+ it 'contains no years' do
153
+ expect(pattern_matcher.year_offsets).to eq([])
154
+ end
155
+ end
156
+ end
157
+
158
+ context 'with 730 days back' do
159
+ before { subject.num_days_back = 730 }
160
+
161
+ describe '#date_pattern' do
162
+ let(:pattern_matcher) do
163
+ TestDatePatternMatcher.new(subject.date_pattern, target_date, sep)
164
+ end
165
+
166
+ it 'contains 60 individual days' do
167
+ expected_days = (0..29).to_a + (701..730).to_a
168
+ expect(pattern_matcher.day_offsets.sort).to eq(expected_days)
169
+ end
170
+
171
+ it 'contains 24 individual months' do
172
+ expected_months = (30..394).step(28).to_a + (422..674).step(28).to_a
173
+ expect(pattern_matcher.month_offsets.sort).to eq(expected_months)
174
+ end
175
+
176
+ it 'contains 1 year' do
177
+ expect(pattern_matcher.year_offsets).to eq([365])
178
+ end
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+ require 'pipely/pipeline_date_time/pipeline_date_range_base'
3
+
4
+ describe Pipely::PipelineDateTime::PipelineDateRangeBase do
5
+ let(:target_date) { '@scheduledStartTime' }
6
+ let(:days_back_start) { 5 }
7
+ let(:days_back_end) { 0 }
8
+ subject { described_class.new(target_date, days_back_start, days_back_end) }
9
+
10
+ let(:expected_days_back) { (days_back_end..days_back_start).to_set }
11
+
12
+ describe '#days_back' do
13
+ it 'returns the expect value' do
14
+ expect(subject.days_back).to eq expected_days_back
15
+ end
16
+ end
17
+
18
+ describe '#exclude' do
19
+ it 'does not exclude when days_back_start is negative' do
20
+ subject.exclude(-1, 0)
21
+ expect(subject.days_back).to eq expected_days_back
22
+ end
23
+
24
+ it 'does not exclude when days_back_end is negative' do
25
+ subject.exclude(0, -2)
26
+ expect(subject.days_back).to eq expected_days_back
27
+ end
28
+
29
+ it 'does not exclude when days_back_start is smaller than days_back_end' do
30
+ subject.exclude(3, 5)
31
+ expect(subject.days_back).to eq expected_days_back
32
+ end
33
+
34
+ it 'excludes expected offsets' do
35
+ subject.exclude(4, 2)
36
+ expect(subject.days_back).to eq Set.new([0,1,5])
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,110 @@
1
+ # encoding: utf-8
2
+ require 'pipely/pipeline_date_time/pipeline_date'
3
+
4
+ describe Pipely::PipelineDateTime::PipelineDate do
5
+ let(:target_date) { '@scheduledStartTime' }
6
+
7
+ context 'with default time formats' do
8
+ context 'with positive num days back' do
9
+ let(:num_days_back) { 5 }
10
+ subject { described_class.new(target_date, num_days_back) }
11
+
12
+ describe '#day' do
13
+ let(:result) do
14
+ "\#{format(minusDays(@scheduledStartTime, 5), \"YYYY/MM/dd\")}"
15
+ end
16
+
17
+ it { expect(subject.day).to eq(result) }
18
+ end
19
+
20
+ describe '#month' do
21
+ let(:result) do
22
+ "\#{format(minusDays(@scheduledStartTime, 5), \"YYYY/MM\")}"
23
+ end
24
+
25
+ it { expect(subject.month).to eq(result) }
26
+ end
27
+
28
+ describe '#year' do
29
+ let(:result) do
30
+ "\#{format(minusDays(@scheduledStartTime, 5), \"YYYY\")}"
31
+ end
32
+
33
+ it { expect(subject.year).to eq(result) }
34
+ end
35
+ end
36
+
37
+ context 'with 0 days back' do
38
+ let(:num_days_back) { 0 }
39
+ subject { described_class.new(target_date, num_days_back) }
40
+
41
+ describe '#day' do
42
+ let(:result) do
43
+ "\#{format(@scheduledStartTime, \"YYYY/MM/dd\")}"
44
+ end
45
+
46
+ it { expect(subject.day).to eq(result) }
47
+ end
48
+ end
49
+
50
+ context 'with negative num days back' do
51
+ let(:num_days_back) { -3 }
52
+ subject { described_class.new(target_date, num_days_back) }
53
+
54
+ describe '#day' do
55
+ let(:result) do
56
+ "\#{format(plusDays(@scheduledStartTime, 3), \"YYYY/MM/dd\")}"
57
+ end
58
+
59
+ it { expect(subject.day).to eq(result) }
60
+ end
61
+ end
62
+ end
63
+
64
+ context 'with custom date time formats' do
65
+ let(:day_format) { 'DAY_FORMAT' }
66
+ let(:month_format) { 'MONTH_FORMAT' }
67
+ let(:year_format) { 'YEAR_FORMAT' }
68
+
69
+ before do
70
+ described_class.day_format = day_format
71
+ described_class.month_format = month_format
72
+ described_class.year_format = year_format
73
+ end
74
+
75
+ after do
76
+ described_class.day_format = described_class::DEFAULT_DAY_FORMAT
77
+ described_class.month_format = described_class::DEFAULT_MONTH_FORMAT
78
+ described_class.year_format = described_class::DEFAULT_YEAR_FORMAT
79
+ end
80
+
81
+ context 'with negative num days back' do
82
+ let(:num_days_back) { -3 }
83
+ subject { described_class.new(target_date, num_days_back) }
84
+
85
+ describe '#day' do
86
+ let(:result) do
87
+ "\#{format(plusDays(@scheduledStartTime, 3), \"#{day_format}\")}"
88
+ end
89
+
90
+ it { expect(subject.day).to eq(result) }
91
+ end
92
+
93
+ describe '#month' do
94
+ let(:result) do
95
+ "\#{format(plusDays(@scheduledStartTime, 3), \"#{month_format}\")}"
96
+ end
97
+
98
+ it { expect(subject.month).to eq(result) }
99
+ end
100
+
101
+ describe '#year' do
102
+ let(:result) do
103
+ "\#{format(plusDays(@scheduledStartTime, 3), \"#{year_format}\")}"
104
+ end
105
+
106
+ it { expect(subject.year).to eq(result) }
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+ require 'pipely/pipeline_date_time/pipeline_day_range'
3
+
4
+ describe Pipely::PipelineDateTime::PipelineDayRange do
5
+ let(:target_date) { '@scheduledStartTime' }
6
+ let(:days_back_start) { 2 }
7
+ let(:days_back_end) { 0 }
8
+ subject { described_class.new(target_date, days_back_start, days_back_end) }
9
+
10
+ describe '#days' do
11
+ let(:expected_days) do
12
+ [
13
+ "\#{format(@scheduledStartTime, \"YYYY/MM/dd\")}",
14
+ "\#{format(minusDays(@scheduledStartTime, 1), \"YYYY/MM/dd\")}",
15
+ "\#{format(minusDays(@scheduledStartTime, 2), \"YYYY/MM/dd\")}"
16
+ ]
17
+ end
18
+
19
+ it 'returns the expect value' do
20
+ expect(subject.days).to eq expected_days
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,93 @@
1
+ # encoding: utf-8
2
+ require 'pipely/pipeline_date_time/pipeline_month_range'
3
+
4
+ describe Pipely::PipelineDateTime::PipelineMonthRange do
5
+ let(:target_date) { '@scheduledStartTime' }
6
+
7
+ context 'with 59 days between start and end' do
8
+ let(:days_back_start) { 59 }
9
+ let(:days_back_end) { 0 }
10
+ subject { described_class.new(target_date, days_back_start, days_back_end) }
11
+
12
+ describe '#start' do
13
+ it { expect(subject.start).to eq 29 }
14
+ end
15
+
16
+ describe '#end' do
17
+ it { expect(subject.end).to eq 30 }
18
+ end
19
+
20
+ describe '#months' do
21
+ it { expect(subject.months).to eq [] }
22
+ end
23
+ end
24
+
25
+ context 'with 60 days between start and end' do
26
+ let(:days_back_start) { 62 }
27
+ let(:days_back_end) { 2 }
28
+ subject { described_class.new(target_date, days_back_start, days_back_end) }
29
+
30
+ describe '#start' do
31
+ it { expect(subject.start).to eq 32 }
32
+ end
33
+
34
+ describe '#end' do
35
+ it { expect(subject.end).to eq 32 }
36
+ end
37
+
38
+ describe '#months' do
39
+ let(:expected_months) do
40
+ ["\#{format(minusDays(@scheduledStartTime, 32), \"YYYY/MM\")}"]
41
+ end
42
+
43
+ it { expect(subject.months).to eq expected_months }
44
+ end
45
+ end
46
+
47
+ context 'with 87 days between start and end' do
48
+ let(:days_back_start) { 90 }
49
+ let(:days_back_end) { 3 }
50
+ subject { described_class.new(target_date, days_back_start, days_back_end) }
51
+
52
+ describe '#start' do
53
+ it { expect(subject.start).to eq 60 }
54
+ end
55
+
56
+ describe '#end' do
57
+ it { expect(subject.end).to eq 33 }
58
+ end
59
+
60
+ describe '#months' do
61
+ let(:expected_months) do
62
+ ["\#{format(minusDays(@scheduledStartTime, 33), \"YYYY/MM\")}"]
63
+ end
64
+
65
+ it { expect(subject.months).to eq expected_months }
66
+ end
67
+ end
68
+
69
+ context 'with 88 days between start and end' do
70
+ let(:days_back_start) { 92 }
71
+ let(:days_back_end) { 4 }
72
+ subject { described_class.new(target_date, days_back_start, days_back_end) }
73
+
74
+ describe '#start' do
75
+ it { expect(subject.start).to eq 62 }
76
+ end
77
+
78
+ describe '#end' do
79
+ it { expect(subject.end).to eq 34 }
80
+ end
81
+
82
+ describe '#months' do
83
+ let(:expected_months) do
84
+ [
85
+ "\#{format(minusDays(@scheduledStartTime, 34), \"YYYY/MM\")}",
86
+ "\#{format(minusDays(@scheduledStartTime, 62), \"YYYY/MM\")}"
87
+ ]
88
+ end
89
+
90
+ it { expect(subject.months).to eq expected_months }
91
+ end
92
+ end
93
+ end