cukedep 0.1.11 → 0.2.00

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +6 -14
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +10 -10
  4. data/CHANGELOG.md +6 -0
  5. data/Gemfile +5 -5
  6. data/LICENSE.txt +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +30 -30
  9. data/bin/cukedep +15 -15
  10. data/lib/cukedep/application.rb +105 -112
  11. data/lib/cukedep/cli/cmd-line.rb +11 -13
  12. data/lib/cukedep/config.rb +85 -89
  13. data/lib/cukedep/constants.rb +5 -5
  14. data/lib/cukedep/cuke-runner.rb +191 -198
  15. data/lib/cukedep/customization.rb +30 -30
  16. data/lib/cukedep/feature-model.rb +43 -46
  17. data/lib/cukedep/feature-rep.rb +9 -11
  18. data/lib/cukedep/file-action.rb +11 -18
  19. data/lib/cukedep/gherkin-facade.rb +11 -6
  20. data/lib/cukedep/gherkin-listener.rb +12 -42
  21. data/lib/cukedep/hook-dsl.rb +78 -78
  22. data/lib/cukedep/sandbox.rb +15 -16
  23. data/lib/cukedep.rb +1 -2
  24. data/sample/features/step_definitions/steps.rb +2 -2
  25. data/sample/model/model.rb +19 -20
  26. data/spec/cukedep/application_spec.rb +80 -80
  27. data/spec/cukedep/cli/cmd-line_spec.rb +88 -88
  28. data/spec/cukedep/cuke-runner_spec.rb +74 -74
  29. data/spec/cukedep/customization_spec.rb +31 -31
  30. data/spec/cukedep/debug-file-action.rb +29 -29
  31. data/spec/cukedep/feature-model_spec.rb +100 -100
  32. data/spec/cukedep/feature-rep_spec.rb +2 -1
  33. data/spec/cukedep/file-action_spec.rb +365 -366
  34. data/spec/cukedep/file-parsing.rb +39 -41
  35. data/spec/cukedep/gherkin-facade_spec.rb +48 -49
  36. data/spec/cukedep/gherkin-listener_spec.rb +55 -57
  37. data/spec/cukedep/hook-dsl_spec.rb +182 -182
  38. data/spec/cukedep/sample_features/cukedep_hooks.rb +30 -30
  39. data/spec/cukedep/sample_features/standalone.feature +1 -1
  40. data/templates/rake.erb +12 -21
  41. metadata +80 -58
  42. data/sample/result.html +0 -472
  43. data/spec/cukedep/sample_features/cukedep.rake +0 -215
  44. data/spec/cukedep/sample_features/dependencies.dot +0 -38
  45. data/spec/cukedep/sample_features/feature2id.csv +0 -7
@@ -1,78 +1,78 @@
1
- # File: hook-dsl.rb
2
-
3
-
4
- module Cukedep # Module used as a namespace
5
- # Mix-in module that defines the DSL (Domain-Specific Language)
6
- # for specifying Cukedep hooks.
7
- # A hook is a custom code block that is executed when
8
- # a pre-defined Cukedep event occurs.
9
- module HookDSL
10
- ValidHookScopes = [:all, :each]
11
-
12
- attr_reader(:before_hooks)
13
- attr_reader(:after_hooks)
14
-
15
-
16
- # This method registers the code block to execute
17
- # before a Cucumber invocation.
18
- def before_cuke(aScope, &aBlock)
19
- kind = :before
20
- scope = validated_scope(kind, aScope)
21
- register_hook(kind, scope, aBlock) if block_given?
22
- end
23
-
24
- # This method registers the code block to execute
25
- # before a Cucumber invocation.
26
- def after_cuke(aScope, &aBlock)
27
- kind = :after
28
- scope = validated_scope(kind, aScope)
29
- register_hook(kind, scope, aBlock) if block_given?
30
- end
31
-
32
- =begin
33
- # Execute the specific hook.
34
- def execute_hook(aKind, aScope)
35
- scope = validated_scope(aKind, aScope)
36
- case [aKind, scope]
37
- when [:before, :all], [:before, :each], [:after, :each], [:after, :all]
38
- handler = handler_for(aKind, scope)
39
- else
40
- raise StandardError, "Unknown Cukedep hook #{aKind}, #{aScope}"
41
- end
42
-
43
- handler.call unless handler.nil?
44
- end
45
- =end
46
-
47
- private
48
-
49
- def register_hook(aKind, aScope, aBlock)
50
- scope = validated_scope(aKind, aScope)
51
-
52
- ivar = "@#{aKind}_hooks".to_sym
53
- instance_variable_set(ivar, {}) if instance_variable_get(ivar).nil?
54
- instance_variable_get(ivar)[scope] = aBlock
55
- end
56
-
57
- def validated_scope(aKind, aScope)
58
- unless ValidHookScopes.include?(aScope)
59
- msg = "Unknown scope '#{aScope}' for #{aKind}_cuke hook."
60
- fail StandardError, msg
61
- end
62
-
63
- return aScope
64
- end
65
-
66
- def handler_for(aKind, aScope)
67
- if aKind == :before
68
- hooks = before_hooks
69
- else
70
- hooks = after_hooks
71
- end
72
-
73
- handler = hooks.nil? ? nil : hooks.fetch(aScope)
74
- return handler
75
- end
76
- end # module
77
- end # module
78
- # End of file
1
+ # File: hook-dsl.rb
2
+
3
+
4
+ module Cukedep # Module used as a namespace
5
+ # Mix-in module that defines the DSL (Domain-Specific Language)
6
+ # for specifying Cukedep hooks.
7
+ # A hook is a custom code block that is executed when
8
+ # a pre-defined Cukedep event occurs.
9
+ module HookDSL
10
+ ValidHookScopes = %i[all each].freeze
11
+
12
+ attr_reader(:before_hooks)
13
+ attr_reader(:after_hooks)
14
+
15
+
16
+ # This method registers the code block to execute
17
+ # before a Cucumber invocation.
18
+ def before_cuke(aScope, &aBlock)
19
+ kind = :before
20
+ scope = validated_scope(kind, aScope)
21
+ register_hook(kind, scope, aBlock) if block_given?
22
+ end
23
+
24
+ # This method registers the code block to execute
25
+ # before a Cucumber invocation.
26
+ def after_cuke(aScope, &aBlock)
27
+ kind = :after
28
+ scope = validated_scope(kind, aScope)
29
+ register_hook(kind, scope, aBlock) if block_given?
30
+ end
31
+
32
+ =begin
33
+ # Execute the specific hook.
34
+ def execute_hook(aKind, aScope)
35
+ scope = validated_scope(aKind, aScope)
36
+ case [aKind, scope]
37
+ when [:before, :all], [:before, :each], [:after, :each], [:after, :all]
38
+ handler = handler_for(aKind, scope)
39
+ else
40
+ raise StandardError, "Unknown Cukedep hook #{aKind}, #{aScope}"
41
+ end
42
+
43
+ handler.call unless handler.nil?
44
+ end
45
+ =end
46
+
47
+ private
48
+
49
+ def register_hook(aKind, aScope, aBlock)
50
+ scope = validated_scope(aKind, aScope)
51
+
52
+ ivar = "@#{aKind}_hooks".to_sym
53
+ instance_variable_set(ivar, {}) if instance_variable_get(ivar).nil?
54
+ instance_variable_get(ivar)[scope] = aBlock
55
+ end
56
+
57
+ def validated_scope(aKind, aScope)
58
+ unless ValidHookScopes.include?(aScope)
59
+ msg = "Unknown scope '#{aScope}' for #{aKind}_cuke hook."
60
+ raise StandardError, msg
61
+ end
62
+
63
+ return aScope
64
+ end
65
+
66
+ def handler_for(aKind, aScope)
67
+ if aKind == :before
68
+ hooks = before_hooks
69
+ else
70
+ hooks = after_hooks
71
+ end
72
+
73
+ handler = hooks.nil? ? nil : hooks.fetch(aScope)
74
+ return handler
75
+ end
76
+ end # module
77
+ end # module
78
+ # End of file
@@ -1,16 +1,15 @@
1
- # File: sandbox.rb
2
-
3
-
4
- module Cukedep # This module is used as a namespace
5
- # A context in which hook block codes are run.
6
- class Sandbox
7
- attr_reader(:base_dir)
8
- attr_reader(:proj_dir)
9
-
10
- def initialize(theBaseDir, theProjectDir)
11
- @base_dir = theBaseDir.dup.freeze
12
- @proj_dir = theProjectDir.dup.freeze
13
- end
14
- end # class
15
- end # module
16
- # End of file
1
+ # File: sandbox.rb
2
+
3
+ module Cukedep # This module is used as a namespace
4
+ # A context in which hook block codes are run.
5
+ class Sandbox
6
+ attr_reader(:base_dir)
7
+ attr_reader(:proj_dir)
8
+
9
+ def initialize(theBaseDir, theProjectDir)
10
+ @base_dir = theBaseDir.dup.freeze
11
+ @proj_dir = theProjectDir.dup.freeze
12
+ end
13
+ end # class
14
+ end # module
15
+ # End of file
data/lib/cukedep.rb CHANGED
@@ -1,9 +1,8 @@
1
1
  # File: cukedep.rb
2
- # This file acts as a jumping-off point for loading dependencies expected
2
+ # This file acts as a jumping-off point for loading dependencies expected
3
3
  # for a Cukedep user.
4
4
 
5
5
  require_relative './cukedep/constants'
6
6
  require_relative './cukedep/application'
7
7
 
8
-
9
8
  # End of file
@@ -1,7 +1,7 @@
1
1
  # File: steps.rb
2
2
  # Step definitions for a sample Cucumber application
3
3
 
4
- def store()
4
+ def store
5
5
  $store
6
6
  end
7
7
 
@@ -30,7 +30,7 @@ When(/^I remove the video "(.*?)"$/) do |a_title|
30
30
  end
31
31
 
32
32
  Given(/^there is no member yet$/) do
33
- store.send(:zap_members!) # Why is this method seen as private?
33
+ store.send(:zap_members!) # Why is this method seen as private?
34
34
  end
35
35
 
36
36
  Then(/^I should see member "(.*?)" as unknown$/) do |member_name|
@@ -1,7 +1,7 @@
1
1
  # File: model.rb
2
2
 
3
3
  require 'pp'
4
- require 'yaml' # Rely on YAML for object persistence
4
+ require 'yaml' # Rely on YAML for object persistence
5
5
 
6
6
 
7
7
  # Module used as a namespace
@@ -22,7 +22,7 @@ module Sample
22
22
  # In our sample model, no rental history is performed
23
23
  Rental = Struct.new(
24
24
  :video, # Use the title of the rented video as key
25
- :member # Use the name of the Member as key
25
+ :member # Use the name of the Member as key
26
26
  )
27
27
 
28
28
  # The identification of a store rental employee
@@ -34,10 +34,10 @@ module Sample
34
34
  # Simplistic domain model of a video rental store.
35
35
  class RentalStore
36
36
  MyDir = File.dirname(__FILE__) + '/'
37
- CatalogueFile = 'catalogue.yml'
38
- MembersFile = 'members.yml'
39
- RentalsFile = 'rentals.yml'
40
- UsersFile = 'users.yml'
37
+ CatalogueFile = 'catalogue.yml'.freeze
38
+ MembersFile = 'members.yml'.freeze
39
+ RentalsFile = 'rentals.yml'.freeze
40
+ UsersFile = 'users.yml'.freeze
41
41
 
42
42
 
43
43
  # The list of all videos owned by the store.
@@ -52,28 +52,27 @@ module Sample
52
52
  # The list of application user (credentials)
53
53
  attr_reader(:users)
54
54
 
55
- def initialize()
55
+ def initialize
56
56
  init_catalogue
57
57
  init_members
58
58
  init_rentals
59
59
  init_users
60
60
  end
61
61
 
62
-
63
62
  # Clear the catalogue (= make it empty).
64
- def zap_catalogue!()
63
+ def zap_catalogue!
65
64
  catalogue.clear
66
65
  save_catalogue
67
66
  zap_rentals!
68
67
  end
69
68
 
70
- def zap_members!()
69
+ def zap_members!
71
70
  members.clear
72
71
  save_members
73
72
  zap_rentals!
74
73
  end
75
74
 
76
- def zap_users!()
75
+ def zap_users!
77
76
  users.clear
78
77
  save_users
79
78
  end
@@ -143,7 +142,7 @@ module Sample
143
142
 
144
143
  private
145
144
 
146
- def init_catalogue()
145
+ def init_catalogue
147
146
  filepath = MyDir + CatalogueFile
148
147
  if File.exist?(filepath)
149
148
  @catalogue = YAML.load_file(filepath)
@@ -152,7 +151,7 @@ module Sample
152
151
  end
153
152
  end
154
153
 
155
- def init_members()
154
+ def init_members
156
155
  filepath = MyDir + MembersFile
157
156
  if File.exist?(filepath)
158
157
  @members = YAML.load_file(filepath)
@@ -161,7 +160,7 @@ module Sample
161
160
  end
162
161
  end
163
162
 
164
- def init_users()
163
+ def init_users
165
164
  filepath = MyDir + UsersFile
166
165
  if File.exist?(filepath)
167
166
  @users = YAML.load_file(filepath)
@@ -170,7 +169,7 @@ module Sample
170
169
  end
171
170
  end
172
171
 
173
- def init_rentals()
172
+ def init_rentals
174
173
  filepath = MyDir + RentalsFile
175
174
  if File.exist?(filepath)
176
175
  @rentals = YAML.load_file(filepath)
@@ -179,27 +178,27 @@ module Sample
179
178
  end
180
179
  end
181
180
 
182
- def zap_rentals!()
181
+ def zap_rentals!
183
182
  rentals.clear
184
183
  save_rentals
185
184
  end
186
185
 
187
- def save_catalogue()
186
+ def save_catalogue
188
187
  filepath = MyDir + CatalogueFile
189
188
  File.open(filepath, 'w') { |f| YAML.dump(catalogue, f) }
190
189
  end
191
190
 
192
- def save_members()
191
+ def save_members
193
192
  filepath = MyDir + MembersFile
194
193
  File.open(filepath, 'w') { |f| YAML.dump(members, f) }
195
194
  end
196
195
 
197
- def save_users()
196
+ def save_users
198
197
  filepath = MyDir + UsersFile
199
198
  File.open(filepath, 'w') { |f| YAML.dump(users, f) }
200
199
  end
201
200
 
202
- def save_rentals()
201
+ def save_rentals
203
202
  filepath = MyDir + RentalsFile
204
203
  File.open(filepath, 'w') { |f| YAML.dump(rentals, f) }
205
204
  end
@@ -1,80 +1,80 @@
1
- # File: cmd-line_spec.rb
2
-
3
- require 'stringio'
4
- require 'English'
5
- require_relative '../spec_helper'
6
-
7
- # Load the class under testing
8
- require_relative '../../lib/cukedep/application'
9
-
10
- module Cukedep # Open module to get rid of long qualified names
11
- describe Application do
12
- context 'Creation & initialization:' do
13
- it 'should be created without argument' do
14
- expect { Application.new }.not_to raise_error
15
- end
16
- end # context
17
-
18
- context 'Provided services:' do
19
- subject { Application.new }
20
-
21
- it 'should read its command-line' do
22
- options = subject.send(:options_from, [])
23
- expect(options).to be_empty
24
- end
25
-
26
- it 'should generate a user settings file' do
27
- # Start state: no config
28
- File.delete(Cukedep::YMLFilename) if File.exist?(Cukedep::YMLFilename)
29
-
30
- # --setup option creates the config file then stops the application
31
- expect { subject.run!(['--setup']) }.to raise_error(SystemExit)
32
-
33
- # Check that the config file was effectively created.
34
- expect(File.exist?(Cukedep::YMLFilename)).to be true
35
- created_config = Config.load_cfg(Cukedep::YMLFilename)
36
- expect(created_config).to eq(Config.default)
37
-
38
- # Re-run again with --setup option.
39
- # It should ask permission for overwriting
40
- # Capture console IO
41
- old_stdout = $DEFAULT_OUTPUT
42
- ostream = StringIO.new('rw')
43
- $DEFAULT_OUTPUT = ostream
44
- old_stdin = $stdin
45
- $stdin = StringIO.new("n\n", 'r')
46
- expect { subject.run!(['--setup']) }.to raise_error(SystemExit)
47
- $DEFAULT_OUTPUT = old_stdout
48
- $stdin = old_stdin
49
- end
50
-
51
- it 'should complain in absence of project dir' do
52
- # Start state: no config
53
- File.delete(Cukedep::YMLFilename) if File.exist?(Cukedep::YMLFilename)
54
- expect(File.exist?(Cukedep::YMLFilename)).to be_falsey
55
-
56
- # Create default config
57
- expect { subject.run!(['--setup']) }.to raise_error(SystemExit)
58
-
59
- err = StandardError
60
- err_msg1 = "No project dir specified in '.cukedep.yml'"
61
- err_msg2 = ' nor via --project option.'
62
- expect { subject.run!([]) }.to raise_error(err, err_msg1 + err_msg2)
63
- end
64
-
65
- it 'should parse the feature files' do
66
- curr_dir = Dir.getwd
67
- begin
68
- file_dir = File.dirname(__FILE__)
69
- Dir.chdir(file_dir + '/sample_features')
70
- unless File.exist?(Cukedep::YMLFilename)
71
- expect { subject.run!(['--setup']) }.to raise_error(SystemExit)
72
- end
73
- subject.run!(['--project', '../../../sample'])
74
- ensure
75
- Dir.chdir(curr_dir)
76
- end
77
- end
78
- end # context
79
- end # describe
80
- end # module
1
+ # File: cmd-line_spec.rb
2
+
3
+ require 'stringio'
4
+ require 'English'
5
+ require_relative '../spec_helper'
6
+
7
+ # Load the class under testing
8
+ require_relative '../../lib/cukedep/application'
9
+
10
+ module Cukedep # Open module to get rid of long qualified names
11
+ describe Application do
12
+ context 'Creation & initialization:' do
13
+ it 'should be created without argument' do
14
+ expect { Application.new }.not_to raise_error
15
+ end
16
+ end # context
17
+
18
+ context 'Provided services:' do
19
+ subject { Application.new }
20
+
21
+ it 'should read its command-line' do
22
+ options = subject.send(:options_from, [])
23
+ expect(options).to be_empty
24
+ end
25
+
26
+ it 'should generate a user settings file' do
27
+ # Start state: no config
28
+ File.delete(Cukedep::YMLFilename) if File.exist?(Cukedep::YMLFilename)
29
+
30
+ # --setup option creates the config file then stops the application
31
+ expect { subject.run!(['--setup']) }.to raise_error(SystemExit)
32
+
33
+ # Check that the config file was effectively created.
34
+ expect(File.exist?(Cukedep::YMLFilename)).to be true
35
+ created_config = Config.load_cfg(Cukedep::YMLFilename)
36
+ expect(created_config).to eq(Config.default)
37
+
38
+ # Re-run again with --setup option.
39
+ # It should ask permission for overwriting
40
+ # Capture console IO
41
+ old_stdout = $DEFAULT_OUTPUT
42
+ ostream = StringIO.new('rw')
43
+ $DEFAULT_OUTPUT = ostream
44
+ old_stdin = $stdin
45
+ $stdin = StringIO.new("n\n", 'r')
46
+ expect { subject.run!(['--setup']) }.to raise_error(SystemExit)
47
+ $DEFAULT_OUTPUT = old_stdout
48
+ $stdin = old_stdin
49
+ end
50
+
51
+ it 'should complain in absence of project dir' do
52
+ # Start state: no config
53
+ File.delete(Cukedep::YMLFilename) if File.exist?(Cukedep::YMLFilename)
54
+ expect(File.exist?(Cukedep::YMLFilename)).to be_falsey
55
+
56
+ # Create default config
57
+ expect { subject.run!(['--setup']) }.to raise_error(SystemExit)
58
+
59
+ err = StandardError
60
+ err_msg1 = "No project dir specified in '.cukedep.yml'"
61
+ err_msg2 = ' nor via --project option.'
62
+ expect { subject.run!([]) }.to raise_error(err, err_msg1 + err_msg2)
63
+ end
64
+
65
+ it 'should parse the feature files' do
66
+ curr_dir = Dir.getwd
67
+ begin
68
+ file_dir = File.dirname(__FILE__)
69
+ Dir.chdir(file_dir + '/sample_features')
70
+ unless File.exist?(Cukedep::YMLFilename)
71
+ expect { subject.run!(['--setup']) }.to raise_error(SystemExit)
72
+ end
73
+ subject.run!(['--project', '../../../sample'])
74
+ ensure
75
+ Dir.chdir(curr_dir)
76
+ end
77
+ end
78
+ end # context
79
+ end # describe
80
+ end # module