macros4cuke 0.4.09 → 0.5.03

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 (40) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +2 -2
  3. data/CHANGELOG.md +17 -0
  4. data/README.md +41 -22
  5. data/bin/macros4cuke +15 -0
  6. data/examples/demo/features/support/use_macros4cuke.rb +12 -0
  7. data/examples/i18n/fr/features/demo01-fr.feature +13 -0
  8. data/examples/i18n/fr/features/step_definitions/demo_steps.rb +5 -0
  9. data/examples/i18n/fr/features/step_definitions/{use_macro_steps.rb → macro_steps_fr.rb} +3 -2
  10. data/examples/i18n/fr/features/support/use_macros4cuke.rb +12 -0
  11. data/examples/i18n/nl/cucumber.yml +6 -0
  12. data/examples/i18n/nl/features/demo01-nl.feature +40 -0
  13. data/examples/i18n/nl/features/step_definitions/demo_steps.rb +21 -0
  14. data/examples/i18n/nl/features/step_definitions/macro_steps_nl.rb +31 -0
  15. data/examples/i18n/nl/features/support/use_macros4cuke.rb +12 -0
  16. data/features/support/use_macros4cuke.rb +11 -0
  17. data/lib/macros4cuke.rb +1 -0
  18. data/lib/macros4cuke/application.rb +75 -0
  19. data/lib/macros4cuke/cli/cmd-line.rb +142 -0
  20. data/lib/macros4cuke/constants.rb +2 -2
  21. data/lib/macros4cuke/cucumber.rb +16 -0
  22. data/lib/macros4cuke/exceptions.rb +25 -1
  23. data/lib/macros4cuke/templating/comment.rb +43 -0
  24. data/lib/macros4cuke/templating/eo-line.rb +30 -0
  25. data/lib/macros4cuke/templating/static-text.rb +40 -0
  26. data/lib/macros4cuke/templating/template-element.rb +7 -88
  27. data/spec/macros4cuke/application_spec.rb +117 -0
  28. data/spec/macros4cuke/cli/cmd-line_spec.rb +223 -0
  29. data/spec/macros4cuke/macro-collection_spec.rb +1 -1
  30. data/spec/macros4cuke/macro-step-support_spec.rb +1 -1
  31. data/spec/macros4cuke/templating/comment_spec.rb +1 -1
  32. data/spec/macros4cuke/templating/eo-line_spec.rb +2 -2
  33. data/spec/macros4cuke/templating/static_text_spec.rb +1 -1
  34. data/templates/use_macros4cuke.erb +12 -0
  35. metadata +35 -19
  36. data/examples/demo/features/step_definitions/use_macro_steps.rb +0 -10
  37. data/examples/demo/features/support/macro_support.rb +0 -16
  38. data/examples/i18n/fr/features/support/macro_support.rb +0 -17
  39. data/features/step_definitions/use_macro_steps.rb +0 -10
  40. data/features/support/macro_support.rb +0 -16
@@ -0,0 +1,142 @@
1
+ # File: cli.rb
2
+
3
+ # Access the OptionParser library from the standard Ruby library
4
+ require 'optparse'
5
+ require 'pathname'
6
+
7
+ require 'cucumber/platform'
8
+ require_relative '../constants'
9
+
10
+ module Macros4Cuke # Module used as a namespace
11
+
12
+ # Module dedicated to the command-line interface
13
+ module CLI
14
+
15
+
16
+ # Manages the application command-line interface (CLI).
17
+ # It is merely a thin wrapper around the OptionParser library.
18
+ # Responsibilities:
19
+ #- Specify the command-line syntax,
20
+ #- Return the result of the command-line parsing
21
+ # Examples of command lines:
22
+ # --setup PROJ_PATH
23
+ # --suggest
24
+ class CmdLine
25
+ ShortHelpMsg = <<-END_MSG
26
+ For help about the command-line syntax, do:
27
+ macros4cuke --help
28
+ END_MSG
29
+
30
+ # A Hash with the result of the command-line parse.
31
+ attr_reader(:options)
32
+
33
+ # OptionParser object
34
+ attr_reader(:parser)
35
+
36
+ # Constructor.
37
+ def initialize()
38
+ @options = {}
39
+
40
+ @parser = OptionParser.new do |opts|
41
+ opts.banner = <<-EOS
42
+ Usage: macros4cuke [options]
43
+ The command-line options are:
44
+ EOS
45
+ # Mandatory argument
46
+ msg_p1 = 'Make the Cucumber project at given path '
47
+ msg_p2 = 'ready for macro-steps.'
48
+ opts.on('--setup PROJECT_PATH', msg_p1 + msg_p2) do |project_path|
49
+ valid_path = validated_feature_path(project_path)
50
+ options[:setup] ||= []
51
+ options[:setup] << valid_path
52
+ end
53
+
54
+ # No argument, shows at tail. This will print an options summary.
55
+ opts.on_tail('-h', '--help', 'Show this message') do
56
+ # puts opts
57
+ options[:help] = true
58
+ end
59
+
60
+ opts.on_tail('-v', '--version', 'Display version number.') do
61
+ puts Macros4Cuke::Version
62
+ options[:version] = true
63
+ end
64
+
65
+ version_verbose_msg = 'Display gem and platform version numbers.'
66
+ opts.on_tail('-V', '--version-verbose', version_verbose_msg) do
67
+ cuke = "Cucumber #{Cucumber::VERSION}"
68
+ ruby = "Ruby #{RUBY_VERSION} #{RUBY_PLATFORM}"
69
+ msg = "#{Macros4Cuke::Version} (using #{cuke}, running on #{ruby})"
70
+ puts msg
71
+ options[:version] = true
72
+ end
73
+
74
+ end
75
+ end
76
+
77
+ public
78
+
79
+ # Perform the command-line parsing
80
+ def parse!(theCmdLineArgs)
81
+ begin
82
+ parser.parse!(theCmdLineArgs.dup)
83
+ rescue Macros4Cuke::CmdLineError => exc
84
+ $stderr.puts exc.message
85
+ exit
86
+
87
+ rescue OptionParser::InvalidOption => exc
88
+ $stderr.puts exc.message
89
+ exit
90
+
91
+ rescue OptionParser::MissingArgument => exc
92
+ err_msg = ''
93
+ exc.args.each do |arg|
94
+ err_msg << "No argument provided with command line option: #{arg}\n"
95
+ end
96
+ $stderr.puts err_msg
97
+ exit
98
+ end
99
+
100
+ # When no option provided then display minimalistic help info
101
+ short_help if options.empty?
102
+
103
+ show_help if options[:help]
104
+
105
+ # Some options stop the application
106
+ exit if options[:version] || options[:help]
107
+
108
+ return options
109
+ end
110
+
111
+ private
112
+
113
+ # Given the project path, retrieve its /features dir.
114
+ def validated_feature_path(theProjectPath)
115
+ dirs = [theProjectPath, 'features', 'support']
116
+ feature_path = dirs.reduce(Pathname.getwd) do |path, dir_name|
117
+ path = path + dir_name
118
+ unless path.exist?
119
+ fail DirectoryNotFound.new(path.relative_path_from(Pathname.getwd))
120
+ end
121
+ path
122
+ end
123
+
124
+ return feature_path
125
+ end
126
+
127
+ def show_help()
128
+ puts parser.help
129
+ end
130
+
131
+ def short_help()
132
+ puts ShortHelpMsg
133
+ exit
134
+ end
135
+
136
+ end # class
137
+
138
+ end # module
139
+
140
+ end # module
141
+
142
+ # End of file
@@ -3,10 +3,10 @@
3
3
 
4
4
  module Macros4Cuke # Module used as a namespace
5
5
  # The version number of the gem.
6
- Version = '0.4.09'
6
+ Version = '0.5.03'
7
7
 
8
8
  # Brief description of the gem.
9
- Description = 'Macro-steps for Cucumber'
9
+ Description = 'Add your own macro-steps to Cucumber scenarios'
10
10
 
11
11
  # Constant Macros4Cuke::RootDir contains the absolute path of Macro4Cuke's
12
12
  # root directory. Note: it also ends with a slash character.
@@ -0,0 +1,16 @@
1
+ # File: cucumber.rb
2
+ # Purpose: Load Macros4Cuke modules and classes, register its step definitions
3
+
4
+ # Load modules and classes from the gem.
5
+ require_relative 'constants'
6
+ require_relative 'macro-step-support'
7
+
8
+
9
+ # Extend the world object with the mix-in module
10
+ # that adds the support for macros in Cucumber.
11
+ World(Macros4Cuke::MacroStepSupport)
12
+
13
+ # Register the step definitions from Macros4Cuke
14
+ require_relative '../macro_steps'
15
+
16
+ # End of file
@@ -7,11 +7,35 @@ module Macros4Cuke # Module used as a namespace
7
7
  class Macros4CukeError < StandardError
8
8
  end # class
9
9
 
10
+ # @abstract
11
+ # Specialized command-line errors.
12
+ class CmdLineError < Macros4CukeError
13
+ def initialize(aMessage)
14
+ msg = "Error in command-line:\n"
15
+ super(msg + aMessage)
16
+ end
17
+ end # class
18
+
19
+ class DirectoryNotFound < CmdLineError
20
+ def initialize(aDirPath)
21
+ msg = "Cannot find the directory '#{aDirPath}'."
22
+ super(msg)
23
+ end
24
+ end # class
25
+
26
+
27
+ class SupportFileExists < CmdLineError
28
+ def initialize(aDirPath)
29
+ msg = "The file '#{aDirPath}' already exists."
30
+ super(msg)
31
+ end
32
+ end # class
33
+
10
34
  # Raised when one attempts to define a new macro
11
35
  # that has the same phrase as an existing macro.
12
36
  class DuplicateMacroError < Macros4CukeError
13
37
  def initialize(aPhrase)
14
- super("A macro-step with phrase '#{aPhrase}' already exist.")
38
+ super("A macro-step with phrase '#{aPhrase}' already exists.")
15
39
  end
16
40
  end # class
17
41
 
@@ -0,0 +1,43 @@
1
+ # File: eo-line.rb
2
+
3
+
4
+ module Macros4Cuke # Module used as a namespace
5
+
6
+
7
+ # Module containing all classes implementing the simple template engine
8
+ # used internally in Macros4Cuke.
9
+ module Templating
10
+
11
+ # Class used internally by the template engine.
12
+ # Represents a comment from a template.
13
+ # A static text is a text that is reproduced verbatim
14
+ # when rendering a template.
15
+ class Comment
16
+ # The comment as extracted from the original template.
17
+ attr_reader(:source)
18
+
19
+
20
+ # @param aSourceText [String] A piece of text extracted
21
+ # from the template that must be rendered verbatim.
22
+ def initialize(aSourceText)
23
+ @source = aSourceText
24
+ end
25
+
26
+ public
27
+
28
+ # Render the comment.
29
+ # Comments are rendered as empty text. This is necessary because
30
+ # Cucumber::RbSupport::RbWorld#steps complains when it sees a comment.
31
+ # This method has the same signature as the {Engine#render} method.
32
+ # @return [String] Empty string ("as is")
33
+ def render(aContextObject, theLocals)
34
+ return ''
35
+ end
36
+ end # class
37
+
38
+
39
+ end # module
40
+
41
+ end # module
42
+
43
+ # End of file
@@ -0,0 +1,30 @@
1
+ # File: eo-line.rb
2
+
3
+
4
+ module Macros4Cuke # Module used as a namespace
5
+
6
+
7
+ # Module containing all classes implementing the simple template engine
8
+ # used internally in Macros4Cuke.
9
+ module Templating
10
+
11
+
12
+ # Class used internally by the template engine.
13
+ # Represents an end of line that must be rendered as such.
14
+ class EOLine
15
+
16
+ public
17
+
18
+ # Render an end of line.
19
+ # This method has the same signature as the {Engine#render} method.
20
+ # @return [String] An end of line marker. Its exact value is OS-dependent.
21
+ def render(aContextObject, theLocals)
22
+ return "\n"
23
+ end
24
+ end # class
25
+
26
+ end # module
27
+
28
+ end # module
29
+
30
+ # End of file
@@ -0,0 +1,40 @@
1
+ # File: static-text.rb
2
+
3
+
4
+ module Macros4Cuke # Module used as a namespace
5
+
6
+
7
+ # Module containing all classes implementing the simple template engine
8
+ # used internally in Macros4Cuke.
9
+ module Templating
10
+
11
+ # Class used internally by the template engine.
12
+ # Represents a static piece of text from a template.
13
+ # A static text is a text that is reproduced verbatim
14
+ # when rendering a template.
15
+ class StaticText
16
+ # The static text extracted from the original template.
17
+ attr_reader(:source)
18
+
19
+
20
+ # @param aSourceText [String] A piece of text extracted
21
+ # from the template that must be rendered verbatim.
22
+ def initialize(aSourceText)
23
+ @source = aSourceText
24
+ end
25
+
26
+ public
27
+
28
+ # Render the static text.
29
+ # This method has the same signature as the {Engine#render} method.
30
+ # @return [String] Static text is returned verbatim ("as is")
31
+ def render(aContextObject, theLocals)
32
+ return source
33
+ end
34
+ end # class
35
+
36
+ end # module
37
+
38
+ end # module
39
+
40
+ # End of file
@@ -1,88 +1,7 @@
1
- # File: template-element.rb
2
- # Purpose: Implementation of core classes used in the template engine.
3
-
4
-
5
- require_relative '../exceptions' # Load the custom exception classes.
6
-
7
-
8
-
9
- module Macros4Cuke # Module used as a namespace
10
-
11
-
12
- # Module containing all classes implementing the simple template engine
13
- # used internally in Macros4Cuke.
14
- module Templating
15
-
16
- # Class used internally by the template engine.
17
- # Represents a static piece of text from a template.
18
- # A static text is a text that is reproduced verbatim
19
- # when rendering a template.
20
- class StaticText
21
- # The static text extracted from the original template.
22
- attr_reader(:source)
23
-
24
-
25
- # @param aSourceText [String] A piece of text extracted
26
- # from the template that must be rendered verbatim.
27
- def initialize(aSourceText)
28
- @source = aSourceText
29
- end
30
-
31
- public
32
-
33
- # Render the static text.
34
- # This method has the same signature as the {Engine#render} method.
35
- # @return [String] Static text is returned verbatim ("as is")
36
- def render(aContextObject, theLocals)
37
- return source
38
- end
39
- end # class
40
-
41
-
42
- # Class used internally by the template engine.
43
- # Represents a comment from a template.
44
- # A static text is a text that is reproduced verbatim
45
- # when rendering a template.
46
- class Comment
47
- # The comment as extracted from the original template.
48
- attr_reader(:source)
49
-
50
-
51
- # @param aSourceText [String] A piece of text extracted
52
- # from the template that must be rendered verbatim.
53
- def initialize(aSourceText)
54
- @source = aSourceText
55
- end
56
-
57
- public
58
-
59
- # Render the comment.
60
- # Comments are rendered as empty text. This is necessary because
61
- # Cucumber::RbSupport::RbWorld#steps complains when it sees a comment.
62
- # This method has the same signature as the {Engine#render} method.
63
- # @return [String] Empty string ("as is")
64
- def render(aContextObject, theLocals)
65
- return ''
66
- end
67
- end # class
68
-
69
-
70
- # Class used internally by the template engine.
71
- # Represents an end of line that must be rendered as such.
72
- class EOLine
73
-
74
- public
75
-
76
- # Render an end of line.
77
- # This method has the same signature as the {Engine#render} method.
78
- # @return [String] An end of line marker. Its exact value is OS-dependent.
79
- def render(aContextObject, theLocals)
80
- return "\n"
81
- end
82
- end # class
83
-
84
- end # module
85
-
86
- end # module
87
-
88
- # End of file
1
+ # File: template-element.rb
2
+
3
+ require_relative 'static-text'
4
+ require_relative 'comment'
5
+ require_relative 'eo-line'
6
+
7
+ # End of file
@@ -0,0 +1,117 @@
1
+ # File: macro-collection_spec.rb
2
+
3
+ require_relative '../spec_helper'
4
+
5
+ require_relative '../../lib/macros4cuke/exceptions'
6
+
7
+ # Load the class under test
8
+ require_relative '../../lib/macros4cuke/application'
9
+
10
+ module Macros4Cuke # Open this namespace to avoid module qualifier prefixes
11
+
12
+ describe Application do
13
+
14
+ before(:each) do
15
+ @current_wkdir = Dir.getwd
16
+ Dir.chdir(File.dirname(__FILE__))
17
+ end
18
+
19
+ after(:each) do
20
+ Dir.chdir(@current_wkdir)
21
+ end
22
+
23
+ def hijack_stdout()
24
+ @orig_stdout = $stdout
25
+ $stdout = StringIO.new('', 'w')
26
+ end
27
+
28
+ def restore_stdout()
29
+ $stdout = @orig_stdout
30
+ end
31
+
32
+ def hijack_stderr()
33
+ @orig_stderr = $stderr
34
+ $stderr = StringIO.new('', 'w')
35
+ end
36
+
37
+ def restore_stderr()
38
+ $stderr = @orig_stderr
39
+ end
40
+
41
+ def mk_subdir(relativePath)
42
+ subdir = File.dirname(__FILE__) + '/' + relativePath
43
+ Dir.mkdir(subdir)
44
+ end
45
+
46
+
47
+ context 'Creation & initialization:' do
48
+ it 'should be created without argument' do
49
+ expect { Application.new }.not_to raise_error
50
+ end
51
+
52
+ it 'should not have any option at creation' do
53
+ expect(subject.options).to be_empty
54
+ end
55
+ end # context
56
+
57
+ context 'Provided services:' do
58
+ def make_dirs()
59
+ mk_subdir('test_dir')
60
+ mk_subdir('test_dir/features')
61
+ mk_subdir('test_dir/features/support')
62
+ end
63
+
64
+ def delete_dirs(aFilepath)
65
+ a_path = Pathname.new(aFilepath)
66
+ Dir.rmdir(a_path)
67
+ Dir.rmdir(a_path.parent)
68
+ Dir.rmdir(a_path.parent.parent)
69
+ end
70
+
71
+ it 'should create a support file when requested' do
72
+ make_dirs
73
+
74
+ file_path = './test_dir/features/support'
75
+ file_name = 'use_macros4cuke.rb'
76
+
77
+ subject.run!(%w(--setup ./test_dir))
78
+ expect(File.exist?(file_path + '/' + file_name)).to be_true
79
+
80
+ File.delete(file_path + '/' + file_name)
81
+ delete_dirs(file_path)
82
+ end
83
+
84
+ it 'should complain when the support file already exists' do
85
+ make_dirs
86
+
87
+ file_path = '/test_dir/features/support'
88
+ file_name = 'use_macros4cuke.rb'
89
+ args = %w(--setup ./test_dir)
90
+ my_dir = File.dirname(__FILE__)
91
+
92
+ expect { subject.run!(args) }.not_to raise_error
93
+
94
+ hijack_stderr
95
+ err_msg = <<-MSG_END
96
+ Error in command-line:
97
+ The file '#{my_dir}/test_dir/features/support/use_macros4cuke.rb' already exists.
98
+ MSG_END
99
+
100
+ expect { subject.run!(args) }.to raise_error(SystemExit)
101
+
102
+ # Error message text is displayed
103
+ expect($stderr.string).to eq(err_msg)
104
+ restore_stderr
105
+
106
+ File.delete(".#{file_path}/#{file_name}")
107
+ delete_dirs('.' + file_path)
108
+ end
109
+
110
+ end # context
111
+
112
+ end # describe
113
+
114
+ end # module
115
+
116
+
117
+ # End of file