rake-funnel 0.3.2.pre → 0.4.0.pre

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 (122) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +2 -2
  3. data/Gemfile +4 -0
  4. data/README.md +2 -2
  5. data/lib/rake/funnel/ambiguous_file_error.rb +31 -29
  6. data/lib/rake/funnel/execution_error.rb +28 -26
  7. data/lib/rake/funnel/extensions/case/camel_case.rb +24 -19
  8. data/lib/rake/funnel/extensions/case/pascal_case.rb +24 -19
  9. data/lib/rake/funnel/extensions/case.rb +3 -3
  10. data/lib/rake/funnel/extensions/common_path.rb +60 -52
  11. data/lib/rake/funnel/extensions/disable_colors.rb +33 -27
  12. data/lib/rake/funnel/extensions/rexml.rb +27 -23
  13. data/lib/rake/funnel/extensions/shell.rb +92 -56
  14. data/lib/rake/funnel/extensions/windows_path.rb +15 -11
  15. data/lib/rake/funnel/framework.rb +11 -16
  16. data/lib/rake/funnel/integration/progress_report.rb +72 -70
  17. data/lib/rake/funnel/integration/sync_output.rb +12 -8
  18. data/lib/rake/funnel/integration/teamcity/nunit_plugin.rb +61 -55
  19. data/lib/rake/funnel/integration/teamcity/progress_report.rb +39 -33
  20. data/lib/rake/funnel/integration/teamcity/service_messages.rb +46 -40
  21. data/lib/rake/funnel/integration/teamcity/teamcity.rb +19 -15
  22. data/lib/rake/funnel/integration/teamcity.rb +3 -5
  23. data/lib/rake/funnel/support/argument_mapper/key_value_pair.rb +16 -10
  24. data/lib/rake/funnel/support/argument_mapper/styles/default.rb +39 -31
  25. data/lib/rake/funnel/support/argument_mapper/styles/msbuild.rb +41 -33
  26. data/lib/rake/funnel/support/argument_mapper/styles/msdeploy.rb +55 -47
  27. data/lib/rake/funnel/support/argument_mapper/styles/nunit.rb +41 -33
  28. data/lib/rake/funnel/support/argument_mapper/styles.rb +3 -5
  29. data/lib/rake/funnel/support/argument_mapper/switch.rb +16 -10
  30. data/lib/rake/funnel/support/argument_mapper/value.rb +16 -10
  31. data/lib/rake/funnel/support/assembly_version/from_version_files.rb +39 -35
  32. data/lib/rake/funnel/support/assembly_version/languages/cs +5 -5
  33. data/lib/rake/funnel/support/assembly_version/languages/fs +12 -12
  34. data/lib/rake/funnel/support/assembly_version/languages/vb +5 -5
  35. data/lib/rake/funnel/support/assembly_version_writer.rb +56 -52
  36. data/lib/rake/funnel/support/binary_version_reader.rb +37 -32
  37. data/lib/rake/funnel/support/copier.rb +31 -27
  38. data/lib/rake/funnel/support/environments/loader.rb +46 -40
  39. data/lib/rake/funnel/support/environments.rb +3 -3
  40. data/lib/rake/funnel/support/internal/finder.rb +55 -51
  41. data/lib/rake/funnel/support/internal/instantiate_symbol.rb +38 -34
  42. data/lib/rake/funnel/support/mapper.rb +57 -53
  43. data/lib/rake/funnel/support/mono.rb +21 -17
  44. data/lib/rake/funnel/support/msbuild/build_tool.rb +30 -24
  45. data/lib/rake/funnel/support/msbuild.rb +3 -3
  46. data/lib/rake/funnel/support/msdeploy/registry_patch.rb +90 -84
  47. data/lib/rake/funnel/support/msdeploy.rb +3 -3
  48. data/lib/rake/funnel/support/patch.rb +41 -37
  49. data/lib/rake/funnel/support/specs_remover.rb +66 -62
  50. data/lib/rake/funnel/support/template_engine.rb +30 -26
  51. data/lib/rake/funnel/support/timing/report.rb +95 -89
  52. data/lib/rake/funnel/support/timing/statistics.rb +32 -26
  53. data/lib/rake/funnel/support/timing.rb +3 -3
  54. data/lib/rake/funnel/support/version_info.rb +103 -72
  55. data/lib/rake/funnel/support/which.rb +19 -15
  56. data/lib/rake/funnel/support/zipper.rb +53 -49
  57. data/lib/rake/funnel/tasks/assembly_version.rb +44 -40
  58. data/lib/rake/funnel/tasks/bin_path.rb +45 -41
  59. data/lib/rake/funnel/tasks/copy.rb +43 -39
  60. data/lib/rake/funnel/tasks/environments.rb +89 -89
  61. data/lib/rake/funnel/tasks/msbuild.rb +55 -51
  62. data/lib/rake/funnel/tasks/msdeploy.rb +54 -50
  63. data/lib/rake/funnel/tasks/nunit.rb +52 -48
  64. data/lib/rake/funnel/tasks/paket.rb +51 -47
  65. data/lib/rake/funnel/tasks/quick_template.rb +53 -49
  66. data/lib/rake/funnel/tasks/side_by_side_specs.rb +41 -37
  67. data/lib/rake/funnel/tasks/timing.rb +108 -104
  68. data/lib/rake/funnel/tasks/zip.rb +46 -42
  69. data/lib/rake/funnel/version.rb +1 -1
  70. data/lib/rake/funnel.rb +7 -7
  71. data/rake-funnel.gemspec +12 -3
  72. data/spec/rake/funnel/execution_error_spec.rb +67 -67
  73. data/spec/rake/funnel/extensions/case/camel_case_spec.rb +17 -17
  74. data/spec/rake/funnel/extensions/case/pascal_case_spec.rb +17 -17
  75. data/spec/rake/funnel/extensions/common_path_spec.rb +56 -56
  76. data/spec/rake/funnel/extensions/disable_colors_spec.rb +33 -33
  77. data/spec/rake/funnel/extensions/rexml_spec.rb +20 -20
  78. data/spec/rake/funnel/extensions/shell_spec.rb +237 -237
  79. data/spec/rake/funnel/extensions/windows_path_spec.rb +5 -5
  80. data/spec/rake/funnel/integration/progress_report_spec.rb +149 -149
  81. data/spec/rake/funnel/integration/sync_output_spec.rb +16 -16
  82. data/spec/rake/funnel/integration/teamcity/nunit_plugin_spec.rb +110 -110
  83. data/spec/rake/funnel/integration/teamcity/progress_report_spec.rb +174 -174
  84. data/spec/rake/funnel/integration/teamcity/service_messages_spec.rb +136 -136
  85. data/spec/rake/funnel/integration/teamcity/teamcity_spec.rb +34 -34
  86. data/spec/rake/funnel/support/argument_mapper/styles/msdeploy_spec.rb +222 -222
  87. data/spec/rake/funnel/support/argument_mapper/styles/nunit_spec.rb +25 -25
  88. data/spec/rake/funnel/support/argument_mapper/styles/styles_spec.rb +214 -214
  89. data/spec/rake/funnel/support/assembly_version/from_version_files_spec.rb +66 -61
  90. data/spec/rake/funnel/support/assembly_version_writer_spec.rb +140 -140
  91. data/spec/rake/funnel/support/binary_version_reader_spec.rb +29 -29
  92. data/spec/rake/funnel/support/copier_spec.rb +58 -58
  93. data/spec/rake/funnel/support/environments/loader_spec.rb +143 -143
  94. data/spec/rake/funnel/support/internal/finder_spec.rb +229 -229
  95. data/spec/rake/funnel/support/internal/instantiate_symbol_spec.rb +182 -183
  96. data/spec/rake/funnel/support/mapper_spec.rb +87 -87
  97. data/spec/rake/funnel/support/mono_spec.rb +57 -57
  98. data/spec/rake/funnel/support/msbuild/build_tool_spec.rb +21 -21
  99. data/spec/rake/funnel/support/msdeploy/registry_patch_spec.rb +139 -139
  100. data/spec/rake/funnel/support/patch_spec.rb +108 -108
  101. data/spec/rake/funnel/support/specs_remover/Sample.csproj +28 -28
  102. data/spec/rake/funnel/support/specs_remover_spec.rb +116 -116
  103. data/spec/rake/funnel/support/template_engine_spec.rb +65 -65
  104. data/spec/rake/funnel/support/timing/report_spec.rb +129 -129
  105. data/spec/rake/funnel/support/version_info_spec.rb +333 -228
  106. data/spec/rake/funnel/support/which_spec.rb +65 -65
  107. data/spec/rake/funnel/support/zipper_spec.rb +77 -77
  108. data/spec/rake/funnel/tasks/assembly_version_spec.rb +45 -45
  109. data/spec/rake/funnel/tasks/bin_path_spec.rb +52 -52
  110. data/spec/rake/funnel/tasks/copy_spec.rb +44 -44
  111. data/spec/rake/funnel/tasks/environments_spec.rb +249 -247
  112. data/spec/rake/funnel/tasks/msbuild_spec.rb +91 -91
  113. data/spec/rake/funnel/tasks/msdeploy_spec.rb +220 -220
  114. data/spec/rake/funnel/tasks/nunit_spec.rb +74 -74
  115. data/spec/rake/funnel/tasks/paket_spec.rb +140 -142
  116. data/spec/rake/funnel/tasks/quick_template_spec.rb +62 -62
  117. data/spec/rake/funnel/tasks/side_by_side_specs_spec.rb +58 -58
  118. data/spec/rake/funnel/tasks/timing_spec.rb +133 -133
  119. data/spec/rake/funnel/tasks/zip_spec.rb +50 -50
  120. data/spec/spec_helper.rb +43 -33
  121. metadata +2 -3
  122. data/lib/rake/funnel/support/side_by_side_specs.rb +0 -3
@@ -1,228 +1,333 @@
1
- require 'ostruct'
2
- require 'tmpdir'
3
-
4
- describe Rake::Funnel::Support::VersionInfo do
5
- describe '#parse' do
6
- [
7
- {
8
- context: {
9
- version: '1.2',
10
- build_number: '42',
11
- sha: 'sha'
12
- },
13
- expected: {
14
- assembly_version: '1.2',
15
- assembly_file_version: '1.2.42',
16
- assembly_informational_version: '1.2.42-sha'
17
- }
18
- },
19
- {
20
- context: {
21
- version: '1.2-pre1',
22
- build_number: '42',
23
- sha: 'sha'
24
- },
25
- expected: {
26
- assembly_version: '1.2',
27
- assembly_file_version: '1.2.42',
28
- assembly_informational_version: '1.2-pre1.42-sha'
29
- }
30
- },
31
- {
32
- context: {
33
- version: '1.2.3',
34
- build_number: '42',
35
- sha: 'sha' },
36
- expected: {
37
- assembly_version: '1.2.3',
38
- assembly_file_version: '1.2.3.42',
39
- assembly_informational_version: '1.2.3.42-sha'
40
- }
41
- },
42
- {
43
- context: {
44
- version: '1.2.3-pre1',
45
- build_number: '42',
46
- sha: 'sha'
47
- },
48
- expected: {
49
- assembly_version: '1.2.3',
50
- assembly_file_version: '1.2.3.42',
51
- assembly_informational_version: '1.2.3-pre1.42-sha'
52
- }
53
- },
54
- {
55
- context: {
56
- version: '1.2',
57
- build_number: '-pre',
58
- sha: 'sha'
59
- },
60
- expected: {
61
- assembly_version: '1.2',
62
- assembly_file_version: '1.2',
63
- assembly_informational_version: '1.2-pre-sha'
64
- }
65
- },
66
- {
67
- context: {
68
- version: '1.2',
69
- build_number: '-pre42',
70
- sha: 'sha'
71
- },
72
- expected: {
73
- assembly_version: '1.2',
74
- assembly_file_version: '1.2.42',
75
- assembly_informational_version: '1.2-pre42-sha'
76
- }
77
- },
78
- {
79
- context: {
80
- version: '1.2',
81
- build_number: nil,
82
- sha: nil
83
- },
84
- expected: {
85
- assembly_version: '1.2',
86
- assembly_file_version: '1.2',
87
- assembly_informational_version: '1.2'
88
- }
89
- },
90
- {
91
- context: {
92
- version: '1.2',
93
- build_number: '42',
94
- sha: nil
95
- },
96
- expected: {
97
- assembly_version: '1.2',
98
- assembly_file_version: '1.2.42',
99
- assembly_informational_version: '1.2.42'
100
- }
101
- },
102
- {
103
- context: {
104
- version: 1,
105
- build_number: '42',
106
- sha: 'sha'
107
- },
108
- expected: {
109
- assembly_version: '1',
110
- assembly_file_version: '1.42',
111
- assembly_informational_version: '1.42-sha'
112
- }
113
- },
114
- {
115
- context: {
116
- version: '1.2',
117
- build_number: 42,
118
- sha: 'sha'
119
- },
120
- expected: {
121
- assembly_version: '1.2',
122
- assembly_file_version: '1.2.42',
123
- assembly_informational_version: '1.2.42-sha'
124
- }
125
- },
126
- {
127
- context: {
128
- version: '1.2'
129
- },
130
- expected: {
131
- assembly_version: '1.2',
132
- assembly_file_version: '1.2',
133
- assembly_informational_version: '1.2'
134
- }
135
- },
136
- {
137
- context: {
138
- version: nil,
139
- build_number: nil,
140
- sha: nil
141
- },
142
- expected: {
143
- assembly_version: '0',
144
- assembly_file_version: '0',
145
- assembly_informational_version: '0'
146
- }
147
- },
148
- {
149
- context: {},
150
- expected: {
151
- assembly_version: '0',
152
- assembly_file_version: '0',
153
- assembly_informational_version: '0'
154
- }
155
- }
156
- ].each do |spec|
157
- context "version #{spec[:context][:version] || 'none'}, build number #{spec[:context][:build_number] || 'none'}, SHA #{spec[:context][:sha] || 'none'}" do
158
- let(:parsed) { described_class.parse(spec[:context]) }
159
-
160
- it "should generate assembly version #{spec[:expected][:assembly_version]}" do
161
- expect(parsed.assembly_version).to eq(spec[:expected][:assembly_version])
162
- end
163
-
164
- it "should generate assembly file version #{spec[:expected][:assembly_file_version]}" do
165
- expect(parsed.assembly_file_version).to eq(spec[:expected][:assembly_file_version])
166
- end
167
-
168
- it "should generate assembly informational version #{spec[:expected][:assembly_informational_version]}" do
169
- expect(parsed.assembly_informational_version).to eq(spec[:expected][:assembly_informational_version])
170
- end
171
- end
172
- end
173
- end
174
-
175
- describe 'enumerable' do
176
- it { is_expected.to be_kind_of(Enumerable) }
177
- it { is_expected.to respond_to(:each) }
178
-
179
- it 'should yield enumerator' do
180
- expect(subject.each).to be_kind_of(Enumerator)
181
- end
182
-
183
- context 'enumerating' do
184
- let(:args) { { a: 42, b: 23 } }
185
-
186
- subject { described_class.new(args) }
187
-
188
- it 'should yield all hash pairs' do
189
- expect { |b| subject.each(&b) }.to yield_successive_args([:a, 42], [:b, 23])
190
- end
191
- end
192
- end
193
-
194
- describe 'automatic methods' do
195
- it 'should be an OpenStruct' do
196
- expect(described_class < OpenStruct).to eq(true)
197
- end
198
-
199
- describe 'immutability' do
200
- let(:args) { { a: 42 } }
201
-
202
- subject { described_class.new(args) }
203
-
204
- it 'should be immutable' do
205
- expect { subject.a = 23 }.to raise_error
206
- end
207
- end
208
- end
209
-
210
- describe '#read_version_from' do
211
- let(:file) { 'file with version info' }
212
- let(:contents) { <<-EOF
213
- first line with expected version number
214
- other crap
215
- EOF
216
- }
217
-
218
- it 'should read the first line with leading and trailing whitespace removed' do
219
- Dir.mktmpdir do |tmp|
220
- Dir.chdir(tmp) do
221
-
222
- File.write(file, contents)
223
- expect(described_class.read_version_from(file)).to eq('first line with expected version number')
224
- end
225
- end
226
- end
227
- end
228
- end
1
+ require 'ostruct'
2
+ require 'tmpdir'
3
+
4
+ describe Rake::Funnel::Support::VersionInfo do
5
+ describe '#parse' do
6
+ [
7
+ {
8
+ context: {
9
+ version: '1',
10
+ metadata: {
11
+ pre: 'alpha',
12
+ build: '42',
13
+ sha: '123'
14
+ }
15
+ },
16
+ expected: {
17
+ assembly_version: '1.0.0.0',
18
+ assembly_file_version: '1.0.0.42',
19
+ assembly_informational_version: '1.0.0-alpha+build.42.sha.123'
20
+ }
21
+ },
22
+ {
23
+ context: {
24
+ version: '1.2',
25
+ metadata: {
26
+ pre: 'alpha',
27
+ build: '42',
28
+ sha: '123'
29
+ }
30
+ },
31
+ expected: {
32
+ assembly_version: '1.2.0.0',
33
+ assembly_file_version: '1.2.0.42',
34
+ assembly_informational_version: '1.2.0-alpha+build.42.sha.123'
35
+ }
36
+ },
37
+ {
38
+ context: {
39
+ version: '1.2.3',
40
+ metadata: {
41
+ pre: 'alpha',
42
+ build: '42',
43
+ sha: '123'
44
+ }
45
+ },
46
+ expected: {
47
+ assembly_version: '1.2.3.0',
48
+ assembly_file_version: '1.2.3.42',
49
+ assembly_informational_version: '1.2.3-alpha+build.42.sha.123'
50
+ }
51
+ },
52
+ {
53
+ context: {
54
+ version: '1.2.3.4',
55
+ metadata: {
56
+ pre: 'alpha',
57
+ build: '42',
58
+ sha: '123'
59
+ }
60
+ },
61
+ expected: {
62
+ assembly_version: '1.2.3.4',
63
+ assembly_file_version: '1.2.3.4',
64
+ assembly_informational_version: '1.2.3-alpha+build.42.sha.123'
65
+ }
66
+ },
67
+ {
68
+ context: {
69
+ version: '-pre1',
70
+ metadata: {
71
+ pre: 'alpha',
72
+ build: '42',
73
+ sha: '123'
74
+ }
75
+ },
76
+ expected: {
77
+ assembly_version: '0.0.0.0',
78
+ assembly_file_version: '0.0.0.42',
79
+ assembly_informational_version: '0.0.0-pre1-alpha+build.42.sha.123'
80
+ }
81
+ },
82
+ {
83
+ context: {
84
+ version: '1-pre1',
85
+ metadata: {
86
+ pre: 'alpha',
87
+ build: '42',
88
+ sha: '123'
89
+ }
90
+ },
91
+ expected: {
92
+ assembly_version: '1.0.0.0',
93
+ assembly_file_version: '1.0.0.42',
94
+ assembly_informational_version: '1.0.0-pre1-alpha+build.42.sha.123'
95
+ }
96
+ },
97
+ {
98
+ context: {
99
+ version: '1.2-pre1',
100
+ metadata: {
101
+ pre: 'alpha',
102
+ build: '42',
103
+ sha: '123'
104
+ }
105
+ },
106
+ expected: {
107
+ assembly_version: '1.2.0.0',
108
+ assembly_file_version: '1.2.0.42',
109
+ assembly_informational_version: '1.2.0-pre1-alpha+build.42.sha.123'
110
+ }
111
+ },
112
+ {
113
+ context: {
114
+ version: '1.2.3-pre1',
115
+ metadata: {
116
+ pre: 'alpha',
117
+ build: '42',
118
+ sha: '123'
119
+ }
120
+ },
121
+ expected: {
122
+ assembly_version: '1.2.3.0',
123
+ assembly_file_version: '1.2.3.42',
124
+ assembly_informational_version: '1.2.3-pre1-alpha+build.42.sha.123'
125
+ }
126
+ },
127
+ {
128
+ context: {
129
+ version: '1.2.3.4-pre1',
130
+ metadata: {
131
+ pre: 'alpha',
132
+ build: '42',
133
+ sha: '123'
134
+ }
135
+ },
136
+ expected: {
137
+ assembly_version: '1.2.3.4',
138
+ assembly_file_version: '1.2.3.4',
139
+ assembly_informational_version: '1.2.3-pre1-alpha+build.42.sha.123'
140
+ }
141
+ },
142
+ {
143
+ context: {},
144
+ expected: {
145
+ assembly_version: '0.0.0.0',
146
+ assembly_file_version: '0.0.0.0',
147
+ assembly_informational_version: '0.0.0'
148
+ }
149
+ },
150
+ {
151
+ context: {
152
+ metadata: {}
153
+ },
154
+ expected: {
155
+ assembly_version: '0.0.0.0',
156
+ assembly_file_version: '0.0.0.0',
157
+ assembly_informational_version: '0.0.0'
158
+ }
159
+ },
160
+ {
161
+ context: {
162
+ version: nil,
163
+ metadata: {
164
+ pre: nil,
165
+ build: nil,
166
+ sha: nil
167
+ }
168
+ },
169
+ expected: {
170
+ assembly_version: '0.0.0.0',
171
+ assembly_file_version: '0.0.0.0',
172
+ assembly_informational_version: '0.0.0'
173
+ }
174
+ },
175
+ {
176
+ context: {
177
+ version: '1.2',
178
+ metadata: { }
179
+ },
180
+ expected: {
181
+ assembly_version: '1.2.0.0',
182
+ assembly_file_version: '1.2.0.0',
183
+ assembly_informational_version: '1.2.0'
184
+ }
185
+ },
186
+ {
187
+ context: {
188
+ version: '1.2',
189
+ metadata: {
190
+ pre: nil,
191
+ build: nil,
192
+ sha: nil
193
+ }
194
+ },
195
+ expected: {
196
+ assembly_version: '1.2.0.0',
197
+ assembly_file_version: '1.2.0.0',
198
+ assembly_informational_version: '1.2.0'
199
+ }
200
+ },
201
+ {
202
+ context: {
203
+ version: '1.2',
204
+ metadata: {
205
+ pre: 'alpha',
206
+ build: nil,
207
+ sha: nil
208
+ }
209
+ },
210
+ expected: {
211
+ assembly_version: '1.2.0.0',
212
+ assembly_file_version: '1.2.0.0',
213
+ assembly_informational_version: '1.2.0-alpha'
214
+ }
215
+ },
216
+ {
217
+ context: {
218
+ version: '1.2',
219
+ metadata: {
220
+ pre: nil,
221
+ build: '42',
222
+ sha: nil
223
+ }
224
+ },
225
+ expected: {
226
+ assembly_version: '1.2.0.0',
227
+ assembly_file_version: '1.2.0.42',
228
+ assembly_informational_version: '1.2.0+build.42'
229
+ }
230
+ },
231
+ {
232
+ context: {
233
+ version: '1.2',
234
+ metadata: {
235
+ pre: nil,
236
+ build: nil,
237
+ sha: '123'
238
+ }
239
+ },
240
+ expected: {
241
+ assembly_version: '1.2.0.0',
242
+ assembly_file_version: '1.2.0.0',
243
+ assembly_informational_version: '1.2.0+sha.123'
244
+ }
245
+ },
246
+ {
247
+ context: {
248
+ version: 1,
249
+ metadata: {
250
+ pre: 123,
251
+ build: 456,
252
+ sha: 789
253
+ }
254
+ },
255
+ expected: {
256
+ assembly_version: '1.0.0.0',
257
+ assembly_file_version: '1.0.0.456',
258
+ assembly_informational_version: '1.0.0-123+build.456.sha.789'
259
+ }
260
+ }
261
+ ].each do |spec|
262
+ context "version #{spec[:context][:version] || 'none'}, build number #{spec[:context].fetch(:metadata, {})[:build] || 'none'}, SHA #{spec[:context].fetch(:metadata, {})[:sha] || 'none'}" do
263
+ let(:parsed) { described_class.parse(spec[:context]) }
264
+
265
+ it "should generate assembly version #{spec[:expected][:assembly_version]}" do
266
+ expect(parsed.assembly_version).to eq(spec[:expected][:assembly_version])
267
+ end
268
+
269
+ it "should generate assembly file version #{spec[:expected][:assembly_file_version]}" do
270
+ expect(parsed.assembly_file_version).to eq(spec[:expected][:assembly_file_version])
271
+ end
272
+
273
+ it "should generate assembly informational version #{spec[:expected][:assembly_informational_version]}" do
274
+ expect(parsed.assembly_informational_version).to eq(spec[:expected][:assembly_informational_version])
275
+ end
276
+ end
277
+ end
278
+ end
279
+
280
+ describe 'enumerable' do
281
+ it { is_expected.to be_kind_of(Enumerable) }
282
+ it { is_expected.to respond_to(:each) }
283
+
284
+ it 'should yield enumerator' do
285
+ expect(subject.each).to be_kind_of(Enumerator)
286
+ end
287
+
288
+ context 'enumerating' do
289
+ let(:args) { { a: 42, b: 23 } }
290
+
291
+ subject { described_class.new(args) }
292
+
293
+ it 'should yield all hash pairs' do
294
+ expect { |b| subject.each(&b) }.to yield_successive_args([:a, 42], [:b, 23])
295
+ end
296
+ end
297
+ end
298
+
299
+ describe 'automatic methods' do
300
+ it 'should be an OpenStruct' do
301
+ expect(described_class < OpenStruct).to eq(true)
302
+ end
303
+
304
+ describe 'immutability' do
305
+ let(:args) { { a: 42 } }
306
+
307
+ subject { described_class.new(args) }
308
+
309
+ it 'should be immutable' do
310
+ expect { subject.a = 23 }.to raise_error
311
+ end
312
+ end
313
+ end
314
+
315
+ describe '#read_version_from' do
316
+ let(:file) { 'file with version info' }
317
+ let(:contents) { <<-EOF
318
+ first line with expected version number
319
+ other crap
320
+ EOF
321
+ }
322
+
323
+ it 'should read the first line with leading and trailing whitespace removed' do
324
+ Dir.mktmpdir do |tmp|
325
+ Dir.chdir(tmp) do
326
+
327
+ File.write(file, contents)
328
+ expect(described_class.read_version_from(file)).to eq('first line with expected version number')
329
+ end
330
+ end
331
+ end
332
+ end
333
+ end