chef-zero 14.0.13 → 14.0.17
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.
- checksums.yaml +4 -4
- data/Gemfile +4 -6
- data/Rakefile +9 -1
- data/chef-zero.gemspec +1 -4
- data/lib/chef_zero.rb +1 -1
- data/lib/chef_zero/chef_data/cookbook_data.rb +1 -1
- data/lib/chef_zero/chef_data/data_normalizer.rb +9 -7
- data/lib/chef_zero/chef_data/default_creator.rb +8 -5
- data/lib/chef_zero/data_store/data_already_exists_error.rb +1 -1
- data/lib/chef_zero/data_store/data_error.rb +1 -1
- data/lib/chef_zero/data_store/data_not_found_error.rb +1 -1
- data/lib/chef_zero/data_store/default_facade.rb +4 -4
- data/lib/chef_zero/data_store/interface_v2.rb +1 -1
- data/lib/chef_zero/data_store/memory_store.rb +3 -3
- data/lib/chef_zero/data_store/memory_store_v2.rb +22 -14
- data/lib/chef_zero/data_store/raw_file_store.rb +6 -4
- data/lib/chef_zero/data_store/v1_to_v2_adapter.rb +11 -1
- data/lib/chef_zero/data_store/v2_to_v1_adapter.rb +1 -1
- data/lib/chef_zero/endpoints/acl_endpoint.rb +3 -2
- data/lib/chef_zero/endpoints/acls_endpoint.rb +5 -4
- data/lib/chef_zero/endpoints/actor_default_key_endpoint.rb +2 -1
- data/lib/chef_zero/endpoints/actor_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/actor_key_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/actor_keys_endpoint.rb +3 -2
- data/lib/chef_zero/endpoints/actors_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/authenticate_user_endpoint.rb +2 -1
- data/lib/chef_zero/endpoints/container_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/containers_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/controls_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/cookbook_artifact_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/cookbook_artifact_identifier_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/cookbook_artifacts_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/cookbook_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/cookbook_version_endpoint.rb +7 -5
- data/lib/chef_zero/endpoints/cookbooks_base.rb +4 -2
- data/lib/chef_zero/endpoints/cookbooks_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/data_bag_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/data_bag_item_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/data_bags_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/environment_cookbook_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/environment_cookbook_versions_endpoint.rb +13 -10
- data/lib/chef_zero/endpoints/environment_cookbooks_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/environment_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/environment_nodes_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/environment_recipes_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/environment_role_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/file_store_file_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/group_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/groups_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/license_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/node_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/node_identifiers_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/nodes_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/not_found_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/organization_association_request_endpoint.rb +2 -1
- data/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/organization_authenticate_user_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/organization_endpoint.rb +3 -2
- data/lib/chef_zero/endpoints/organization_user_base.rb +1 -1
- data/lib/chef_zero/endpoints/organization_user_default_key_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/organization_user_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/organization_user_key_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/organization_user_keys_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/organization_users_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/organization_validator_key_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/organizations_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/policies_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/policy_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/policy_group_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/policy_group_policy_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/policy_groups_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/policy_revision_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/policy_revisions_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/principal_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/rest_list_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/rest_object_endpoint.rb +3 -2
- data/lib/chef_zero/endpoints/role_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/role_environments_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/sandbox_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/sandboxes_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/search_endpoint.rb +8 -8
- data/lib/chef_zero/endpoints/searches_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/server_api_version_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/system_recovery_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/universe_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/user_association_request_endpoint.rb +2 -1
- data/lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/user_association_requests_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/user_organizations_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/version_endpoint.rb +2 -2
- data/lib/chef_zero/rest_base.rb +15 -15
- data/lib/chef_zero/rest_request.rb +4 -4
- data/lib/chef_zero/rest_router.rb +2 -2
- data/lib/chef_zero/rspec.rb +3 -2
- data/lib/chef_zero/server.rb +87 -83
- data/lib/chef_zero/socketless_server_map.rb +2 -1
- data/lib/chef_zero/solr/query/phrase.rb +2 -2
- data/lib/chef_zero/solr/query/range_query.rb +3 -3
- data/lib/chef_zero/solr/query/term.rb +1 -1
- data/lib/chef_zero/solr/solr_parser.rb +12 -10
- data/lib/chef_zero/version.rb +1 -1
- data/spec/run_oc_pedant.rb +5 -3
- data/spec/search_spec.rb +2 -2
- data/spec/socketless_server_map_spec.rb +1 -1
- data/spec/support/oc_pedant.rb +1 -1
- metadata +3 -31
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
require_relative "../rest_base"
|
|
3
|
+
require_relative "../chef_data/acl_path"
|
|
4
4
|
|
|
5
5
|
module ChefZero
|
|
6
6
|
module Endpoints
|
|
@@ -23,6 +23,7 @@ module ChefZero
|
|
|
23
23
|
if !acl_path || !%w{read create update delete grant}.include?(perm)
|
|
24
24
|
raise RestErrorResponse.new(404, "Object not found: #{build_uri(request.base_uri, request.rest_path)}")
|
|
25
25
|
end
|
|
26
|
+
|
|
26
27
|
[acl_path, perm]
|
|
27
28
|
end
|
|
28
29
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
require_relative "../rest_base"
|
|
3
|
+
require_relative "../chef_data/data_normalizer"
|
|
4
|
+
require_relative "../chef_data/acl_path"
|
|
5
5
|
|
|
6
6
|
module ChefZero
|
|
7
7
|
module Endpoints
|
|
@@ -17,9 +17,10 @@ module ChefZero
|
|
|
17
17
|
path = request.rest_path[0..-2] # Strip off _acl
|
|
18
18
|
path = path[0..1] if path.size == 3 && path[0] == "organizations" && %w{organization organizations}.include?(path[2])
|
|
19
19
|
acl_path = ChefData::AclPath.get_acl_data_path(path)
|
|
20
|
-
|
|
20
|
+
unless acl_path
|
|
21
21
|
raise RestErrorResponse.new(404, "Object not found: #{build_uri(request.base_uri, request.rest_path)}")
|
|
22
22
|
end
|
|
23
|
+
|
|
23
24
|
acls = FFI_Yajl::Parser.parse(get_data(request, acl_path))
|
|
24
25
|
acls = ChefData::DataNormalizer.normalize_acls(acls)
|
|
25
26
|
if request.query_params["detail"] == "granular"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "../rest_base"
|
|
2
2
|
|
|
3
3
|
module ChefZero
|
|
4
4
|
module Endpoints
|
|
@@ -53,6 +53,7 @@ module ChefZero
|
|
|
53
53
|
|
|
54
54
|
def actor_path(request)
|
|
55
55
|
return request.rest_path[0..3] if request.rest_path[2] == "clients"
|
|
56
|
+
|
|
56
57
|
request.rest_path[0..1]
|
|
57
58
|
end
|
|
58
59
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
require_relative "rest_object_endpoint"
|
|
3
|
+
require_relative "../chef_data/data_normalizer"
|
|
4
4
|
|
|
5
5
|
module ChefZero
|
|
6
6
|
module Endpoints
|
|
@@ -125,7 +125,7 @@ module ChefZero
|
|
|
125
125
|
def rename_keys!(request, new_client_or_user_name)
|
|
126
126
|
orig_keys_path = keys_path_base(request)
|
|
127
127
|
new_keys_path = orig_keys_path.dup
|
|
128
|
-
|
|
128
|
+
.tap { |path| path[-2] = new_client_or_user_name }
|
|
129
129
|
|
|
130
130
|
key_names = list_data_or_else(request, orig_keys_path, nil)
|
|
131
131
|
return unless key_names # No keys to move
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "../rest_base"
|
|
2
2
|
|
|
3
3
|
module ChefZero
|
|
4
4
|
module Endpoints
|
|
@@ -50,7 +50,7 @@ module ChefZero
|
|
|
50
50
|
response_body["private_key"] = private_key if generate_keys
|
|
51
51
|
|
|
52
52
|
json_response(201, response_body,
|
|
53
|
-
|
|
53
|
+
headers: { "Location" => response_body["uri"] })
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
private
|
|
@@ -117,6 +117,7 @@ module ChefZero
|
|
|
117
117
|
|
|
118
118
|
def actor_path(request)
|
|
119
119
|
return request.rest_path[0..3] if client?(request)
|
|
120
|
+
|
|
120
121
|
request.rest_path[0..1]
|
|
121
122
|
end
|
|
122
123
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
2
|
+
require_relative "../rest_base"
|
|
3
3
|
|
|
4
4
|
module ChefZero
|
|
5
5
|
module Endpoints
|
|
@@ -19,6 +19,7 @@ module ChefZero
|
|
|
19
19
|
if user["password"] != password
|
|
20
20
|
raise RestErrorResponse.new(401, "Bad username or password")
|
|
21
21
|
end
|
|
22
|
+
|
|
22
23
|
# Include only particular user data in the response
|
|
23
24
|
user.keep_if { |key, value| %w{first_name last_name display_name email username}.include?(key) }
|
|
24
25
|
json_response(200, {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
2
|
+
require_relative "rest_list_endpoint"
|
|
3
3
|
|
|
4
4
|
module ChefZero
|
|
5
5
|
module Endpoints
|
|
@@ -15,7 +15,7 @@ module ChefZero
|
|
|
15
15
|
data = parse_json(request.body)
|
|
16
16
|
# if they don't match, id wins.
|
|
17
17
|
container_name = data["id"] || data["containername"]
|
|
18
|
-
container_path_suffix = data["containerpath"].split("/").reject
|
|
18
|
+
container_path_suffix = data["containerpath"].split("/").reject(&:empty?)
|
|
19
19
|
create_data(request, request.rest_path, container_name, to_json({}), :create_dir)
|
|
20
20
|
|
|
21
21
|
json_response(201, { uri: build_uri(request.base_uri, request.rest_path + container_path_suffix + [container_name]) })
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "../chef_data/data_normalizer"
|
|
2
2
|
|
|
3
3
|
module ChefZero
|
|
4
4
|
module Endpoints
|
|
@@ -60,8 +60,8 @@ module ChefZero
|
|
|
60
60
|
def normalize(request, cookbook_artifact_data)
|
|
61
61
|
cookbook = parse_json(cookbook_artifact_data)
|
|
62
62
|
ChefData::DataNormalizer.normalize_cookbook(self, request.rest_path[0..1],
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
cookbook, request.rest_path[3], request.rest_path[4],
|
|
64
|
+
request.base_uri, request.method, true, api_version: request.api_version)
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
67
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
require_relative "rest_object_endpoint"
|
|
3
|
+
require_relative "../rest_error_response"
|
|
4
|
+
require_relative "../chef_data/data_normalizer"
|
|
5
|
+
require_relative "../data_store/data_not_found_error"
|
|
6
6
|
|
|
7
7
|
module ChefZero
|
|
8
8
|
module Endpoints
|
|
@@ -27,9 +27,10 @@ module ChefZero
|
|
|
27
27
|
if request.query_params["force"] != "true"
|
|
28
28
|
raise RestErrorResponse.new(409, "The cookbook #{name} at version #{version} is frozen. Use the 'force' option to override.")
|
|
29
29
|
end
|
|
30
|
+
|
|
30
31
|
# For some reason, you are forever unable to modify "frozen?" on a frozen cookbook.
|
|
31
32
|
request_body = FFI_Yajl::Parser.parse(request.body)
|
|
32
|
-
|
|
33
|
+
unless request_body["frozen?"]
|
|
33
34
|
request_body["frozen?"] = true
|
|
34
35
|
request.body = FFI_Yajl::Encoder.encode(request_body, pretty: true)
|
|
35
36
|
end
|
|
@@ -92,6 +93,7 @@ module ChefZero
|
|
|
92
93
|
rescue ChefZero::DataStore::DataNotFoundError
|
|
93
94
|
# Not all chef versions support cookbook_artifacts
|
|
94
95
|
raise unless cookbook_type == "cookbook_artifacts"
|
|
96
|
+
|
|
95
97
|
cookbooks = []
|
|
96
98
|
end
|
|
97
99
|
cookbooks.each do |cookbook_name|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
require_relative "../rest_base"
|
|
3
|
+
require_relative "../chef_data/data_normalizer"
|
|
4
4
|
|
|
5
5
|
module ChefZero
|
|
6
6
|
module Endpoints
|
|
@@ -54,6 +54,7 @@ module ChefZero
|
|
|
54
54
|
versions = []
|
|
55
55
|
cookbooks_list[name].sort_by { |version| Gem::Version.new(version.dup) }.reverse_each do |version|
|
|
56
56
|
break if num_versions && versions.size >= num_versions
|
|
57
|
+
|
|
57
58
|
if constraint.satisfied_by?(Gem::Version.new(version.dup))
|
|
58
59
|
versions << version
|
|
59
60
|
end
|
|
@@ -66,6 +67,7 @@ module ChefZero
|
|
|
66
67
|
cookbook["all_files"].inject([]) do |acc, file|
|
|
67
68
|
part, name = file["name"].split("/")
|
|
68
69
|
next acc unless part == "recipes" || File.extname(name) != ".rb"
|
|
70
|
+
|
|
69
71
|
if name == "default.rb"
|
|
70
72
|
acc << cookbook_name
|
|
71
73
|
else
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
require_relative "rest_list_endpoint"
|
|
3
|
+
require_relative "data_bag_item_endpoint"
|
|
4
|
+
require_relative "../rest_error_response"
|
|
5
5
|
|
|
6
6
|
module ChefZero
|
|
7
7
|
module Endpoints
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
require_relative "rest_object_endpoint"
|
|
3
|
+
require_relative "data_bag_item_endpoint"
|
|
4
|
+
require_relative "../chef_data/data_normalizer"
|
|
5
5
|
|
|
6
6
|
module ChefZero
|
|
7
7
|
module Endpoints
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
2
|
+
require_relative "rest_list_endpoint"
|
|
3
3
|
|
|
4
4
|
module ChefZero
|
|
5
5
|
module Endpoints
|
|
@@ -10,7 +10,7 @@ module ChefZero
|
|
|
10
10
|
json = FFI_Yajl::Parser.parse(contents)
|
|
11
11
|
name = identity_keys.map { |k| json[k] }.select { |v| v }.first
|
|
12
12
|
if name.nil?
|
|
13
|
-
error(400, "Must specify #{identity_keys.map
|
|
13
|
+
error(400, "Must specify #{identity_keys.map(&:inspect).join(" or ")} in JSON")
|
|
14
14
|
elsif exists_data_dir?(request, request.rest_path[0..1] + ["data", name])
|
|
15
15
|
error(409, "Object already exists")
|
|
16
16
|
else
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require "ffi_yajl"
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
require_relative "../rest_base"
|
|
3
|
+
require_relative "../rest_error_response"
|
|
4
4
|
|
|
5
5
|
module ChefZero
|
|
6
6
|
module Endpoints
|
|
@@ -15,12 +15,14 @@ module ChefZero
|
|
|
15
15
|
run_list = FFI_Yajl::Parser.parse(request.body)["run_list"]
|
|
16
16
|
run_list.each do |run_list_entry|
|
|
17
17
|
if run_list_entry =~ /(.+)::.+\@(.+)/ || run_list_entry =~ /(.+)\@(.+)/
|
|
18
|
-
raise RestErrorResponse.new(412, "No such cookbook: #{$1}")
|
|
19
|
-
raise RestErrorResponse.new(412, "No such cookbook version for cookbook #{$1}: #{$2}")
|
|
18
|
+
raise RestErrorResponse.new(412, "No such cookbook: #{$1}") unless cookbook_names.include?($1)
|
|
19
|
+
raise RestErrorResponse.new(412, "No such cookbook version for cookbook #{$1}: #{$2}") unless list_data(request, request.rest_path[0..1] + ["cookbooks", $1]).include?($2)
|
|
20
|
+
|
|
20
21
|
desired_versions[$1] = [ $2 ]
|
|
21
22
|
else
|
|
22
23
|
desired_cookbook = run_list_entry.split("::")[0]
|
|
23
|
-
raise RestErrorResponse.new(412, "No such cookbook: #{desired_cookbook}")
|
|
24
|
+
raise RestErrorResponse.new(412, "No such cookbook: #{desired_cookbook}") unless cookbook_names.include?(desired_cookbook)
|
|
25
|
+
|
|
24
26
|
desired_versions[desired_cookbook] = list_data(request, request.rest_path[0..1] + ["cookbooks", desired_cookbook])
|
|
25
27
|
end
|
|
26
28
|
end
|
|
@@ -35,7 +37,7 @@ module ChefZero
|
|
|
35
37
|
|
|
36
38
|
# Depsolve!
|
|
37
39
|
solved = depsolve(request, desired_versions.keys, desired_versions, environment_constraints)
|
|
38
|
-
|
|
40
|
+
unless solved
|
|
39
41
|
if @last_missing_dep && !cookbook_names.include?(@last_missing_dep)
|
|
40
42
|
return raise RestErrorResponse.new(412, "No such cookbook: #{@last_missing_dep}")
|
|
41
43
|
elsif @last_constraint_failure
|
|
@@ -64,7 +66,7 @@ module ChefZero
|
|
|
64
66
|
|
|
65
67
|
# If everything is already
|
|
66
68
|
solve_for = unsolved[0]
|
|
67
|
-
return desired_versions
|
|
69
|
+
return desired_versions unless solve_for
|
|
68
70
|
|
|
69
71
|
# Go through each desired version of this cookbook, starting with the latest,
|
|
70
72
|
# until we find one we can solve successfully with
|
|
@@ -81,10 +83,10 @@ module ChefZero
|
|
|
81
83
|
cookbook_dependencies.each_pair do |dep_name, dep_constraint|
|
|
82
84
|
# If the dep is not already in the list, add it to the list to solve
|
|
83
85
|
# and bring in all environment-allowed cookbook versions to desired_versions
|
|
84
|
-
|
|
86
|
+
unless new_desired_versions.key?(dep_name)
|
|
85
87
|
new_unsolved += [dep_name]
|
|
86
88
|
# If the dep is missing, we will try other versions of the cookbook that might not have the bad dep.
|
|
87
|
-
|
|
89
|
+
unless exists_data_dir?(request, request.rest_path[0..1] + ["cookbooks", dep_name])
|
|
88
90
|
@last_missing_dep = dep_name.to_s
|
|
89
91
|
dep_not_found = true
|
|
90
92
|
break
|
|
@@ -110,7 +112,8 @@ module ChefZero
|
|
|
110
112
|
end
|
|
111
113
|
|
|
112
114
|
def filter_by_constraint(versions, cookbook_name, constraint)
|
|
113
|
-
return versions
|
|
115
|
+
return versions unless constraint
|
|
116
|
+
|
|
114
117
|
constraint = Gem::Requirement.new(constraint)
|
|
115
118
|
new_versions = versions[cookbook_name]
|
|
116
119
|
new_versions = new_versions.select { |version| constraint.satisfied_by?(Gem::Version.new(version.dup)) }
|