metasploit_data_models 0.24.4 → 0.24.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +3 -3
  3. data/.travis.yml +3 -6
  4. data/CONTRIBUTING.md +52 -10
  5. data/Gemfile +8 -1
  6. data/Rakefile +0 -23
  7. data/app/models/mdm/api_key.rb +1 -41
  8. data/app/models/mdm/client.rb +1 -41
  9. data/app/models/mdm/cred.rb +19 -107
  10. data/app/models/mdm/event.rb +1 -48
  11. data/app/models/mdm/exploit_attempt.rb +16 -65
  12. data/app/models/mdm/exploited_host.rb +1 -28
  13. data/app/models/mdm/host_detail.rb +1 -45
  14. data/app/models/mdm/host_tag.rb +8 -6
  15. data/app/models/mdm/listener.rb +1 -53
  16. data/app/models/mdm/macro.rb +0 -42
  17. data/app/models/mdm/mod_ref.rb +0 -21
  18. data/app/models/mdm/module/action.rb +0 -15
  19. data/app/models/mdm/module/arch.rb +0 -10
  20. data/app/models/mdm/module/author.rb +0 -16
  21. data/app/models/mdm/module/mixin.rb +0 -13
  22. data/app/models/mdm/module/platform.rb +0 -11
  23. data/app/models/mdm/module/target.rb +0 -18
  24. data/app/models/mdm/nexpose_console.rb +4 -82
  25. data/app/models/mdm/profile.rb +0 -36
  26. data/app/models/mdm/route.rb +5 -17
  27. data/app/models/mdm/session_event.rb +1 -33
  28. data/app/models/mdm/tag.rb +10 -49
  29. data/app/models/mdm/task.rb +45 -94
  30. data/app/models/mdm/task_cred.rb +0 -29
  31. data/app/models/mdm/task_host.rb +0 -25
  32. data/app/models/mdm/task_service.rb +0 -25
  33. data/app/models/mdm/task_session.rb +0 -25
  34. data/app/models/mdm/user.rb +6 -188
  35. data/app/models/mdm/vuln_attempt.rb +12 -37
  36. data/app/models/mdm/vuln_detail.rb +5 -139
  37. data/app/models/mdm/vuln_ref.rb +1 -4
  38. data/app/models/mdm/web_form.rb +1 -35
  39. data/app/models/mdm/web_page.rb +1 -70
  40. data/app/models/mdm/web_site.rb +1 -51
  41. data/app/models/mdm/wmap_request.rb +0 -85
  42. data/app/models/mdm/wmap_target.rb +0 -40
  43. data/app/models/mdm/workspace.rb +14 -152
  44. data/app/models/metasploit_data_models/automatic_exploitation.rb +16 -0
  45. data/app/models/metasploit_data_models/automatic_exploitation/match.rb +24 -19
  46. data/app/models/metasploit_data_models/automatic_exploitation/match_result.rb +5 -33
  47. data/app/models/metasploit_data_models/automatic_exploitation/match_set.rb +4 -22
  48. data/app/models/metasploit_data_models/automatic_exploitation/run.rb +3 -13
  49. data/app/models/metasploit_data_models/ip_address/v4/segmented.rb +1 -1
  50. data/app/models/metasploit_data_models/module_run.rb +1 -1
  51. data/app/models/metasploit_data_models/search/visitor/where.rb +1 -1
  52. data/app/validators/ip_format_validator.rb +0 -4
  53. data/app/validators/parameters_validator.rb +0 -12
  54. data/app/validators/password_is_strong_validator.rb +1 -10
  55. data/lib/mdm/host/operating_system_normalization.rb +10 -7
  56. data/lib/metasploit_data_models.rb +0 -4
  57. data/lib/metasploit_data_models/engine.rb +0 -2
  58. data/lib/metasploit_data_models/serialized_prefs.rb +0 -6
  59. data/lib/metasploit_data_models/version.rb +10 -24
  60. data/lib/tasks/yard.rake +33 -0
  61. data/metasploit_data_models.gemspec +2 -9
  62. data/spec/app/models/mdm/api_key_spec.rb +3 -1
  63. data/spec/app/models/mdm/client_spec.rb +11 -9
  64. data/spec/app/models/mdm/cred_spec.rb +54 -42
  65. data/spec/app/models/mdm/event_spec.rb +23 -21
  66. data/spec/app/models/mdm/exploit_attempt_spec.rb +21 -19
  67. data/spec/app/models/mdm/exploited_host_spec.rb +13 -11
  68. data/spec/app/models/mdm/host_detail_spec.rb +17 -15
  69. data/spec/app/models/mdm/host_spec.rb +260 -261
  70. data/spec/app/models/mdm/host_tag_spec.rb +8 -6
  71. data/spec/app/models/mdm/listener_spec.rb +32 -30
  72. data/spec/app/models/mdm/loot_spec.rb +23 -21
  73. data/spec/app/models/mdm/macro_spec.rb +3 -1
  74. data/spec/app/models/mdm/mod_ref_spec.rb +3 -1
  75. data/spec/app/models/mdm/module/action_spec.rb +12 -10
  76. data/spec/app/models/mdm/module/arch_spec.rb +12 -10
  77. data/spec/app/models/mdm/module/author_spec.rb +17 -22
  78. data/spec/app/models/mdm/module/detail_spec.rb +75 -184
  79. data/spec/app/models/mdm/module/mixin_spec.rb +12 -10
  80. data/spec/app/models/mdm/module/platform_spec.rb +12 -10
  81. data/spec/app/models/mdm/module/ref_spec.rb +12 -10
  82. data/spec/app/models/mdm/module/target_spec.rb +15 -13
  83. data/spec/app/models/mdm/nexpose_console_spec.rb +37 -35
  84. data/spec/app/models/mdm/note_spec.rb +25 -23
  85. data/spec/app/models/mdm/profile_spec.rb +3 -1
  86. data/spec/app/models/mdm/ref_spec.rb +12 -10
  87. data/spec/app/models/mdm/route_spec.rb +8 -6
  88. data/spec/app/models/mdm/service_spec.rb +40 -38
  89. data/spec/app/models/mdm/session_event_spec.rb +12 -10
  90. data/spec/app/models/mdm/session_spec.rb +15 -13
  91. data/spec/app/models/mdm/tag_spec.rb +29 -29
  92. data/spec/app/models/mdm/task_cred_spec.rb +11 -9
  93. data/spec/app/models/mdm/task_host_spec.rb +11 -9
  94. data/spec/app/models/mdm/task_service_spec.rb +11 -9
  95. data/spec/app/models/mdm/task_session_spec.rb +9 -7
  96. data/spec/app/models/mdm/task_spec.rb +29 -27
  97. data/spec/app/models/mdm/user_spec.rb +19 -17
  98. data/spec/app/models/mdm/vuln_attempt_spec.rb +16 -14
  99. data/spec/app/models/mdm/vuln_detail_spec.rb +28 -26
  100. data/spec/app/models/mdm/vuln_ref_spec.rb +10 -8
  101. data/spec/app/models/mdm/vuln_spec.rb +26 -24
  102. data/spec/app/models/mdm/web_form_spec.rb +13 -11
  103. data/spec/app/models/mdm/web_page_spec.rb +21 -19
  104. data/spec/app/models/mdm/web_site_spec.rb +23 -21
  105. data/spec/app/models/mdm/web_vuln_spec.rb +65 -63
  106. data/spec/app/models/mdm/wmap_request_spec.rb +3 -1
  107. data/spec/app/models/mdm/wmap_target_spec.rb +3 -1
  108. data/spec/app/models/mdm/workspace_spec.rb +100 -97
  109. data/spec/app/models/metasploit_data_models/automatic_exploitation/match_result_spec.rb +5 -3
  110. data/spec/app/models/metasploit_data_models/automatic_exploitation/match_set_spec.rb +15 -13
  111. data/spec/app/models/metasploit_data_models/automatic_exploitation/match_spec.rb +3 -1
  112. data/spec/app/models/metasploit_data_models/automatic_exploitation/run_spec.rb +3 -1
  113. data/spec/app/models/metasploit_data_models/ip_address/v4/cidr_spec.rb +12 -10
  114. data/spec/app/models/metasploit_data_models/ip_address/v4/nmap_spec.rb +6 -4
  115. data/spec/app/models/metasploit_data_models/ip_address/v4/range_spec.rb +23 -21
  116. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/nmap/list_spec.rb +11 -9
  117. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/nmap/range_spec.rb +23 -21
  118. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/segmented_spec.rb +6 -4
  119. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/single_spec.rb +15 -22
  120. data/spec/app/models/metasploit_data_models/ip_address/v4/single_spec.rb +6 -4
  121. data/spec/app/models/metasploit_data_models/module_run_spec.rb +3 -1
  122. data/spec/app/models/metasploit_data_models/search/operation/ip_address_spec.rb +20 -18
  123. data/spec/app/models/metasploit_data_models/search/operation/port/number_spec.rb +8 -6
  124. data/spec/app/models/metasploit_data_models/search/operation/port/range_spec.rb +10 -8
  125. data/spec/app/models/metasploit_data_models/search/operation/range_spec.rb +10 -8
  126. data/spec/app/models/metasploit_data_models/search/operator/ip_address_spec.rb +4 -2
  127. data/spec/app/models/metasploit_data_models/search/operator/multitext_spec.rb +10 -8
  128. data/spec/app/models/metasploit_data_models/search/operator/port/list_spec.rb +8 -6
  129. data/spec/app/models/metasploit_data_models/search/visitor/attribute_spec.rb +11 -9
  130. data/spec/app/models/metasploit_data_models/search/visitor/includes_spec.rb +7 -5
  131. data/spec/app/models/metasploit_data_models/search/visitor/joins_spec.rb +19 -17
  132. data/spec/app/models/metasploit_data_models/search/visitor/method_spec.rb +7 -5
  133. data/spec/app/models/metasploit_data_models/search/visitor/relation_spec.rb +23 -61
  134. data/spec/app/models/metasploit_data_models/search/visitor/where_spec.rb +10 -8
  135. data/spec/app/validators/parameters_validator_spec.rb +29 -29
  136. data/spec/app/validators/password_is_strong_validator_spec.rb +46 -54
  137. data/spec/dummy/db/structure.sql +3403 -0
  138. data/spec/factories/mdm/module/details.rb +1 -1
  139. data/spec/lib/base64_serializer_spec.rb +19 -19
  140. data/spec/lib/metasploit_data_models/ip_address/cidr_spec.rb +12 -18
  141. data/spec/lib/metasploit_data_models/ip_address/range_spec.rb +6 -4
  142. data/spec/lib/metasploit_data_models/match/child_spec.rb +4 -2
  143. data/spec/lib/metasploit_data_models/match/parent_spec.rb +6 -4
  144. data/spec/lib/metasploit_data_models/version_spec.rb +141 -3
  145. data/spec/spec_helper.rb +12 -86
  146. data/spec/support/shared/examples/mdm/module/detail/does_not_support_stance_with_mtype.rb +2 -2
  147. data/spec/support/shared/examples/mdm/module/detail/supports_stance_with_mtype.rb +4 -4
  148. data/spec/support/shared/examples/metasploit_data_models/search/operation/ipaddress/match.rb +2 -2
  149. data/spec/support/shared/examples/metasploit_data_models/search/visitor/includes/visit/with_children.rb +5 -5
  150. data/spec/support/shared/examples/metasploit_data_models/search/visitor/includes/visit/with_metasploit_model_search_operation_base.rb +5 -5
  151. data/spec/support/shared/examples/metasploit_data_models/search/visitor/where/visit/with_equality.rb +3 -3
  152. data/spec/support/shared/examples/metasploit_data_models/search/visitor/where/visit/with_metasploit_model_search_group_base.rb +6 -7
  153. metadata +9 -67
  154. data/CHANGELOG.md +0 -6
  155. data/RELEASING.md +0 -88
  156. data/UPGRADING.md +0 -1
  157. data/lib/metasploit_data_models/automatic_exploitation.rb +0 -25
  158. data/spec/lib/metasploit_data_models_spec.rb +0 -4
@@ -1,6 +1,6 @@
1
1
  FactoryGirl.define do
2
2
  factory :mdm_module_detail, :class => Mdm::Module::Detail do
3
- transient do
3
+ ignore do
4
4
  root {
5
5
  MetasploitDataModels.root
6
6
  }
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- RSpec.describe MetasploitDataModels::Base64Serializer do
3
+ describe MetasploitDataModels::Base64Serializer do
4
4
  let(:base64_marshaled) do
5
5
  marshaled = Marshal.dump(unserialized)
6
6
 
@@ -30,7 +30,7 @@ RSpec.describe MetasploitDataModels::Base64Serializer do
30
30
 
31
31
  context 'CONSTANTS' do
32
32
  it 'should define DEFAULT' do
33
- expect(described_class::DEFAULT).to eq(default)
33
+ described_class::DEFAULT.should == default
34
34
  end
35
35
 
36
36
  context 'LOADERS' do
@@ -38,36 +38,36 @@ RSpec.describe MetasploitDataModels::Base64Serializer do
38
38
  first = described_class::LOADERS[0]
39
39
  deserialized = first.call(base64_marshaled)
40
40
 
41
- expect(deserialized).to eq(unserialized)
41
+ deserialized.should == unserialized
42
42
  end
43
43
 
44
44
  it 'should fallback to the old YAML format second' do
45
45
  second = described_class::LOADERS[1]
46
46
  deserialized = second.call(yaml)
47
47
 
48
- expect(deserialized).to eq(unserialized)
48
+ deserialized.should == unserialized
49
49
  end
50
50
 
51
51
  it 'should finally give up and just return the value' do
52
52
  last = described_class::LOADERS.last
53
53
  deserialized = last.call(unserialized)
54
54
 
55
- expect(deserialized).to eq(unserialized)
55
+ deserialized.should == unserialized
56
56
  end
57
57
  end
58
58
  end
59
59
 
60
60
  context '#default' do
61
61
  it 'should default to {}' do
62
- expect(base64_serializer.default).to eq({})
62
+ base64_serializer.default.should == {}
63
63
  end
64
64
 
65
65
  it 'should return a duplicate' do
66
66
  duplicate = base64_serializer.default
67
- value = double('Value')
67
+ value = mock('Value')
68
68
  duplicate[:key] = value
69
69
 
70
- expect(duplicate).not_to eq(base64_serializer.default)
70
+ duplicate.should_not == base64_serializer.default
71
71
  end
72
72
  end
73
73
 
@@ -75,7 +75,7 @@ RSpec.describe MetasploitDataModels::Base64Serializer do
75
75
  it 'should output Base64 encoded marshaled data' do
76
76
  dumped = base64_serializer.dump(unserialized)
77
77
 
78
- expect(dumped).to eq(base64_marshaled)
78
+ dumped.should == base64_marshaled
79
79
  end
80
80
  end
81
81
 
@@ -105,21 +105,21 @@ RSpec.describe MetasploitDataModels::Base64Serializer do
105
105
  end
106
106
 
107
107
  it 'should have :default in attributes' do
108
- expect(attributes).to have_key(:default)
108
+ attributes.should have_key(:default)
109
109
  end
110
110
 
111
111
  it 'should set default to :default value' do
112
- expect(base64_serializer.default).to eq(attributes[:default])
112
+ base64_serializer.default.should == attributes[:default]
113
113
  end
114
114
  end
115
115
 
116
116
  context 'without :default' do
117
117
  it 'should not have :default in attributes' do
118
- expect(attributes).not_to have_key(:default)
118
+ attributes.should_not have_key(:default)
119
119
  end
120
120
 
121
121
  it 'should default #default to DEFAULT' do
122
- expect(base64_serializer.default).to eq(default)
122
+ base64_serializer.default.should == default
123
123
  end
124
124
  end
125
125
  end
@@ -131,11 +131,11 @@ RSpec.describe MetasploitDataModels::Base64Serializer do
131
131
  end
132
132
 
133
133
  it 'should return #default' do
134
- default = double('Default')
135
- allow(base64_serializer).to receive(:default).and_return(default)
134
+ default = mock('Default')
135
+ base64_serializer.stub(:default => default)
136
136
  deserialized = base64_serializer.load(serialized)
137
137
 
138
- expect(deserialized).to eq(default)
138
+ deserialized.should == default
139
139
  end
140
140
  end
141
141
 
@@ -143,7 +143,7 @@ RSpec.describe MetasploitDataModels::Base64Serializer do
143
143
  it 'should return unserialized' do
144
144
  deserialized = base64_serializer.load(base64_marshaled)
145
145
 
146
- expect(deserialized).to eq(unserialized)
146
+ deserialized.should == unserialized
147
147
  end
148
148
 
149
149
  end
@@ -152,7 +152,7 @@ RSpec.describe MetasploitDataModels::Base64Serializer do
152
152
  it 'should return unserialized' do
153
153
  deserialized = base64_serializer.load(yaml)
154
154
 
155
- expect(deserialized).to eq(unserialized)
155
+ deserialized.should == unserialized
156
156
  end
157
157
  end
158
158
 
@@ -165,7 +165,7 @@ RSpec.describe MetasploitDataModels::Base64Serializer do
165
165
  it 'should return raw value' do
166
166
  deserialized = base64_serializer.load(raw_value)
167
167
 
168
- expect(deserialized).to eq(raw_value)
168
+ deserialized.should == raw_value
169
169
  end
170
170
  end
171
171
  end
@@ -1,4 +1,6 @@
1
- RSpec.describe MetasploitDataModels::IPAddress::CIDR do
1
+ require 'spec_helper'
2
+
3
+ describe MetasploitDataModels::IPAddress::CIDR do
2
4
  subject(:including_class_instance) {
3
5
  including_class.new(
4
6
  value: formatted_value
@@ -78,7 +80,7 @@ RSpec.describe MetasploitDataModels::IPAddress::CIDR do
78
80
  described_class::SEPARATOR
79
81
  }
80
82
 
81
- it { is_expected.to eq('/') }
83
+ it { should == '/' }
82
84
  end
83
85
  end
84
86
 
@@ -108,7 +110,7 @@ RSpec.describe MetasploitDataModels::IPAddress::CIDR do
108
110
  true
109
111
  }
110
112
 
111
- it { is_expected.not_to include(invalid_error) }
113
+ it { should_not include(invalid_error) }
112
114
  end
113
115
 
114
116
  context 'without valid' do
@@ -116,7 +118,7 @@ RSpec.describe MetasploitDataModels::IPAddress::CIDR do
116
118
  false
117
119
  }
118
120
 
119
- it { is_expected.to include(invalid_error) }
121
+ it { should include(invalid_error) }
120
122
  end
121
123
  end
122
124
 
@@ -129,7 +131,7 @@ RSpec.describe MetasploitDataModels::IPAddress::CIDR do
129
131
  I18n.translate!('errors.messages.blank')
130
132
  }
131
133
 
132
- it { is_expected.to include(blank_error) }
134
+ it { should include(blank_error) }
133
135
  end
134
136
  end
135
137
 
@@ -164,7 +166,7 @@ RSpec.describe MetasploitDataModels::IPAddress::CIDR do
164
166
  end
165
167
  }
166
168
 
167
- it { is_expected.to be_nil }
169
+ it { should be_nil }
168
170
  end
169
171
  end
170
172
 
@@ -206,8 +208,8 @@ RSpec.describe MetasploitDataModels::IPAddress::CIDR do
206
208
  regexp.names
207
209
  }
208
210
 
209
- it { is_expected.to include 'address' }
210
- it { is_expected.to include 'prefix_length' }
211
+ it { should include 'address' }
212
+ it { should include 'prefix_length' }
211
213
  end
212
214
  end
213
215
 
@@ -220,17 +222,9 @@ RSpec.describe MetasploitDataModels::IPAddress::CIDR do
220
222
  Class.new(Metasploit::Model::Base) {
221
223
  attr_accessor :value
222
224
  }.tap { |address_class|
223
- outer_segment_class = self.segment_class
224
-
225
- address_class.define_singleton_method(:segment_class) do
226
- outer_segment_class
227
- end
228
225
 
229
- outer_segment_count = self.segment_count
230
-
231
- address_class.define_singleton_method(:segment_count) do
232
- outer_segment_count
233
- end
226
+ allow(address_class).to receive(:segment_class).and_return(segment_class)
227
+ allow(address_class).to receive(:segment_count).and_return(segment_count)
234
228
  }
235
229
  }
236
230
 
@@ -1,4 +1,6 @@
1
- RSpec.describe MetasploitDataModels::IPAddress::Range do
1
+ require 'spec_helper'
2
+
3
+ describe MetasploitDataModels::IPAddress::Range do
2
4
  subject(:range) {
3
5
  range_class.new
4
6
  }
@@ -33,7 +35,7 @@ RSpec.describe MetasploitDataModels::IPAddress::Range do
33
35
  'invalid_value'
34
36
  }
35
37
 
36
- it { is_expected.to be_nil }
38
+ it { should be_nil }
37
39
  end
38
40
  end
39
41
 
@@ -42,7 +44,7 @@ RSpec.describe MetasploitDataModels::IPAddress::Range do
42
44
  nil
43
45
  }
44
46
 
45
- it { is_expected.to be_nil }
47
+ it { should be_nil }
46
48
  end
47
49
  end
48
50
  end
@@ -65,7 +67,7 @@ RSpec.describe MetasploitDataModels::IPAddress::Range do
65
67
  described_class::SEPARATOR
66
68
  }
67
69
 
68
- it { is_expected.to eq('-') }
70
+ it { should == '-' }
69
71
  end
70
72
  end
71
73
 
@@ -1,4 +1,6 @@
1
- RSpec.describe MetasploitDataModels::Match::Child do
1
+ require 'spec_helper'
2
+
3
+ describe MetasploitDataModels::Match::Child do
2
4
  let(:extending_class) {
3
5
  # capture as local for Class.new block scope
4
6
  described_class = self.described_class
@@ -52,7 +54,7 @@ RSpec.describe MetasploitDataModels::Match::Child do
52
54
  '1,2-3'
53
55
  end
54
56
 
55
- it { is_expected.to be_nil }
57
+ it { should be_nil }
56
58
  end
57
59
  end
58
60
  end
@@ -1,4 +1,6 @@
1
- RSpec.describe MetasploitDataModels::Match::Parent do
1
+ require 'spec_helper'
2
+
3
+ describe MetasploitDataModels::Match::Parent do
2
4
  let(:including_class) {
3
5
  described_class = self.described_class
4
6
 
@@ -17,7 +19,7 @@ RSpec.describe MetasploitDataModels::Match::Parent do
17
19
  }
18
20
 
19
21
  context 'default' do
20
- it { is_expected.to eq([]) }
22
+ it { should == [] }
21
23
  end
22
24
  end
23
25
 
@@ -84,7 +86,7 @@ RSpec.describe MetasploitDataModels::Match::Parent do
84
86
  match_child
85
87
  end
86
88
 
87
- it { is_expected.to be_nil }
89
+ it { should be_nil }
88
90
  end
89
91
  end
90
92
 
@@ -94,7 +96,7 @@ RSpec.describe MetasploitDataModels::Match::Parent do
94
96
  }
95
97
 
96
98
  context 'default' do
97
- it { is_expected.to eq([]) }
99
+ it { should == [] }
98
100
  end
99
101
 
100
102
  context 'with class names' do
@@ -1,3 +1,141 @@
1
- RSpec.describe MetasploitDataModels::Version do
2
- it_should_behave_like 'Metasploit::Version Version Module'
3
- end
1
+ require 'spec_helper'
2
+
3
+ describe MetasploitDataModels::Version do
4
+ context 'CONSTANTS' do
5
+ context 'MAJOR' do
6
+ subject(:major) do
7
+ described_class::MAJOR
8
+ end
9
+
10
+ it 'is 0 because the API is not locked yet' do
11
+ expect(major).to eq(0)
12
+ end
13
+ end
14
+
15
+ context 'MINOR' do
16
+ subject(:minor) do
17
+ described_class::MINOR
18
+ end
19
+
20
+ it { should be_a Integer }
21
+ end
22
+
23
+ context 'PATCH' do
24
+ subject(:patch) do
25
+ described_class::PATCH
26
+ end
27
+
28
+ it { should be_a Integer }
29
+ end
30
+
31
+ pull_request = ENV['TRAVIS_PULL_REQUEST']
32
+
33
+ # a pull request cannot check PRERELEASE because it will be tested in the target branch, but the source itself
34
+ # is from the source branch and so has the source branch PRERELEASE.
35
+ #
36
+ # PRERELEASE can only be set appropriately for a merge by merging to the target branch and then updating PRERELEASE
37
+ # on the target branch before committing and/or pushing to github and travis-ci.
38
+ if pull_request.nil? || pull_request == 'false'
39
+ context 'PREPRELEASE' do
40
+ subject(:prerelease) do
41
+ described_class::PRERELEASE
42
+ end
43
+
44
+ branch = ENV['TRAVIS_BRANCH']
45
+
46
+ if branch.blank?
47
+ branch = `git rev-parse --abbrev-ref HEAD`.strip
48
+ end
49
+
50
+ if branch == 'master'
51
+ it 'does not have a PRERELEASE' do
52
+ expect(defined? described_class::PRERELEASE).to be_nil
53
+ end
54
+ else
55
+ branch_regex = /\A(?<type>bug|chore|feature|staging)(\/(?<story>[^\/]+))?\/(?<prerelease>[^\/]+)\z/
56
+ match = branch.match(branch_regex)
57
+
58
+ if match
59
+ it 'matches the branch relative name' do
60
+ expect(prerelease).to eq(match[:prerelease])
61
+ end
62
+ else
63
+ tag_regex = /\Av(?<major>\d+).(?<minor>\d+).(?<patch>\d+)(\.pre\.(?<prerelease>.*))?\z/
64
+ # travis-ci sets TRAVIS_BRANCH to the tag name for tag builds
65
+ match = branch.match(tag_regex)
66
+
67
+ if match
68
+ tag_prerelease = match[:prerelease]
69
+
70
+ if tag_prerelease
71
+ it 'matches the tag prerelease converted from a gem version to a VERSION' do
72
+ expect(prerelease).to eq(tag_prerelease.gsub('.pre.', '-'))
73
+ end
74
+ else
75
+ it 'does not have a PRERELEASE' do
76
+ expect(defined? described_class::PRERELEASE).to be_nil
77
+ end
78
+ end
79
+ else
80
+ it 'has a abbreviated reference that can be parsed for prerelease' do
81
+ fail "Do not know how to parse #{branch.inspect} for PRERELEASE"
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ context 'full' do
91
+ subject(:full) do
92
+ described_class.full
93
+ end
94
+
95
+ #
96
+ # lets
97
+ #
98
+
99
+ let(:major) do
100
+ 1
101
+ end
102
+
103
+ let(:minor) do
104
+ 2
105
+ end
106
+
107
+ let(:patch) do
108
+ 3
109
+ end
110
+
111
+ before(:each) do
112
+ stub_const("#{described_class}::MAJOR", major)
113
+ stub_const("#{described_class}::MINOR", minor)
114
+ stub_const("#{described_class}::PATCH", patch)
115
+ end
116
+
117
+ context 'with PRERELEASE' do
118
+ let(:prerelease) do
119
+ 'prerelease'
120
+ end
121
+
122
+ before(:each) do
123
+ stub_const("#{described_class}::PRERELEASE", prerelease)
124
+ end
125
+
126
+ it 'is <major>.<minor>.<patch>-<prerelease>' do
127
+ expect(full).to eq("#{major}.#{minor}.#{patch}-#{prerelease}")
128
+ end
129
+ end
130
+
131
+ context 'without PRERELEASE' do
132
+ before(:each) do
133
+ hide_const("#{described_class}::PRERELEASE")
134
+ end
135
+
136
+ it 'is <major>.<minor>.<patch>' do
137
+ expect(full).to eq("#{major}.#{minor}.#{patch}")
138
+ end
139
+ end
140
+ end
141
+ end