cukedep 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +15 -0
  2. data/.rspec +1 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/.simplecov +7 -0
  6. data/.travis.yml +15 -0
  7. data/.yardopts +6 -0
  8. data/CHANGELOG.md +3 -0
  9. data/Gemfile +12 -0
  10. data/LICENSE.txt +19 -0
  11. data/README.md +64 -0
  12. data/Rakefile +32 -0
  13. data/bin/cukedep +14 -0
  14. data/cucumber.yml +10 -0
  15. data/lib/cukedep.rb +9 -0
  16. data/lib/cukedep/application.rb +112 -0
  17. data/lib/cukedep/cli/application.rb +0 -0
  18. data/lib/cukedep/cli/cmd-line.rb +115 -0
  19. data/lib/cukedep/config.rb +31 -0
  20. data/lib/cukedep/constants.rb +29 -0
  21. data/lib/cukedep/feature-model.rb +285 -0
  22. data/lib/cukedep/feature-rep.rb +49 -0
  23. data/lib/cukedep/gherkin-listener.rb +98 -0
  24. data/lib/macros4cuke.rb +8 -0
  25. data/sample/features/step_definitions/steps.rb +105 -0
  26. data/sample/features/support/env.rb +12 -0
  27. data/sample/model/model.rb +216 -0
  28. data/spec/cukedep/application_spec.rb +81 -0
  29. data/spec/cukedep/cli/cmd-line_spec.rb +91 -0
  30. data/spec/cukedep/feature-model_spec.rb +103 -0
  31. data/spec/cukedep/feature-rep_spec.rb +53 -0
  32. data/spec/cukedep/file-parsing.rb +40 -0
  33. data/spec/cukedep/gherkin-listener_spec.rb +59 -0
  34. data/spec/cukedep/sample_features/a_few_tests.feature +24 -0
  35. data/spec/cukedep/sample_features/more_tests.feature +24 -0
  36. data/spec/cukedep/sample_features/other_tests.feature +15 -0
  37. data/spec/cukedep/sample_features/some_tests.feature +13 -0
  38. data/spec/cukedep/sample_features/standalone.feature +19 -0
  39. data/spec/cukedep/sample_features/still_other_tests.feature +24 -0
  40. data/spec/cukedep/sample_features/yet_other_tests.feature +19 -0
  41. data/spec/spec_helper.rb +18 -0
  42. data/templates/rake.erb +163 -0
  43. metadata +165 -0
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NWY3NmMwOGE1YjM3MzVmNjA3YzFhYzlhMGE3ZmMwNTNiYzZhYjA1NQ==
5
+ data.tar.gz: !binary |-
6
+ MjI3ZDE2ZGY3NGU0ZDQxM2FjNjY2Mzk4OTZiMDg4NGE0M2RhNjdiYQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ NjQxZGZjZDNlMDU1MzRlZDhlZWI2NGYzNjJiYWZmNWRlZDFiMzRhMWQ3YmVh
10
+ NzllMWI4OGUxMWU1ZGIxNzU5ZjJkNmJiNWMzN2ZjZTlmMTBkN2UxYTIxYzRk
11
+ YjRjZDlhMzdkNDRmOWY4N2MwZGEyOTVhOTA5NTIyZjJhYWM3ZWM=
12
+ data.tar.gz: !binary |-
13
+ ODllMDNmNmNlMzIwZTZmNDFmM2FkYTMyMDhhYmRjNDg4Nzg3NjY4Zjc4NjUw
14
+ NGFlOTAwMTc5MGY2ZjFlNzllMjMwMzQxN2U0ZWExMjgyYjhkMjBiMzI0YTg5
15
+ YjMyZThjMmJiNGY1YTBiMDQ0MWQ5NWUxZDE4MGI1YmYxYzdkNTk=
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --backtrace
@@ -0,0 +1 @@
1
+ cukedep
@@ -0,0 +1 @@
1
+ 1.9.3
@@ -0,0 +1,7 @@
1
+ # .simplecov
2
+ # Configuration
3
+
4
+ SimpleCov.start do
5
+ # Remove all files that match /spec/ in their path
6
+ add_filter "/spec/"
7
+ end
@@ -0,0 +1,15 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 1.9.3
5
+ - 1.9.2
6
+ - jruby-19mode
7
+ - jruby-head
8
+
9
+ gemfile:
10
+ - Gemfile
11
+
12
+ # whitelist
13
+ branches:
14
+ only:
15
+ - master
@@ -0,0 +1,6 @@
1
+ --exclude examples --exclude features --exclude spec
2
+ --no-private
3
+ --markup markdown
4
+ -
5
+ Changelog.md
6
+ License.txt
@@ -0,0 +1,3 @@
1
+ ### 0.0.01 / 2013-10-23
2
+
3
+ * [FEATURE] Initial public working version
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+ # Prevent Bundler to load the dependencies from our .gemspec file
3
+
4
+ gem "gherkin", [">=" "1.0.0"]
5
+ gem "cucumber", [">= 0.5.0"]
6
+ gem "rake", [">= 0.8.0" ]
7
+
8
+ group :development do
9
+ gem "rake", ">= 0.8.0"
10
+ gem "rspec", ">= 2.11.0"
11
+ gem "simplecov", ">= 0.5.0"
12
+ end
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2013 Dimitri Geshef
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
@@ -0,0 +1,64 @@
1
+ Cukedep
2
+ ===========
3
+ [![Build Status](https://travis-ci.org/famished-tiger/cukedep.png?branch=master)](https://travis-ci.org/famished-tiger/cukedep)
4
+
5
+ _Handle dependencies between feature file._
6
+ [Homepage](https://github.com/famished-tiger/cukedep)
7
+
8
+ __Cukedep__ is a command-line utility that helps to run feature files in the proper sequence.
9
+
10
+ ### Highlights ###
11
+ * Simple syntax to specify dependencies
12
+ * Generates dependency reports (in CSV format)
13
+ * Generates dependency diagram (in DOT format),
14
+ * Generates a Rake file.
15
+
16
+
17
+ ### Installation ###
18
+ The installation of the cukedep gem is fairly standard:
19
+ ```bash
20
+ $[sudo] gem install cukedep
21
+ ```
22
+
23
+ To check the installation, open a shell/command window
24
+ and type the command-line:
25
+ ```bash
26
+ $[sudo] cukedep --version
27
+ ```
28
+
29
+ You should see the version of cukedep gem.
30
+
31
+
32
+ ### Synopsis ###
33
+ To get a first taste of how cukedep works, install it first.
34
+ Then go to the root dir of the cukedep gem, then open a shell/command window
35
+ and type the command-line:
36
+ ```bash
37
+ $[sudo] rake
38
+ ```
39
+
40
+ You will see tests running and Cucumber executing a number of feature files.
41
+
42
+ To learn more what's happening, go to the ```pec/sample_features``` dir
43
+ You will notice a number of feature files for a sample application.
44
+ Stay in that folder and type the following command-line:
45
+ ```bash
46
+ $[sudo] cukedep --project ../../../sample --dry-run
47
+ ```
48
+
49
+ You instructed cukedep to do the following:
50
+ * Read (parse) all the feature files in the current dir.
51
+ * Resolve the dependencies between the feature files (based on specific Gherkin @tags).
52
+ * Generate a number of dependency reports and drawing.
53
+ * Generate a rake file that will execute the feature files in the proper sequence for
54
+ the project located at the relative path ```../../../sample```
55
+
56
+ To generate all the above files and run the feature files with Cucumber,
57
+ then retry the command line without the --dry-run option:
58
+ ```bash
59
+ $[sudo] cukedep --project ../../../sample --dry-run
60
+ ```
61
+
62
+ Copyright
63
+ ---------
64
+ Copyright (c) 2013, Dimitri Geshef. Cukedep is released under the MIT License see [LICENSE.txt](https://github.com/famished-tiger/Cukedep/blob/master/LICENSE.txt) for details.
@@ -0,0 +1,32 @@
1
+ require 'rubygems'
2
+ require_relative './lib/cukedep/constants'
3
+
4
+ namespace :gem do
5
+
6
+ desc 'Push the gem to rubygems.org'
7
+ task :push do
8
+ system("gem push cukedep-#{Cukedep::Version}.gem")
9
+ end
10
+
11
+ end # namespace
12
+
13
+ # Testing-specific tasks
14
+
15
+
16
+ # RSpec as testing tool
17
+ require 'rspec/core/rake_task'
18
+ desc 'Run RSpec'
19
+ RSpec::Core::RakeTask.new do |spec|
20
+ spec.pattern = 'spec/**/*_spec.rb'
21
+ end
22
+
23
+
24
+ # Combine RSpec tests
25
+ desc 'Run tests, with RSpec'
26
+ task :test => [:spec]
27
+
28
+
29
+ # Default rake task
30
+ task :default => :test
31
+
32
+ # End of file
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ # File: cukedep
3
+ # The 'executable' of the Cukedep utility.
4
+
5
+ mydir = File.dirname(__FILE__)
6
+ lib_dir = mydir + '/../lib'
7
+ $LOAD_PATH.unshift lib_dir unless $:.include?(lib_dir)
8
+
9
+ require 'cukedep' # Load the Cukedep::Application class
10
+
11
+ # The application's entry point
12
+ app = Cukedep::Application.new
13
+ app.start!(ARGV)
14
+ # End of file
@@ -0,0 +1,10 @@
1
+ default: --strict -v -b --format progress features
2
+ html: --strict -v -b --format html --out result.html features
3
+ pdf: --strict -v -b --format pdf --out result.pdf features
4
+ stepdefs: --strict -v -b --format stepdefs --out stepdefs.txt features
5
+ rerun: --strict -v -b --format rerun --out rerun.txt features
6
+ tag_cloud: --strict -v -b --format tag_cloud --out tag_cloud.txt features
7
+ usage: --strict -v -b --format usage --out usage.txt features
8
+
9
+
10
+
@@ -0,0 +1,9 @@
1
+ # File: cukedep.rb
2
+ # This file acts as a jumping-off point for loading dependencies expected
3
+ # for a Cukedep user.
4
+
5
+ require_relative './cukedep/constants'
6
+ require_relative './cukedep/application'
7
+
8
+ # End of file
9
+
@@ -0,0 +1,112 @@
1
+ # File: application.rb
2
+
3
+ require 'yaml'
4
+ require 'gherkin/parser/parser'
5
+
6
+ require_relative 'cli/cmd-line'
7
+ require_relative 'config'
8
+ require_relative 'gherkin-listener'
9
+ require_relative 'feature-model'
10
+
11
+ module Cukedep # Module used as a namespace
12
+
13
+ # Runner for the Cukedep application
14
+ class Application
15
+ attr_reader(:proj_dir)
16
+ public
17
+
18
+ # Entry point for the application object.
19
+ def start!(theCmdLineArgs)
20
+ options = options_from(theCmdLineArgs)
21
+ create_default_cfg() if options[:setup]
22
+ config = load_cfg()
23
+
24
+ # Complain if no project dir is specified
25
+ if config.proj_dir.nil? || config.proj_dir.empty?
26
+ if options[:project]
27
+ @proj_dir = options[:project]
28
+ else
29
+ fail(StandardError, "No project dir specified via 'Cukedep::YMLFilename' nor via --project option.")
30
+ end
31
+ else
32
+ @proj_dir = config.proj_dir
33
+ end
34
+
35
+ feature_files = parse_features()
36
+
37
+ model = FeatureModel.new(feature_files)
38
+ generate_files(model)
39
+ unless options[:"dry-run"]
40
+ rake_cmd = "rake -f cukedep.rake"
41
+ system(rake_cmd)
42
+ end
43
+ end
44
+
45
+ protected
46
+ # Retrieve the user-entered command-line options
47
+ def options_from(theCmdLineArgs)
48
+ cli = CLI::CmdLine.new
49
+ options = cli.parse!(theCmdLineArgs.dup)
50
+ end
51
+
52
+ # Create a local copy of the .cukedep.yml file, then
53
+ # stop the application.
54
+ def create_default_cfg()
55
+ if File.exist?(Cukedep::YMLFilename)
56
+ puts "OK to overwrite file #{Cukedep::YMLFilename}."
57
+ puts '(Y/N)?'
58
+ answer = $stdin.gets()
59
+ exit if answer =~ /^\s*[Nn]\s*$/
60
+ end
61
+ File::open(Cukedep::YMLFilename, 'w') { |f| YAML.dump(Config.default, f) }
62
+ exit
63
+ end
64
+
65
+ # Read the .cukedep.yml file in the current working directory
66
+ def load_cfg()
67
+ if File.exist?(Cukedep::YMLFilename)
68
+ YAML::load_file(Cukedep::YMLFilename)
69
+ else
70
+ Config.default
71
+ end
72
+ end
73
+
74
+ # Parse the feature files
75
+ def parse_features()
76
+ # Create a Gherkin listener
77
+ listener = Cukedep::GherkinListener.new
78
+
79
+ # Create a Gherkin parser
80
+ parser = Gherkin::Parser::Parser.new(listener)
81
+
82
+ # List all the .feature files
83
+ filenames = Dir.glob('*.feature')
84
+ puts "\nParsing:"
85
+
86
+ # Parse them
87
+ filenames.each do |fname|
88
+ puts " #{fname}"
89
+ File::open(fname, 'r') { |f| parser.parse(f.read, fname, 0) }
90
+ end
91
+
92
+ return listener.feature_files
93
+ end
94
+
95
+
96
+ def generate_files(aModel)
97
+ # Sort the feature files by dependency order.
98
+ aModel.sort_features_by_dep()
99
+
100
+ puts "\nGenerating:"
101
+
102
+ # Generate CSV files detailing the feature to identifier mapping
103
+ # and vise versa
104
+ aModel.mapping_reports('feature2id.csv', 'id2feature.csv', true)
105
+ aModel.draw_dependency_graph('dependencies.dot', true)
106
+ aModel.generate_rake_tasks('cukedep.rake', proj_dir)
107
+ end
108
+ end # class
109
+
110
+ end # module
111
+
112
+ # End of file
File without changes
@@ -0,0 +1,115 @@
1
+ # File: cli.rb
2
+
3
+ # Access the OptionParser library from the standard Ruby library
4
+ require 'optparse'
5
+ require 'pathname'
6
+
7
+ require_relative '../constants'
8
+
9
+ module Cukedep # This module is used as a namespace
10
+
11
+ # Module dedicated to the command-line interface
12
+ module CLI
13
+
14
+
15
+ # Manages the application command-line interface (CLI).
16
+ # It is merely a thin wrapper around the OptionParser library.
17
+ # Responsibilities:
18
+ #- Specify the command-line syntax,
19
+ #- Return the result of the command-line parsing
20
+ class CmdLine
21
+ # A Hash with the result of the command-line parse.
22
+ attr_reader(:options)
23
+
24
+ # OptionParser object
25
+ attr_reader(:parser)
26
+
27
+ # Constructor.
28
+ def initialize()
29
+ @options = { }
30
+
31
+ @parser = OptionParser.new do |opts|
32
+ opts.banner = <<-EOS
33
+ Usage: cukedep [options]
34
+ The command-line options are:
35
+ EOS
36
+
37
+ # No argument. Check
38
+ dry_txt = 'Check the feature file dependencies without running the feature files.'
39
+ opts.on(nil, '--dry-run', dry_txt) do
40
+ options[:"dry-run"] = true
41
+ end
42
+
43
+ # No argument. Create .cukedep.yml file
44
+ setup_txt = 'Create a default .cukedep.yml file in current dir.'
45
+ opts.on(nil, '--setup', setup_txt) do
46
+ options[:setup] = true
47
+ end
48
+
49
+ # Mandatory argument
50
+ msg = 'Run the Cucumber project at given path with features from current dir.'
51
+ opts.on('--project PROJ_PATH', msg) do |project_path|
52
+ options[:project] = validated_project(project_path)
53
+ end
54
+
55
+ # No argument, shows at tail. This will print an options summary.
56
+ opts.on_tail('-h', '--help', 'Show this message') do
57
+ puts opts
58
+ options[:help] = true
59
+ end
60
+
61
+ opts.on_tail('--version', 'Show application version number') do
62
+ puts Cukedep::Version
63
+ options[:version] = true
64
+ end
65
+
66
+ end
67
+ end
68
+
69
+ public
70
+ # Perform the command-line parsing
71
+ def parse!(theCmdLineArgs)
72
+ begin
73
+ parser.parse!(theCmdLineArgs)
74
+ rescue OptionParser::MissingArgument => exc
75
+ err_msg = ''
76
+ exc.args.each do |arg|
77
+ err_msg << "No argument provided with command line option: #{arg}\n"
78
+ end
79
+ err_msg << 'To see the command-line syntax, do:\ncukedep --help'
80
+ fail(StandardError, err_msg)
81
+ end
82
+
83
+ # Some options stop the application
84
+ exit if options[:version] || options[:help]
85
+
86
+ return options
87
+ end
88
+
89
+ private
90
+ def validated_project(theProjectPath)
91
+ unless Dir.exist?(theProjectPath)
92
+ fail StandardError, "Cannot find the directory '#{theProjectPath}'."
93
+ end
94
+
95
+ # If current dir is /features and project dir is parent of it
96
+ # then we have an error
97
+ current_path = Pathname.getwd()
98
+ if current_path.to_s =~ /features$/
99
+ if current_path.parent == Pathname.new(theProjectPath)
100
+ msg = "Original feature file may not be in 'features' subdir of project dir."
101
+ fail StandardError, msg
102
+ end
103
+ end
104
+
105
+
106
+ return theProjectPath
107
+ end
108
+
109
+ end # class
110
+
111
+ end # module
112
+
113
+ end # module
114
+
115
+ # End of file