metasploit-version 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +2 -0
  3. data/.travis.yml +10 -3
  4. data/CHANGELOG.md +6 -0
  5. data/CONTRIBUTING.md +10 -44
  6. data/Gemfile +12 -8
  7. data/RELEASING.md +86 -0
  8. data/Rakefile +5 -4
  9. data/UPGRADING.md +1 -0
  10. data/app/templates/.rspec.tt +2 -0
  11. data/app/templates/CHANGELOG.md.tt +18 -0
  12. data/app/templates/CONTRIBUTING.md.tt +122 -0
  13. data/app/templates/RELEASING.md.tt +99 -0
  14. data/app/templates/Rakefile.tt +7 -0
  15. data/app/templates/UPGRADING.md.tt +1 -0
  16. data/app/templates/lib/versioned/version.rb.tt +64 -0
  17. data/app/templates/spec/lib/versioned/version_spec.rb.tt +3 -0
  18. data/app/templates/spec/lib/versioned_spec.rb.tt +4 -0
  19. data/app/templates/spec/spec_helper.rb.tt +76 -0
  20. data/bin/metasploit-version +12 -0
  21. data/config/cucumber.yml +3 -0
  22. data/features/metasploit-version/install/add_development_dependency.feature +68 -0
  23. data/features/metasploit-version/install/bundle_install.feature +24 -0
  24. data/features/metasploit-version/install/changelog.feature +29 -0
  25. data/features/metasploit-version/install/conflict.feature +45 -0
  26. data/features/metasploit-version/install/contributing.feature +139 -0
  27. data/features/metasploit-version/install/namespace_spec/gem_version_constant.feature +154 -0
  28. data/features/metasploit-version/install/namespace_spec/namespace.feature +33 -0
  29. data/features/metasploit-version/install/namespace_spec/version_constant.feature +179 -0
  30. data/features/metasploit-version/install/rake_spec.feature +27 -0
  31. data/features/metasploit-version/install/releasing/ruby_versions.feature +50 -0
  32. data/features/metasploit-version/install/releasing/versioning.feature +138 -0
  33. data/features/metasploit-version/install/steps/gemspec_steps.rb +19 -0
  34. data/features/metasploit-version/install/upgrading.feature +19 -0
  35. data/features/metasploit-version/install/version.feature +11 -0
  36. data/features/metasploit-version/install/version/namespace.feature +157 -0
  37. data/features/metasploit-version/install/version/prerelease.feature +154 -0
  38. data/features/metasploit-version/install/version_spec/namespace.feature +32 -0
  39. data/features/metasploit-version/install/version_spec/testing/branch_from_master.feature +40 -0
  40. data/features/metasploit-version/install/version_spec/testing/branching_from_branch.feature +161 -0
  41. data/features/metasploit-version/install/version_spec/testing/merge_branch_to_master.feature +97 -0
  42. data/features/{shared/examples/metasploit/version/version_module/prerelease/git/step_definitions → step_definitions}/environment_variable_steps.rb +1 -1
  43. data/features/{shared/examples/metasploit/version/version_module/prerelease/git/step_definitions → step_definitions}/git_steps.rb +11 -3
  44. data/features/support/env.rb +15 -11
  45. data/lib/metasploit/version.rb +1 -0
  46. data/lib/metasploit/version/cli.rb +321 -0
  47. data/lib/metasploit/version/version.rb +2 -2
  48. data/metasploit-version.gemspec +2 -2
  49. data/spec/lib/metasploit/version/branch_spec.rb +1 -3
  50. data/spec/lib/metasploit/version/cli_spec.rb +514 -0
  51. data/spec/lib/metasploit/version/version_spec.rb +2 -4
  52. data/spec/lib/metasploit/version_spec.rb +2 -4
  53. data/spec/spec_helper.rb +63 -1
  54. data/spec/support/shared/examples/metasploit/version/version_module.rb +3 -1
  55. metadata +82 -8
@@ -0,0 +1,19 @@
1
+ Then(/^metasploit\-version should be development dependency with semantic version restriction in "(.*?)"$/) do |gemspec_path|
2
+ version_requirement = if defined? Metasploit::Version::Version::PRERELEASE
3
+ # require exactly this pre-release in case there are multiple prereleases for the same
4
+ # version number due to parallel branches.
5
+ "= #{Metasploit::Version::GEM_VERSION}"
6
+ elsif Metasploit::Version::Version::MAJOR < 1
7
+ # can only allow the PATCH to wiggle pre-1.0.0
8
+ "~> #{Metasploit::Version::Version::MAJOR}.#{Metasploit::Version::Version::MINOR}.#{Metasploit::Version::Version::PATCH}"
9
+ else
10
+ # can allow the MINOR to wiggle 1.0.0+
11
+ "~> #{Metasploit::Version::Version::MAJOR}.#{Metasploit::Version::Version::MINOR}"
12
+ end
13
+
14
+ check_file_content(
15
+ gemspec_path,
16
+ %r{spec\.add_development_dependency\s*(?<quote>'|")metasploit-version\k<quote>,\s*\k<quote>#{version_requirement}\k<quote>},
17
+ true
18
+ )
19
+ end
@@ -0,0 +1,19 @@
1
+ Feature: metasploit-version install should add UPGRADING.md
2
+
3
+ `metasploit-version install` should generate UPGRADING.md which includes any information needed by downstream
4
+ consumers of the gem when upgrading to handle Deprecations or Incompatible Changes.
5
+
6
+ Scenario:
7
+ Given I successfully run `bundle gem upgraded`
8
+ And I cd to "upgraded"
9
+ And my git identity is configured
10
+ And I successfully run `git commit --message "bundle gem upgraded"`
11
+ And I unset the environment variable "TRAVIS_BRANCH"
12
+ And I set the environment variables to:
13
+ | variable | value |
14
+ | TRAVIS_PULL_REQUEST | false |
15
+ When I successfully run `metasploit-version install --force --no-bundle-install`
16
+ Then the file "UPGRADING.md" should contain:
17
+ """
18
+ No Deprecations or Incompatible Changes have been introduced at this time
19
+ """
@@ -0,0 +1,11 @@
1
+ Feature: metasploit-version install adds 'version.rb' to replace default 'version.rb'
2
+
3
+ The version.rb file from metasploit-version will follow semver.org and define `MAJOR`, `MINOR`, and `PATCH`. If on
4
+ a branch, the `PRERELEASE` will also be defined. Default implementations for `Version.full` and `Version.gem` will
5
+ be provided and `VERSION` and `GEM_VERSION` will be set to the respective method.
6
+
7
+ Scenario: No gemspec
8
+ Given a file matching %r<.*\.gemspec> should not exist
9
+ When I run `metasploit-version install`
10
+ Then the output should contain "No gemspec found"
11
+ And the exit status should not be 0
@@ -0,0 +1,157 @@
1
+ Feature: metasploit-version install's 'version.rb' generate proper namespace nesting
2
+
3
+ The version.rb file from metasploit-version will generate the appropriately indented nesting for single and multiple
4
+ namespaces with proper conversion of underscored and dashes in the gem name to camel case and separate modules,
5
+ respectively
6
+
7
+ Scenario Outline: Top-level namespace
8
+ Given I successfully run `bundle gem <gem_name>`
9
+ And I cd to "<gem_name>"
10
+ And my git identity is configured
11
+ And I successfully run `git commit --message "bundle gem <gem_name>"`
12
+ And I unset the environment variable "TRAVIS_BRANCH"
13
+ And I set the environment variables to:
14
+ | variable | value |
15
+ | TRAVIS_PULL_REQUEST | false |
16
+ When I successfully run `metasploit-version install --force --no-bundle-install`
17
+ Then the file "<version_rb_path>" should contain exactly:
18
+ """
19
+ module <namespace_name>
20
+ # Holds components of {VERSION} as defined by {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0}.
21
+ module Version
22
+ #
23
+ # CONSTANTS
24
+ #
25
+
26
+ # The major version number.
27
+ MAJOR = 0
28
+ # The minor version number, scoped to the {MAJOR} version number.
29
+ MINOR = 0
30
+ # The patch version number, scoped to the {MAJOR} and {MINOR} version numbers.
31
+ PATCH = 1
32
+
33
+ #
34
+ # Module Methods
35
+ #
36
+
37
+ # The full version string, including the {<namespace_name>::Version::MAJOR},
38
+ # {<namespace_name>::Version::MINOR}, {<namespace_name>::Version::PATCH}, and optionally, the
39
+ # `<namespace_name>::Version::PRERELEASE` in the
40
+ # {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0} format.
41
+ #
42
+ # @return [String] '{<namespace_name>::Version::MAJOR}.{<namespace_name>::Version::MINOR}.{<namespace_name>::Version::PATCH}' on master.
43
+ # '{<namespace_name>::Version::MAJOR}.{<namespace_name>::Version::MINOR}.{<namespace_name>::Version::PATCH}-PRERELEASE'
44
+ # on any branch other than master.
45
+ def self.full
46
+ version = "#{MAJOR}.#{MINOR}.#{PATCH}"
47
+
48
+ if defined? PRERELEASE
49
+ version = "#{version}-#{PRERELEASE}"
50
+ end
51
+
52
+ version
53
+ end
54
+
55
+ # The full gem version string, including the {<namespace_name>::Version::MAJOR},
56
+ # {<namespace_name>::Version::MINOR}, {<namespace_name>::Version::PATCH}, and optionally, the
57
+ # `<namespace_name>::Version::PRERELEASE` in the
58
+ # {http://guides.rubygems.org/specification-reference/#version RubyGems versioning} format.
59
+ #
60
+ # @return [String] '{<namespace_name>::Version::MAJOR}.{<namespace_name>::Version::MINOR}.{<namespace_name>::Version::PATCH}'
61
+ # on master. '{<namespace_name>::Version::MAJOR}.{<namespace_name>::Version::MINOR}.{<namespace_name>::Version::PATCH}.PRERELEASE'
62
+ # on any branch other than master.
63
+ def self.gem
64
+ full.gsub('-', '.pre.')
65
+ end
66
+ end
67
+
68
+ # (see Version.gem)
69
+ GEM_VERSION = Version.gem
70
+
71
+ # (see Version.full)
72
+ VERSION = Version.full
73
+ end
74
+
75
+ """
76
+
77
+ Examples:
78
+ | gem_name | version_rb_path | namespace_name |
79
+ | single | lib/single/version.rb | Single |
80
+ | two_words | lib/two_words/version.rb | TwoWords |
81
+
82
+ Scenario Outline: Two-level namespace
83
+ Given I successfully run `bundle gem <gem_name>`
84
+ And I cd to "<gem_name>"
85
+ And my git identity is configured
86
+ And I successfully run `git commit --message "bundle gem <gem_name>"`
87
+ And I unset the environment variable "TRAVIS_BRANCH"
88
+ And I set the environment variables to:
89
+ | variable | value |
90
+ | TRAVIS_PULL_REQUEST | false |
91
+ When I successfully run `metasploit-version install --force --no-bundle-install`
92
+ Then the file "<version_rb_path>" should contain exactly:
93
+ """
94
+ module <parent_module_name>
95
+ module <child_module_name>
96
+ # Holds components of {VERSION} as defined by {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0}.
97
+ module Version
98
+ #
99
+ # CONSTANTS
100
+ #
101
+
102
+ # The major version number.
103
+ MAJOR = 0
104
+ # The minor version number, scoped to the {MAJOR} version number.
105
+ MINOR = 0
106
+ # The patch version number, scoped to the {MAJOR} and {MINOR} version numbers.
107
+ PATCH = 1
108
+
109
+ #
110
+ # Module Methods
111
+ #
112
+
113
+ # The full version string, including the {<parent_module_name>::<child_module_name>::Version::MAJOR},
114
+ # {<parent_module_name>::<child_module_name>::Version::MINOR}, {<parent_module_name>::<child_module_name>::Version::PATCH}, and optionally, the
115
+ # `<parent_module_name>::<child_module_name>::Version::PRERELEASE` in the
116
+ # {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0} format.
117
+ #
118
+ # @return [String] '{<parent_module_name>::<child_module_name>::Version::MAJOR}.{<parent_module_name>::<child_module_name>::Version::MINOR}.{<parent_module_name>::<child_module_name>::Version::PATCH}' on master.
119
+ # '{<parent_module_name>::<child_module_name>::Version::MAJOR}.{<parent_module_name>::<child_module_name>::Version::MINOR}.{<parent_module_name>::<child_module_name>::Version::PATCH}-PRERELEASE'
120
+ # on any branch other than master.
121
+ def self.full
122
+ version = "#{MAJOR}.#{MINOR}.#{PATCH}"
123
+
124
+ if defined? PRERELEASE
125
+ version = "#{version}-#{PRERELEASE}"
126
+ end
127
+
128
+ version
129
+ end
130
+
131
+ # The full gem version string, including the {<parent_module_name>::<child_module_name>::Version::MAJOR},
132
+ # {<parent_module_name>::<child_module_name>::Version::MINOR}, {<parent_module_name>::<child_module_name>::Version::PATCH}, and optionally, the
133
+ # `<parent_module_name>::<child_module_name>::Version::PRERELEASE` in the
134
+ # {http://guides.rubygems.org/specification-reference/#version RubyGems versioning} format.
135
+ #
136
+ # @return [String] '{<parent_module_name>::<child_module_name>::Version::MAJOR}.{<parent_module_name>::<child_module_name>::Version::MINOR}.{<parent_module_name>::<child_module_name>::Version::PATCH}'
137
+ # on master. '{<parent_module_name>::<child_module_name>::Version::MAJOR}.{<parent_module_name>::<child_module_name>::Version::MINOR}.{<parent_module_name>::<child_module_name>::Version::PATCH}.PRERELEASE'
138
+ # on any branch other than master.
139
+ def self.gem
140
+ full.gsub('-', '.pre.')
141
+ end
142
+ end
143
+
144
+ # (see Version.gem)
145
+ GEM_VERSION = Version.gem
146
+
147
+ # (see Version.full)
148
+ VERSION = Version.full
149
+ end
150
+ end
151
+
152
+ """
153
+
154
+ Examples:
155
+ | gem_name | version_rb_path | parent_module_name | child_module_name |
156
+ | parent-single | lib/parent/single/version.rb | Parent | Single |
157
+ | parent-two_words | lib/parent/two_words/version.rb | Parent | TwoWords |
@@ -0,0 +1,154 @@
1
+ Feature: metasploit-version install conditionally defines PRERELEASE in version.rb
2
+
3
+ The version.rb file will define PRERELEASE to the branch's prerelease name when `metasploit-version install` is run on
4
+ a branch, while it will not define PRERELEASE on master.
5
+
6
+ Scenario: No PRERELEASE on master
7
+ Given I successfully run `bundle gem master`
8
+ And I cd to "master"
9
+ And I unset the environment variable "TRAVIS_BRANCH"
10
+ And I set the environment variables to:
11
+ | variable | value |
12
+ | TRAVIS_PULL_REQUEST | false |
13
+ And my git identity is configured
14
+ And I successfully run `git commit --message "bundle gem master"`
15
+ When I successfully run `metasploit-version install --force --no-bundle-install`
16
+ Then the file "lib/master/version.rb" should contain exactly:
17
+ """
18
+ module Master
19
+ # Holds components of {VERSION} as defined by {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0}.
20
+ module Version
21
+ #
22
+ # CONSTANTS
23
+ #
24
+
25
+ # The major version number.
26
+ MAJOR = 0
27
+ # The minor version number, scoped to the {MAJOR} version number.
28
+ MINOR = 0
29
+ # The patch version number, scoped to the {MAJOR} and {MINOR} version numbers.
30
+ PATCH = 1
31
+
32
+ #
33
+ # Module Methods
34
+ #
35
+
36
+ # The full version string, including the {Master::Version::MAJOR},
37
+ # {Master::Version::MINOR}, {Master::Version::PATCH}, and optionally, the
38
+ # `Master::Version::PRERELEASE` in the
39
+ # {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0} format.
40
+ #
41
+ # @return [String] '{Master::Version::MAJOR}.{Master::Version::MINOR}.{Master::Version::PATCH}' on master.
42
+ # '{Master::Version::MAJOR}.{Master::Version::MINOR}.{Master::Version::PATCH}-PRERELEASE'
43
+ # on any branch other than master.
44
+ def self.full
45
+ version = "#{MAJOR}.#{MINOR}.#{PATCH}"
46
+
47
+ if defined? PRERELEASE
48
+ version = "#{version}-#{PRERELEASE}"
49
+ end
50
+
51
+ version
52
+ end
53
+
54
+ # The full gem version string, including the {Master::Version::MAJOR},
55
+ # {Master::Version::MINOR}, {Master::Version::PATCH}, and optionally, the
56
+ # `Master::Version::PRERELEASE` in the
57
+ # {http://guides.rubygems.org/specification-reference/#version RubyGems versioning} format.
58
+ #
59
+ # @return [String] '{Master::Version::MAJOR}.{Master::Version::MINOR}.{Master::Version::PATCH}'
60
+ # on master. '{Master::Version::MAJOR}.{Master::Version::MINOR}.{Master::Version::PATCH}.PRERELEASE'
61
+ # on any branch other than master.
62
+ def self.gem
63
+ full.gsub('-', '.pre.')
64
+ end
65
+ end
66
+
67
+ # (see Version.gem)
68
+ GEM_VERSION = Version.gem
69
+
70
+ # (see Version.full)
71
+ VERSION = Version.full
72
+ end
73
+
74
+ """
75
+
76
+ Scenario Outline: PRERELEASE on branch
77
+ Given I successfully run `bundle gem branch`
78
+ And I cd to "branch"
79
+ And I unset the environment variable "TRAVIS_BRANCH"
80
+ And I set the environment variables to:
81
+ | variable | value |
82
+ | TRAVIS_PULL_REQUEST | false |
83
+ And my git identity is configured
84
+ And I successfully run `git commit --message "bundle gem branch"`
85
+ And I successfully run `git checkout -b <branch>`
86
+ When I successfully run `metasploit-version install --force --no-bundle-install`
87
+ Then the file "lib/branch/version.rb" should contain exactly:
88
+ """
89
+ module Branch
90
+ # Holds components of {VERSION} as defined by {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0}.
91
+ module Version
92
+ #
93
+ # CONSTANTS
94
+ #
95
+
96
+ # The major version number.
97
+ MAJOR = 0
98
+ # The minor version number, scoped to the {MAJOR} version number.
99
+ MINOR = 0
100
+ # The patch version number, scoped to the {MAJOR} and {MINOR} version numbers.
101
+ PATCH = 1
102
+ # The prerelease version, scoped to the {MAJOR}, {MINOR}, and {PATCH} version numbers.
103
+ PRERELEASE = '<prerelease>'
104
+
105
+ #
106
+ # Module Methods
107
+ #
108
+
109
+ # The full version string, including the {Branch::Version::MAJOR},
110
+ # {Branch::Version::MINOR}, {Branch::Version::PATCH}, and optionally, the
111
+ # `Branch::Version::PRERELEASE` in the
112
+ # {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0} format.
113
+ #
114
+ # @return [String] '{Branch::Version::MAJOR}.{Branch::Version::MINOR}.{Branch::Version::PATCH}' on master.
115
+ # '{Branch::Version::MAJOR}.{Branch::Version::MINOR}.{Branch::Version::PATCH}-PRERELEASE'
116
+ # on any branch other than master.
117
+ def self.full
118
+ version = "#{MAJOR}.#{MINOR}.#{PATCH}"
119
+
120
+ if defined? PRERELEASE
121
+ version = "#{version}-#{PRERELEASE}"
122
+ end
123
+
124
+ version
125
+ end
126
+
127
+ # The full gem version string, including the {Branch::Version::MAJOR},
128
+ # {Branch::Version::MINOR}, {Branch::Version::PATCH}, and optionally, the
129
+ # `Branch::Version::PRERELEASE` in the
130
+ # {http://guides.rubygems.org/specification-reference/#version RubyGems versioning} format.
131
+ #
132
+ # @return [String] '{Branch::Version::MAJOR}.{Branch::Version::MINOR}.{Branch::Version::PATCH}'
133
+ # on master. '{Branch::Version::MAJOR}.{Branch::Version::MINOR}.{Branch::Version::PATCH}.PRERELEASE'
134
+ # on any branch other than master.
135
+ def self.gem
136
+ full.gsub('-', '.pre.')
137
+ end
138
+ end
139
+
140
+ # (see Version.gem)
141
+ GEM_VERSION = Version.gem
142
+
143
+ # (see Version.full)
144
+ VERSION = Version.full
145
+ end
146
+
147
+ """
148
+
149
+ Examples:
150
+ | branch | prerelease |
151
+ | staging/flood-release | flood-release |
152
+ | bug/MSP-666/nasty | nasty |
153
+ | chore/MSP-1234/recurring | recurring |
154
+ | feature/MSP-1337/super-cool | super-cool |
@@ -0,0 +1,32 @@
1
+ Feature: metasploit-version install's 'version_spec.rb' generates proper namespace from gem name
2
+
3
+ The version_spec.rb file from metasploit-version will use the fully-qualified name for the Version module under
4
+ the gem's namespace with proper conversion of underscored and dashes in the gem name to camel case and separate
5
+ modules, respectively
6
+
7
+ Scenario Outline:
8
+ Given I successfully run `bundle gem <gem_name>`
9
+ And I cd to "<gem_name>"
10
+ And my git identity is configured
11
+ And I successfully run `git commit --message "bundle gem <gem_name>"`
12
+ And I unset the environment variable "TRAVIS_BRANCH"
13
+ And I set the environment variables to:
14
+ | variable | value |
15
+ | TRAVIS_PULL_REQUEST | false |
16
+ When I successfully run `metasploit-version install --force --no-bundle-install`
17
+ Then the file "<version_spec_rb_path>" should contain exactly:
18
+ """
19
+ RSpec.describe <fully_qualified_version_module> do
20
+ it_should_behave_like 'Metasploit::Version Version Module'
21
+ end
22
+
23
+ """
24
+
25
+ Examples:
26
+ | gem_name | version_spec_rb_path | fully_qualified_version_module |
27
+ | single | spec/lib/single/version_spec.rb | Single::Version |
28
+ | two_words | spec/lib/two_words/version_spec.rb | TwoWords::Version |
29
+ | parent-child | spec/lib/parent/child/version_spec.rb | Parent::Child::Version |
30
+ | two_words-child | spec/lib/two_words/child/version_spec.rb | TwoWords::Child::Version |
31
+ | parent-two_words | spec/lib/parent/two_words/version_spec.rb | Parent::TwoWords::Version |
32
+ | two_words-more_words | spec/lib/two_words/more_words/version_spec.rb | TwoWords::MoreWords::Version |
@@ -0,0 +1,40 @@
1
+ Feature: metasploit-version install's 'version_spec.rb' catches when PRERELEASE is missing when branching from master
2
+
3
+ The version_spec.rb fiel from metasploit-version will catch errors if the user fails to add the PRERELEASE constant in
4
+ version.rb when branching from master.
5
+
6
+ Background:
7
+ Given I successfully run `bundle gem versioned`
8
+ And I cd to "versioned"
9
+ And my git identity is configured
10
+ And I successfully run `git commit --message "bundle gem versioned"`
11
+ And I unset the environment variable "TRAVIS_BRANCH"
12
+ And I set the environment variables to:
13
+ | variable | value |
14
+ | TRAVIS_PULL_REQUEST | false |
15
+
16
+ Scenario: Installing metasploit-version on feature branch
17
+ Given I successfully run `git checkout -b feature/MSP-1234/metasploit-version`
18
+ And I successfully run `metasploit-version install --force --no-bundle-install`
19
+ Then I successfully run `rake spec`
20
+
21
+ Scenario: Branching from master without adding PRERELEASE
22
+ And I successfully run `metasploit-version install --force --no-bundle-install`
23
+ And I successfully run `rake spec`
24
+ And I successfully run `git add *`
25
+ And I successfully run `git commit --all --message "metasploit-version install"`
26
+ And I successfully run `git checkout -b feature/MSP-1337/super-cool`
27
+ Then the file "lib/versioned/version.rb" should not contain " PRERELEASE ="
28
+ When I run `rake spec`
29
+ Then the exit status should not be 0
30
+ And the output should contain:
31
+ """
32
+ expected Versioned::Version::PRERELEASE to be defined.
33
+ Add the following to Versioned::Version:
34
+ """
35
+ And the output should contain:
36
+ """
37
+ # The prerelease version, scoped to the {PATCH} version number.
38
+ PRERELEASE = super-cool
39
+ """
40
+ And the output should contain " 1 failure"
@@ -0,0 +1,161 @@
1
+ Feature: metasploit-version install's version_spec.rb catches errors with PRERELEASE when branching from another branch
2
+
3
+ The version_spec.rb file from metasploit-version will catch errors if the user fails to update the PRERELEASE
4
+ constant in version.rb to when going from one branch to another.
5
+
6
+ Background:
7
+ Given I successfully run `bundle gem double_branched`
8
+ And I cd to "double_branched"
9
+ And my git identity is configured
10
+ And I successfully run `git commit --message "bundle gem double_branched"`
11
+ And I unset the environment variable "TRAVIS_BRANCH"
12
+ And I set the environment variables to:
13
+ | variable | value |
14
+ | TRAVIS_PULL_REQUEST | false |
15
+ And I successfully run `metasploit-version install --force --no-bundle-install`
16
+ And I successfully run `rake spec`
17
+ And I successfully run `git add *`
18
+ And I successfully run `git commit --all --message "metasploit-version install"`
19
+ And I successfully run `git checkout -b feature/MSP-1337/super-cool`
20
+ And I overwrite "lib/double_branched/version.rb" with:
21
+ """
22
+ module DoubleBranched
23
+ # Holds components of {VERSION} as defined by {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0}.
24
+ module Version
25
+ #
26
+ # CONSTANTS
27
+ #
28
+
29
+ # The major version number.
30
+ MAJOR = 0
31
+ # The minor version number, scoped to the {MAJOR} version number.
32
+ MINOR = 0
33
+ # The patch version number, scoped to the {MAJOR} and {MINOR} version numbers.
34
+ PATCH = 1
35
+ # The prerelease version, scoped to the {MAJOR}, {MINOR}, and {PATCH} version numbers.
36
+ PRERELEASE = 'super-cool'
37
+
38
+ #
39
+ # Module Methods
40
+ #
41
+
42
+ # The full version string, including the {DoubleBranched::Version::MAJOR},
43
+ # {DoubleBranched::Version::MINOR}, {DoubleBranched::Version::PATCH}, and optionally, the
44
+ # `DoubleBranched::Version::PRERELEASE` in the
45
+ # {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0} format.
46
+ #
47
+ # @return [String] '{DoubleBranched::Version::MAJOR}.{DoubleBranched::Version::MINOR}.{DoubleBranched::Version::PATCH}' on master.
48
+ # '{DoubleBranched::Version::MAJOR}.{DoubleBranched::Version::MINOR}.{DoubleBranched::Version::PATCH}-PRERELEASE'
49
+ # on any branch other than master.
50
+ def self.full
51
+ version = "#{MAJOR}.#{MINOR}.#{PATCH}"
52
+
53
+ if defined? PRERELEASE
54
+ version = "#{version}-#{PRERELEASE}"
55
+ end
56
+
57
+ version
58
+ end
59
+
60
+ # The full gem version string, including the {DoubleBranched::Version::MAJOR},
61
+ # {DoubleBranched::Version::MINOR}, {DoubleBranched::Version::PATCH}, and optionally, the
62
+ # `DoubleBranched::Version::PRERELEASE` in the
63
+ # {http://guides.rubygems.org/specification-reference/#version RubyGems versioning} format.
64
+ #
65
+ # @return [String] '{DoubleBranched::Version::MAJOR}.{DoubleBranched::Version::MINOR}.{DoubleBranched::Version::PATCH}'
66
+ # on master. '{DoubleBranched::Version::MAJOR}.{DoubleBranched::Version::MINOR}.{DoubleBranched::Version::PATCH}.PRERELEASE'
67
+ # on any branch other than master.
68
+ def self.gem
69
+ full.gsub('-', '.pre.')
70
+ end
71
+ end
72
+
73
+ # (see Version.gem)
74
+ GEM_VERSION = Version.gem
75
+
76
+ # (see Version.full)
77
+ VERSION = Version.full
78
+ end
79
+
80
+ """
81
+ And I successfully run `rake spec`
82
+ And I successfully run `git checkout -b bug/MSP-666/needed-for-super-cool`
83
+
84
+ Scenario: With changing PRERELEASE
85
+ Given I overwrite "lib/double_branched/version.rb" with:
86
+ """
87
+ module DoubleBranched
88
+ # Holds components of {VERSION} as defined by {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0}.
89
+ module Version
90
+ #
91
+ # CONSTANTS
92
+ #
93
+
94
+ # The major version number.
95
+ MAJOR = 0
96
+ # The minor version number, scoped to the {MAJOR} version number.
97
+ MINOR = 0
98
+ # The patch version number, scoped to the {MAJOR} and {MINOR} version numbers.
99
+ PATCH = 1
100
+ # The prerelease version, scoped to the {MAJOR}, {MINOR}, and {PATCH} version numbers.
101
+ PRERELEASE = 'needed-for-super-cool'
102
+
103
+ #
104
+ # Module Methods
105
+ #
106
+
107
+ # The full version string, including the {DoubleBranched::Version::MAJOR},
108
+ # {DoubleBranched::Version::MINOR}, {DoubleBranched::Version::PATCH}, and optionally, the
109
+ # `DoubleBranched::Version::PRERELEASE` in the
110
+ # {http://semver.org/spec/v2.0.0.html semantic versioning v2.0.0} format.
111
+ #
112
+ # @return [String] '{DoubleBranched::Version::MAJOR}.{DoubleBranched::Version::MINOR}.{DoubleBranched::Version::PATCH}' on master.
113
+ # '{DoubleBranched::Version::MAJOR}.{DoubleBranched::Version::MINOR}.{DoubleBranched::Version::PATCH}-PRERELEASE'
114
+ # on any branch other than master.
115
+ def self.full
116
+ version = "#{MAJOR}.#{MINOR}.#{PATCH}"
117
+
118
+ if defined? PRERELEASE
119
+ version = "#{version}-#{PRERELEASE}"
120
+ end
121
+
122
+ version
123
+ end
124
+
125
+ # The full gem version string, including the {DoubleBranched::Version::MAJOR},
126
+ # {DoubleBranched::Version::MINOR}, {DoubleBranched::Version::PATCH}, and optionally, the
127
+ # `DoubleBranched::Version::PRERELEASE` in the
128
+ # {http://guides.rubygems.org/specification-reference/#version RubyGems versioning} format.
129
+ #
130
+ # @return [String] '{DoubleBranched::Version::MAJOR}.{DoubleBranched::Version::MINOR}.{DoubleBranched::Version::PATCH}'
131
+ # on master. '{DoubleBranched::Version::MAJOR}.{DoubleBranched::Version::MINOR}.{DoubleBranched::Version::PATCH}.PRERELEASE'
132
+ # on any branch other than master.
133
+ def self.gem
134
+ full.gsub('-', '.pre.')
135
+ end
136
+ end
137
+
138
+ # (see Version.gem)
139
+ GEM_VERSION = Version.gem
140
+
141
+ # (see Version.full)
142
+ VERSION = Version.full
143
+ end
144
+
145
+ """
146
+ Then I successfully run `rake spec`
147
+
148
+ Scenario: Without changing PRERELEASE
149
+ Given the file "lib/double_branched/version.rb" should contain:
150
+ """
151
+ # The prerelease version, scoped to the {MAJOR}, {MINOR}, and {PATCH} version numbers.
152
+ PRERELEASE = 'super-cool'
153
+ """
154
+ When I run `rake spec`
155
+ Then the exit status should not be 0
156
+ And the output should contain:
157
+ """
158
+ expected: "needed-for-super-cool"
159
+ got: "super-cool"
160
+ """
161
+ And the output should contain " 1 failure"