metasploit_data_models 0.24.4 → 0.24.5

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 (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