inspec 2.2.70 → 2.2.78
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +28 -12
- data/docs/profiles.md +28 -0
- data/docs/resources/azure_generic_resource.md.erb +1 -1
- data/inspec.gemspec +1 -1
- data/lib/bundles/inspec-compliance/api.rb +14 -20
- data/lib/bundles/inspec-compliance/target.rb +67 -36
- data/lib/fetchers/url.rb +6 -2
- data/lib/inspec/metadata.rb +2 -1
- data/lib/inspec/profile.rb +10 -1
- data/lib/inspec/rule.rb +4 -3
- data/lib/inspec/schema.rb +5 -0
- data/lib/inspec/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 842e90c7b84b1e95a0ca1989f26048ab81a67a5e4f602461c7f6eb6a9ac8a0df
|
4
|
+
data.tar.gz: 0c9220d4fdd48bece5981ff0a7599e070742208de5520f449d79068031c9b839
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d52ea98ca54e58a0191968e445c7e5f32c7cac9fd58be5f7e00acba5fed6ec5bb4f9cb9bcdc8bc1fe988b925f8c9c64a80283a4309b20135d1d2d395362c8ff0
|
7
|
+
data.tar.gz: ad42da9cb733b08b50f5082742fda88147ca7f6c8a3739fac19ad74d4fe5acc88f5ce92ff4e7be28e013637dbae009fccb32811ef9baed9727a66cb4b8d5236f
|
data/CHANGELOG.md
CHANGED
@@ -1,35 +1,51 @@
|
|
1
1
|
# Change Log
|
2
2
|
<!-- usage documentation: http://expeditor-docs.es.chef.io/configuration/changelog/ -->
|
3
|
-
<!-- latest_release 2.2.
|
4
|
-
## [v2.2.
|
3
|
+
<!-- latest_release 2.2.78 -->
|
4
|
+
## [v2.2.78](https://github.com/inspec/inspec/tree/v2.2.78) (2018-08-30)
|
5
5
|
|
6
6
|
#### Merged Pull Requests
|
7
|
-
-
|
7
|
+
- Update demo site nom packages [#3343](https://github.com/inspec/inspec/pull/3343) ([miah](https://github.com/miah))
|
8
8
|
<!-- latest_release -->
|
9
9
|
|
10
|
-
<!-- release_rollup since=2.2.
|
11
|
-
### Changes since 2.2.
|
10
|
+
<!-- release_rollup since=2.2.70 -->
|
11
|
+
### Changes since 2.2.70 release
|
12
12
|
|
13
|
-
####
|
14
|
-
-
|
13
|
+
#### New Features
|
14
|
+
- Add HTTP basic auth for URL based inspec deps [#3341](https://github.com/inspec/inspec/pull/3341) ([frezbo](https://github.com/frezbo)) <!-- 2.2.77 -->
|
15
|
+
- Support erb rendering [#3338](https://github.com/inspec/inspec/pull/3338) ([frezbo](https://github.com/frezbo)) <!-- 2.2.76 -->
|
15
16
|
|
16
17
|
#### Bug Fixes
|
17
|
-
-
|
18
|
+
- fix skip message not being passed for merge [#3329](https://github.com/inspec/inspec/pull/3329) ([frezbo](https://github.com/frezbo)) <!-- 2.2.73 -->
|
18
19
|
|
19
20
|
#### Merged Pull Requests
|
20
|
-
-
|
21
|
-
-
|
22
|
-
-
|
21
|
+
- Update demo site nom packages [#3343](https://github.com/inspec/inspec/pull/3343) ([miah](https://github.com/miah)) <!-- 2.2.78 -->
|
22
|
+
- Fix the brew command to install inspec [#3335](https://github.com/inspec/inspec/pull/3335) ([tas50](https://github.com/tas50)) <!-- 2.2.75 -->
|
23
|
+
- Convert legacy supports to their platform counterparts [#3333](https://github.com/inspec/inspec/pull/3333) ([jquick](https://github.com/jquick)) <!-- 2.2.74 -->
|
24
|
+
- bump inspec/train version [#3331](https://github.com/inspec/inspec/pull/3331) ([tomqwu](https://github.com/tomqwu)) <!-- 2.2.72 -->
|
25
|
+
- Cached profiles with Compliance Fetcher [#3221](https://github.com/inspec/inspec/pull/3221) ([itmustbejj](https://github.com/itmustbejj)) <!-- 2.2.71 -->
|
23
26
|
<!-- release_rollup -->
|
24
27
|
|
25
28
|
<!-- latest_stable_release -->
|
29
|
+
## [v2.2.70](https://github.com/inspec/inspec/tree/v2.2.70) (2018-08-24)
|
30
|
+
|
31
|
+
#### Enhancements
|
32
|
+
- Infer `--sudo` when `--sudo-password` is used [#3313](https://github.com/inspec/inspec/pull/3313) ([jerryaldrichiii](https://github.com/jerryaldrichiii))
|
33
|
+
|
34
|
+
#### Bug Fixes
|
35
|
+
- Fix skip hash being passed instead of boolean value [#3323](https://github.com/inspec/inspec/pull/3323) ([frezbo](https://github.com/frezbo))
|
36
|
+
|
37
|
+
#### Merged Pull Requests
|
38
|
+
- Add cloudlinux under redhat family [#2935](https://github.com/inspec/inspec/pull/2935) ([tarcinil](https://github.com/tarcinil))
|
39
|
+
- Suppress logs for json-automate reporter [#3324](https://github.com/inspec/inspec/pull/3324) ([jquick](https://github.com/jquick))
|
40
|
+
- Rebuild InSpec omni bundles [#3327](https://github.com/inspec/inspec/pull/3327) ([jquick](https://github.com/jquick))
|
41
|
+
<!-- latest_stable_release -->
|
42
|
+
|
26
43
|
## [v2.2.64](https://github.com/inspec/inspec/tree/v2.2.64) (2018-08-17)
|
27
44
|
|
28
45
|
#### Merged Pull Requests
|
29
46
|
- Update `only_if` to allow user specified messages. [#3267](https://github.com/inspec/inspec/pull/3267) ([miah](https://github.com/miah))
|
30
47
|
- Allow the jsonAutomate report to be executed from cli [#3285](https://github.com/inspec/inspec/pull/3285) ([jquick](https://github.com/jquick))
|
31
48
|
- Dummy PR to bump expeditor version. [#3298](https://github.com/inspec/inspec/pull/3298) ([jquick](https://github.com/jquick))
|
32
|
-
<!-- latest_stable_release -->
|
33
49
|
|
34
50
|
## [v2.2.61](https://github.com/inspec/inspec/tree/v2.2.61) (2018-08-09)
|
35
51
|
|
data/docs/profiles.md
CHANGED
@@ -71,6 +71,24 @@ depends:
|
|
71
71
|
inspec_version: "~> 2.1"
|
72
72
|
```
|
73
73
|
|
74
|
+
The `inspec.yml` also supports embedded ERB in the file. For example:
|
75
|
+
|
76
|
+
```YAML
|
77
|
+
name: dummy
|
78
|
+
title: InSpec Profile
|
79
|
+
maintainer: The Authors
|
80
|
+
copyright: The Authors
|
81
|
+
copyright_email: you@example.com
|
82
|
+
license: Apache-2.0
|
83
|
+
summary: An InSpec Compliance Profile
|
84
|
+
version: 0.1.0
|
85
|
+
depends:
|
86
|
+
- name: inherit
|
87
|
+
url: "https://artifactory.com/artifactory/example-repo-local/inspec/0.4.1.tar.gz"
|
88
|
+
username: <%= ENV['USERNAME'] %>
|
89
|
+
password: <%= ENV['API_KEY'] %>
|
90
|
+
```
|
91
|
+
|
74
92
|
## Verify Profiles
|
75
93
|
|
76
94
|
Use the `inspec check` command to verify the implementation of a profile:
|
@@ -181,6 +199,16 @@ depends:
|
|
181
199
|
url: https://github.com/myusername/myprofile-repo/archive/master.tar.gz
|
182
200
|
```
|
183
201
|
|
202
|
+
`url` also supports basic authentication.
|
203
|
+
|
204
|
+
```YAML
|
205
|
+
depends:
|
206
|
+
- name: my-profile
|
207
|
+
url: https://my.domain/path/to/profile.tgz
|
208
|
+
username: user
|
209
|
+
password: password
|
210
|
+
```
|
211
|
+
|
184
212
|
### git
|
185
213
|
|
186
214
|
A `git` setting specifies a profile that is located in a git repository, with optional settings for branch, tag, commit, and version. The source location is translated into a URL upon resolution. This type of dependency supports version constraints via semantic versioning as git tags.
|
@@ -180,4 +180,4 @@ This InSpec audit resource has the following special matchers. For a full list o
|
|
180
180
|
|
181
181
|
Please see the integration tests for in depth examples of how this resource can be used.
|
182
182
|
|
183
|
-
[Inspec Integration Tests for Azure Generic Resources](https://github.com/chef/inspec/tree/master/test/azure/verify/controls)
|
183
|
+
[Inspec Integration Tests for Azure Generic Resources](https://github.com/chef/inspec/tree/master/test/integration/azure/verify/controls)
|
data/inspec.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
|
27
27
|
spec.required_ruby_version = '>= 2.3'
|
28
28
|
|
29
|
-
spec.add_dependency 'train', '~> 1.4', '>= 1.4.
|
29
|
+
spec.add_dependency 'train', '~> 1.4', '>= 1.4.35'
|
30
30
|
spec.add_dependency 'thor', '~> 0.20'
|
31
31
|
spec.add_dependency 'json', '>= 1.8', '< 3.0'
|
32
32
|
spec.add_dependency 'method_source', '~> 0.8'
|
@@ -19,7 +19,7 @@ module Compliance
|
|
19
19
|
# return all compliance profiles available for the user
|
20
20
|
# the user is either specified in the options hash or by default
|
21
21
|
# the username of the account is used that is logged in
|
22
|
-
def self.profiles(config) # rubocop:disable PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/MethodLength
|
22
|
+
def self.profiles(config, profile_filter = nil) # rubocop:disable PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/MethodLength
|
23
23
|
owner = config['owner'] || config['user']
|
24
24
|
|
25
25
|
# Chef Compliance
|
@@ -36,9 +36,14 @@ module Compliance
|
|
36
36
|
end
|
37
37
|
|
38
38
|
headers = get_headers(config)
|
39
|
+
if profile_filter
|
40
|
+
_owner, id, ver = profile_split(profile_filter)
|
41
|
+
else
|
42
|
+
id, ver = nil
|
43
|
+
end
|
39
44
|
|
40
45
|
if is_automate2_server?(config)
|
41
|
-
body = { owner: owner }.to_json
|
46
|
+
body = { owner: owner, name: id }.to_json
|
42
47
|
response = Compliance::HTTP.post_with_headers(url, headers, body, config['insecure'])
|
43
48
|
else
|
44
49
|
response = Compliance::HTTP.get(url, headers, config['insecure'])
|
@@ -69,6 +74,10 @@ module Compliance
|
|
69
74
|
e
|
70
75
|
}
|
71
76
|
end
|
77
|
+
# filter by name and version if they were specified in profile_filter
|
78
|
+
mapped_profiles.select! do |p|
|
79
|
+
(!ver || p['version'] == ver) && (!id || p['name'] == id)
|
80
|
+
end
|
72
81
|
return msg, mapped_profiles
|
73
82
|
when '401'
|
74
83
|
msg = '401 Unauthorized. Please check your token.'
|
@@ -101,25 +110,10 @@ module Compliance
|
|
101
110
|
parsed
|
102
111
|
end
|
103
112
|
|
104
|
-
# verifies that a profile
|
113
|
+
# verifies that a profile exists
|
105
114
|
def self.exist?(config, profile)
|
106
|
-
|
107
|
-
|
108
|
-
# ensure that we do not manipulate the configuration object
|
109
|
-
user_config = config.dup
|
110
|
-
user_config['owner'] = owner
|
111
|
-
_msg, profiles = Compliance::API.profiles(user_config)
|
112
|
-
|
113
|
-
if !profiles.empty?
|
114
|
-
profiles.any? do |p|
|
115
|
-
profile_owner = p['owner_id'] || p['owner']
|
116
|
-
profile_owner == owner &&
|
117
|
-
p['name'] == id &&
|
118
|
-
(ver.nil? || p['version'] == ver)
|
119
|
-
end
|
120
|
-
else
|
121
|
-
false
|
122
|
-
end
|
115
|
+
_msg, profiles = Compliance::API.profiles(config, profile)
|
116
|
+
!profiles.empty?
|
123
117
|
end
|
124
118
|
|
125
119
|
def self.upload(config, owner, profile_name, archive_path)
|
@@ -13,50 +13,81 @@ module Compliance
|
|
13
13
|
class Fetcher < Fetchers::Url
|
14
14
|
name 'compliance'
|
15
15
|
priority 500
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
16
|
+
attr_reader :upstream_sha256
|
17
|
+
|
18
|
+
def initialize(target, opts)
|
19
|
+
super(target, opts)
|
20
|
+
if target.is_a?(Hash) && target.key?(:url)
|
21
|
+
@target = target[:url]
|
22
|
+
@upstream_sha256 = target[:sha256]
|
23
|
+
elsif target.is_a?(String)
|
24
|
+
@target = target
|
25
|
+
@upstream_sha256 = ''
|
26
|
+
end
|
27
|
+
end
|
22
28
|
|
23
|
-
|
29
|
+
def sha256
|
30
|
+
upstream_sha256.empty? ? super : upstream_sha256
|
31
|
+
end
|
24
32
|
|
25
|
-
|
26
|
-
if
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
msg = 'inspec compliance login https://your_automate2_server --user USER --token APITOKEN'
|
39
|
-
else
|
40
|
-
server = 'compliance'
|
41
|
-
msg = "inspec compliance login https://your_compliance_server --user admin --insecure --token 'PASTE TOKEN HERE' "
|
42
|
-
end
|
43
|
-
raise Inspec::FetcherFailure, <<~EOF
|
33
|
+
def self.check_compliance_token(config)
|
34
|
+
if config['token'].nil? && config['refresh_token'].nil?
|
35
|
+
if config['server_type'] == 'automate'
|
36
|
+
server = 'automate'
|
37
|
+
msg = 'inspec compliance login https://your_automate_server --user USER --ent ENT --dctoken DCTOKEN or --token USERTOKEN'
|
38
|
+
elsif config['server_type'] == 'automate2'
|
39
|
+
server = 'automate2'
|
40
|
+
msg = 'inspec compliance login https://your_automate2_server --user USER --token APITOKEN'
|
41
|
+
else
|
42
|
+
server = 'compliance'
|
43
|
+
msg = "inspec compliance login https://your_compliance_server --user admin --insecure --token 'PASTE TOKEN HERE' "
|
44
|
+
end
|
45
|
+
raise Inspec::FetcherFailure, <<~EOF
|
44
46
|
|
45
|
-
|
46
|
-
|
47
|
+
Cannot fetch #{uri} because your #{server} token has not been
|
48
|
+
configured.
|
47
49
|
|
48
|
-
|
50
|
+
Please login using
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
-
|
52
|
+
#{msg}
|
53
|
+
EOF
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.get_target_uri(target)
|
58
|
+
if target.is_a?(String) && URI(target).scheme == 'compliance'
|
59
|
+
URI(target)
|
60
|
+
elsif target.respond_to?(:key?) && target.key?(:compliance)
|
61
|
+
URI("compliance://#{target[:compliance]}")
|
62
|
+
end
|
63
|
+
end
|
53
64
|
|
65
|
+
def self.resolve(target)
|
66
|
+
uri = get_target_uri(target)
|
67
|
+
return nil if uri.nil?
|
68
|
+
|
69
|
+
config = Compliance::Configuration.new
|
70
|
+
profile = Compliance::API.sanitize_profile_name(uri)
|
71
|
+
profile_fetch_url = Compliance::API.target_url(config, profile)
|
72
|
+
# we have detailed information available in our lockfile, no need to ask the server
|
73
|
+
if target.respond_to?(:key?) && target.key?(:sha256)
|
74
|
+
profile_checksum = target[:sha256]
|
75
|
+
else
|
76
|
+
check_compliance_token(config)
|
54
77
|
# verifies that the target e.g base/ssh exists
|
55
|
-
|
56
|
-
|
78
|
+
# Call profiles directly instead of exist? to capture the results
|
79
|
+
# so we can access the upstream sha256 from the results.
|
80
|
+
_msg, profile_result = Compliance::API.profiles(config, profile)
|
81
|
+
if profile_result.empty?
|
57
82
|
raise Inspec::FetcherFailure, "The compliance profile #{profile} was not found on the configured compliance server"
|
83
|
+
else
|
84
|
+
# Guarantee sorting by verison and grab the latest.
|
85
|
+
# If version was specified, it will be the first and only result.
|
86
|
+
# Note we are calling the sha256 as a string, not a symbol since
|
87
|
+
# it was returned as json from the Compliance API.
|
88
|
+
profile_info = profile_result.sort_by { |x| Gem::Version.new(x['version']) }[0]
|
89
|
+
profile_checksum = profile_info.key?('sha256') ? profile_info['sha256'] : ''
|
58
90
|
end
|
59
|
-
profile_fetch_url = Compliance::API.target_url(config, profile)
|
60
91
|
end
|
61
92
|
# We need to pass the token to the fetcher
|
62
93
|
config['token'] = Compliance::API.get_token(config)
|
@@ -65,7 +96,7 @@ module Compliance
|
|
65
96
|
profile_stub = profile || target[:compliance]
|
66
97
|
config['profile'] = Compliance::API.profile_split(profile_stub)
|
67
98
|
|
68
|
-
new(profile_fetch_url, config)
|
99
|
+
new({ url: profile_fetch_url, sha256: profile_checksum }, config)
|
69
100
|
rescue URI::Error => _e
|
70
101
|
nil
|
71
102
|
end
|
data/lib/fetchers/url.rb
CHANGED
@@ -21,17 +21,19 @@ module Fetchers
|
|
21
21
|
|
22
22
|
def self.resolve(target, opts = {})
|
23
23
|
if target.is_a?(Hash) && target.key?(:url)
|
24
|
-
resolve_from_string(target[:url], opts)
|
24
|
+
resolve_from_string(target[:url], opts, target[:username], target[:password])
|
25
25
|
elsif target.is_a?(String)
|
26
26
|
resolve_from_string(target, opts)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
def self.resolve_from_string(target, opts)
|
30
|
+
def self.resolve_from_string(target, opts, username = nil, password = nil)
|
31
31
|
uri = URI.parse(target)
|
32
32
|
return nil if uri.nil? or uri.scheme.nil?
|
33
33
|
return nil unless %{ http https }.include? uri.scheme
|
34
34
|
target = transform(target)
|
35
|
+
opts[:username] = username if username
|
36
|
+
opts[:password] = password if password
|
35
37
|
new(target, opts)
|
36
38
|
rescue URI::Error
|
37
39
|
nil
|
@@ -223,6 +225,8 @@ module Fetchers
|
|
223
225
|
opts['Authorization'] = "Bearer #{@token}"
|
224
226
|
end
|
225
227
|
|
228
|
+
opts[:http_basic_authentication] = [@config[:username], @config[:password]] if @config[:username]
|
229
|
+
|
226
230
|
# Do not send any headers that have nil values.
|
227
231
|
# Net::HTTP does not gracefully handle this situation.
|
228
232
|
check_for_missing_values!(opts)
|
data/lib/inspec/metadata.rb
CHANGED
@@ -204,7 +204,8 @@ module Inspec
|
|
204
204
|
|
205
205
|
def self.from_yaml(ref, content, profile_id, logger = nil)
|
206
206
|
res = Metadata.new(ref, logger)
|
207
|
-
|
207
|
+
require 'erb'
|
208
|
+
res.params = YAML.load(ERB.new(content).result)
|
208
209
|
res.content = content
|
209
210
|
finalize(res, profile_id, {}, logger)
|
210
211
|
end
|
data/lib/inspec/profile.rb
CHANGED
@@ -229,7 +229,7 @@ module Inspec
|
|
229
229
|
info(load_params.dup)
|
230
230
|
end
|
231
231
|
|
232
|
-
def info(res = params.dup)
|
232
|
+
def info(res = params.dup) # rubocop:disable Metrics/CyclomaticComplexity
|
233
233
|
# add information about the controls
|
234
234
|
res[:controls] = res[:controls].map do |id, rule|
|
235
235
|
next if id.to_s.empty?
|
@@ -252,6 +252,15 @@ module Inspec
|
|
252
252
|
res[:attributes] = res[:attributes].map(&:to_hash) unless res[:attributes].nil? || res[:attributes].empty?
|
253
253
|
res[:sha256] = sha256
|
254
254
|
res[:parent_profile] = parent_profile unless parent_profile.nil?
|
255
|
+
|
256
|
+
# convert legacy os-* supports to their platform counterpart
|
257
|
+
if res[:supports] && !res[:supports].empty?
|
258
|
+
res[:supports].each do |support|
|
259
|
+
support[:"platform-family"] = support.delete(:"os-family") if support.key?(:"os-family")
|
260
|
+
support[:"platform-name"] = support.delete(:"os-name") if support.key?(:"os-name")
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
255
264
|
res
|
256
265
|
end
|
257
266
|
|
data/lib/inspec/rule.rb
CHANGED
@@ -227,9 +227,10 @@ module Inspec
|
|
227
227
|
# all checks that were defined in the destination
|
228
228
|
sc = checks(src)
|
229
229
|
dst.instance_variable_set(:@__checks, sc) unless sc.empty?
|
230
|
-
|
231
|
-
sr =
|
232
|
-
|
230
|
+
skip_check = skip_status(src)
|
231
|
+
sr = skip_check[:result]
|
232
|
+
msg = skip_check[:message]
|
233
|
+
set_skip_rule(dst, sr, msg) unless sr.nil?
|
233
234
|
|
234
235
|
# Save merge history
|
235
236
|
dst.instance_variable_set(:@__merge_count, merge_count(dst) + 1)
|
data/lib/inspec/schema.rb
CHANGED
@@ -102,7 +102,12 @@ module Inspec
|
|
102
102
|
'type' => 'object',
|
103
103
|
'additionalProperties' => false,
|
104
104
|
'properties' => {
|
105
|
+
'platform-family' => { 'type' => 'string', 'optional' => true },
|
106
|
+
'platform-name' => { 'type' => 'string', 'optional' => true },
|
107
|
+
'platform' => { 'type' => 'string', 'optional' => true },
|
108
|
+
# os-* supports are being deprecated
|
105
109
|
'os-family' => { 'type' => 'string', 'optional' => true },
|
110
|
+
'os-name' => { 'type' => 'string', 'optional' => true },
|
106
111
|
},
|
107
112
|
}.freeze
|
108
113
|
|
data/lib/inspec/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.78
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dominik Richter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-08-
|
11
|
+
date: 2018-08-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: train
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '1.4'
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 1.4.
|
22
|
+
version: 1.4.35
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '1.4'
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 1.4.
|
32
|
+
version: 1.4.35
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: thor
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|