bolt 0.20.3 → 0.20.5
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bolt might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/bolt-modules/boltlib/lib/puppet/functions/run_task.rb +3 -3
- data/bolt-modules/boltlib/lib/puppet/functions/set_feature.rb +33 -0
- data/lib/bolt/inventory.rb +19 -1
- data/lib/bolt/target.rb +15 -0
- data/lib/bolt/transport/local.rb +6 -1
- data/lib/bolt/transport/orch.rb +2 -0
- data/lib/bolt/transport/ssh.rb +7 -2
- data/lib/bolt/transport/winrm.rb +6 -1
- data/lib/bolt/version.rb +1 -1
- data/modules/facts/plans/retrieve.pp +2 -26
- data/modules/facts/tasks/init.json +9 -0
- data/vendored/puppet/lib/hiera/puppet_function.rb +1 -1
- data/vendored/puppet/lib/hiera/scope.rb +24 -2
- data/vendored/puppet/lib/puppet.rb +4 -13
- data/vendored/puppet/lib/puppet/application.rb +2 -2
- data/vendored/puppet/lib/puppet/application/agent.rb +1 -1
- data/vendored/puppet/lib/puppet/application/apply.rb +1 -1
- data/vendored/puppet/lib/puppet/application/cert.rb +1 -1
- data/vendored/puppet/lib/puppet/application/device.rb +8 -8
- data/vendored/puppet/lib/puppet/application/face_base.rb +1 -1
- data/vendored/puppet/lib/puppet/application/lookup.rb +2 -2
- data/vendored/puppet/lib/puppet/application/resource.rb +2 -2
- data/vendored/puppet/lib/puppet/application/script.rb +1 -1
- data/vendored/puppet/lib/puppet/configurer.rb +47 -24
- data/vendored/puppet/lib/puppet/confine.rb +4 -1
- data/vendored/puppet/lib/puppet/context.rb +1 -1
- data/vendored/puppet/lib/puppet/defaults.rb +32 -44
- data/vendored/puppet/lib/puppet/error.rb +14 -7
- data/vendored/puppet/lib/puppet/external/dot.rb +23 -17
- data/vendored/puppet/lib/puppet/face/config.rb +58 -3
- data/vendored/puppet/lib/puppet/face/epp.rb +1 -1
- data/vendored/puppet/lib/puppet/face/module/build.rb +3 -3
- data/vendored/puppet/lib/puppet/face/module/install.rb +0 -4
- data/vendored/puppet/lib/puppet/face/module/list.rb +0 -5
- data/vendored/puppet/lib/puppet/face/module/search.rb +1 -1
- data/vendored/puppet/lib/puppet/face/module/uninstall.rb +0 -4
- data/vendored/puppet/lib/puppet/face/module/upgrade.rb +0 -4
- data/vendored/puppet/lib/puppet/face/status.rb +2 -2
- data/vendored/puppet/lib/puppet/file_serving/base.rb +5 -5
- data/vendored/puppet/lib/puppet/file_serving/metadata.rb +2 -1
- data/vendored/puppet/lib/puppet/forge.rb +7 -8
- data/vendored/puppet/lib/puppet/forge/errors.rb +3 -3
- data/vendored/puppet/lib/puppet/functions/abs.rb +61 -0
- data/vendored/puppet/lib/puppet/functions/all.rb +2 -2
- data/vendored/puppet/lib/puppet/functions/any.rb +2 -2
- data/vendored/puppet/lib/puppet/functions/assert_type.rb +3 -3
- data/vendored/puppet/lib/puppet/functions/break.rb +3 -7
- data/vendored/puppet/lib/puppet/functions/camelcase.rb +62 -0
- data/vendored/puppet/lib/puppet/functions/capitalize.rb +61 -0
- data/vendored/puppet/lib/puppet/functions/ceiling.rb +37 -0
- data/vendored/puppet/lib/puppet/functions/chomp.rb +57 -0
- data/vendored/puppet/lib/puppet/functions/chop.rb +67 -0
- data/vendored/puppet/lib/puppet/functions/compare.rb +125 -0
- data/vendored/puppet/lib/puppet/functions/convert_to.rb +3 -2
- data/vendored/puppet/lib/puppet/functions/dig.rb +21 -1
- data/vendored/puppet/lib/puppet/functions/downcase.rb +89 -0
- data/vendored/puppet/lib/puppet/functions/each.rb +2 -2
- data/vendored/puppet/lib/puppet/functions/empty.rb +1 -3
- data/vendored/puppet/lib/puppet/functions/eyaml_lookup_key.rb +4 -2
- data/vendored/puppet/lib/puppet/functions/filter.rb +2 -2
- data/vendored/puppet/lib/puppet/functions/floor.rb +37 -0
- data/vendored/puppet/lib/puppet/functions/get.rb +150 -0
- data/vendored/puppet/lib/puppet/functions/getvar.rb +87 -0
- data/vendored/puppet/lib/puppet/functions/hiera.rb +5 -5
- data/vendored/puppet/lib/puppet/functions/hiera_array.rb +5 -5
- data/vendored/puppet/lib/puppet/functions/hiera_hash.rb +6 -6
- data/vendored/puppet/lib/puppet/functions/hiera_include.rb +7 -7
- data/vendored/puppet/lib/puppet/functions/hocon_data.rb +1 -1
- data/vendored/puppet/lib/puppet/functions/json_data.rb +3 -3
- data/vendored/puppet/lib/puppet/functions/lest.rb +1 -1
- data/vendored/puppet/lib/puppet/functions/lookup.rb +3 -2
- data/vendored/puppet/lib/puppet/functions/lstrip.rb +58 -0
- data/vendored/puppet/lib/puppet/functions/map.rb +1 -1
- data/vendored/puppet/lib/puppet/functions/match.rb +11 -0
- data/vendored/puppet/lib/puppet/functions/max.rb +183 -0
- data/vendored/puppet/lib/puppet/functions/min.rb +182 -0
- data/vendored/puppet/lib/puppet/functions/next.rb +1 -8
- data/vendored/puppet/lib/puppet/functions/reduce.rb +1 -1
- data/vendored/puppet/lib/puppet/functions/return.rb +1 -8
- data/vendored/puppet/lib/puppet/functions/reverse_each.rb +1 -1
- data/vendored/puppet/lib/puppet/functions/round.rb +24 -0
- data/vendored/puppet/lib/puppet/functions/rstrip.rb +58 -0
- data/vendored/puppet/lib/puppet/functions/size.rb +15 -0
- data/vendored/puppet/lib/puppet/functions/sort.rb +74 -0
- data/vendored/puppet/lib/puppet/functions/step.rb +1 -1
- data/vendored/puppet/lib/puppet/functions/strftime.rb +1 -7
- data/vendored/puppet/lib/puppet/functions/strip.rb +58 -0
- data/vendored/puppet/lib/puppet/functions/then.rb +1 -1
- data/vendored/puppet/lib/puppet/functions/tree_each.rb +7 -7
- data/vendored/puppet/lib/puppet/functions/upcase.rb +89 -0
- data/vendored/puppet/lib/puppet/functions/with.rb +4 -4
- data/vendored/puppet/lib/puppet/functions/yaml_data.rb +4 -2
- data/vendored/puppet/lib/puppet/graph/simple_graph.rb +9 -5
- data/vendored/puppet/lib/puppet/indirector/certificate_revocation_list/rest.rb +0 -11
- data/vendored/puppet/lib/puppet/indirector/indirection.rb +8 -12
- data/vendored/puppet/lib/puppet/indirector/node/exec.rb +1 -1
- data/vendored/puppet/lib/puppet/indirector/node/ldap.rb +1 -1
- data/vendored/puppet/lib/puppet/indirector/request.rb +11 -11
- data/vendored/puppet/lib/puppet/indirector/rest.rb +11 -11
- data/vendored/puppet/lib/puppet/interface/action.rb +2 -5
- data/vendored/puppet/lib/puppet/metatype/manager.rb +0 -2
- data/vendored/puppet/lib/puppet/module.rb +7 -33
- data/vendored/puppet/lib/puppet/module/task.rb +0 -1
- data/vendored/puppet/lib/puppet/module_tool.rb +2 -5
- data/vendored/puppet/lib/puppet/module_tool/applications/application.rb +5 -5
- data/vendored/puppet/lib/puppet/module_tool/applications/builder.rb +2 -2
- data/vendored/puppet/lib/puppet/module_tool/applications/checksummer.rb +3 -3
- data/vendored/puppet/lib/puppet/module_tool/applications/installer.rb +6 -7
- data/vendored/puppet/lib/puppet/module_tool/applications/uninstaller.rb +1 -2
- data/vendored/puppet/lib/puppet/module_tool/applications/unpacker.rb +2 -2
- data/vendored/puppet/lib/puppet/module_tool/applications/upgrader.rb +5 -6
- data/vendored/puppet/lib/puppet/module_tool/dependency.rb +1 -1
- data/vendored/puppet/lib/puppet/module_tool/installed_modules.rb +2 -2
- data/vendored/puppet/lib/puppet/module_tool/local_tarball.rb +3 -3
- data/vendored/puppet/lib/puppet/module_tool/metadata.rb +3 -4
- data/vendored/puppet/lib/puppet/module_tool/shared_behaviors.rb +2 -2
- data/vendored/puppet/lib/puppet/network/authconfig.rb +0 -13
- data/vendored/puppet/lib/puppet/network/format_support.rb +1 -1
- data/vendored/puppet/lib/puppet/network/formats.rb +5 -7
- data/vendored/puppet/lib/puppet/network/http.rb +0 -2
- data/vendored/puppet/lib/puppet/network/http/api.rb +1 -10
- data/vendored/puppet/lib/puppet/network/http/api/master/v3/environment.rb +2 -2
- data/vendored/puppet/lib/puppet/network/http/api/master/v3/environments.rb +2 -2
- data/vendored/puppet/lib/puppet/network/http/compression.rb +1 -1
- data/vendored/puppet/lib/puppet/network/http/connection.rb +11 -3
- data/vendored/puppet/lib/puppet/network/http/error.rb +3 -3
- data/vendored/puppet/lib/puppet/network/http/factory.rb +3 -0
- data/vendored/puppet/lib/puppet/network/http/handler.rb +59 -27
- data/vendored/puppet/lib/puppet/network/resolver.rb +140 -67
- data/vendored/puppet/lib/puppet/node/environment.rb +2 -19
- data/vendored/puppet/lib/puppet/parameter.rb +12 -7
- data/vendored/puppet/lib/puppet/parser/ast.rb +4 -8
- data/vendored/puppet/lib/puppet/parser/ast/branch.rb +3 -3
- data/vendored/puppet/lib/puppet/parser/ast/leaf.rb +5 -0
- data/vendored/puppet/lib/puppet/parser/ast/pops_bridge.rb +18 -0
- data/vendored/puppet/lib/puppet/parser/compiler.rb +3 -4
- data/vendored/puppet/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +9 -2
- data/vendored/puppet/lib/puppet/parser/functions.rb +1 -1
- data/vendored/puppet/lib/puppet/parser/functions/assert_type.rb +3 -3
- data/vendored/puppet/lib/puppet/parser/functions/create_resources.rb +1 -7
- data/vendored/puppet/lib/puppet/parser/functions/each.rb +2 -2
- data/vendored/puppet/lib/puppet/parser/functions/filter.rb +1 -1
- data/vendored/puppet/lib/puppet/parser/functions/hiera.rb +4 -4
- data/vendored/puppet/lib/puppet/parser/functions/hiera_array.rb +5 -5
- data/vendored/puppet/lib/puppet/parser/functions/hiera_hash.rb +6 -6
- data/vendored/puppet/lib/puppet/parser/functions/hiera_include.rb +10 -11
- data/vendored/puppet/lib/puppet/parser/functions/inline_template.rb +1 -1
- data/vendored/puppet/lib/puppet/parser/functions/lest.rb +1 -1
- data/vendored/puppet/lib/puppet/parser/functions/lookup.rb +1 -1
- data/vendored/puppet/lib/puppet/parser/functions/map.rb +1 -1
- data/vendored/puppet/lib/puppet/parser/functions/reduce.rb +1 -1
- data/vendored/puppet/lib/puppet/parser/functions/return.rb +22 -1
- data/vendored/puppet/lib/puppet/parser/functions/reverse_each.rb +1 -1
- data/vendored/puppet/lib/puppet/parser/functions/step.rb +1 -1
- data/vendored/puppet/lib/puppet/parser/functions/then.rb +1 -1
- data/vendored/puppet/lib/puppet/parser/functions/with.rb +4 -4
- data/vendored/puppet/lib/puppet/parser/resource.rb +0 -1
- data/vendored/puppet/lib/puppet/parser/resource/param.rb +12 -5
- data/vendored/puppet/lib/puppet/parser/scope.rb +5 -7
- data/vendored/puppet/lib/puppet/pops/evaluator/compare_operator.rb +3 -1
- data/vendored/puppet/lib/puppet/pops/evaluator/runtime3_support.rb +2 -7
- data/vendored/puppet/lib/puppet/pops/issues.rb +4 -0
- data/vendored/puppet/lib/puppet/pops/loader/loader_paths.rb +2 -2
- data/vendored/puppet/lib/puppet/pops/loader/module_loaders.rb +17 -12
- data/vendored/puppet/lib/puppet/pops/loader/task_instantiator.rb +73 -45
- data/vendored/puppet/lib/puppet/pops/lookup/lookup_adapter.rb +55 -6
- data/vendored/puppet/lib/puppet/pops/model/model_label_provider.rb +2 -0
- data/vendored/puppet/lib/puppet/pops/parser/epp_parser.rb +1 -1
- data/vendored/puppet/lib/puppet/pops/parser/epp_support.rb +6 -2
- data/vendored/puppet/lib/puppet/pops/parser/lexer2.rb +1 -1
- data/vendored/puppet/lib/puppet/pops/pcore.rb +7 -7
- data/vendored/puppet/lib/puppet/pops/puppet_stack.rb +15 -1
- data/vendored/puppet/lib/puppet/pops/serialization.rb +2 -2
- data/vendored/puppet/lib/puppet/pops/serialization/from_data_converter.rb +2 -2
- data/vendored/puppet/lib/puppet/pops/serialization/json.rb +7 -7
- data/vendored/puppet/lib/puppet/pops/serialization/to_data_converter.rb +5 -5
- data/vendored/puppet/lib/puppet/pops/types/types.rb +8 -4
- data/vendored/puppet/lib/puppet/pops/validation/checker4_0.rb +73 -0
- data/vendored/puppet/lib/puppet/pops/validation/validator_factory_4_0.rb +4 -3
- data/vendored/puppet/lib/puppet/provider/augeas/augeas.rb +7 -0
- data/vendored/puppet/lib/puppet/provider/service/systemd.rb +1 -1
- data/vendored/puppet/lib/puppet/provider/user/aix.rb +2 -2
- data/vendored/puppet/lib/puppet/provider/yumrepo/inifile.rb +21 -9
- data/vendored/puppet/lib/puppet/reference/providers.rb +1 -1
- data/vendored/puppet/lib/puppet/reference/report.rb +1 -1
- data/vendored/puppet/lib/puppet/resource.rb +1 -1
- data/vendored/puppet/lib/puppet/resource/capability_finder.rb +4 -4
- data/vendored/puppet/lib/puppet/resource/catalog.rb +6 -3
- data/vendored/puppet/lib/puppet/resource/type.rb +6 -2
- data/vendored/puppet/lib/puppet/rest/client.rb +79 -0
- data/vendored/puppet/lib/puppet/rest/errors.rb +14 -0
- data/vendored/puppet/lib/puppet/rest/response.rb +29 -0
- data/vendored/puppet/lib/puppet/rest/route.rb +102 -0
- data/vendored/puppet/lib/puppet/rest/routes.rb +31 -0
- data/vendored/puppet/lib/puppet/settings.rb +9 -5
- data/vendored/puppet/lib/puppet/settings/config_file.rb +1 -1
- data/vendored/puppet/lib/puppet/settings/environment_conf.rb +10 -1
- data/vendored/puppet/lib/puppet/ssl.rb +0 -1
- data/vendored/puppet/lib/puppet/ssl/certificate.rb +6 -2
- data/vendored/puppet/lib/puppet/ssl/certificate_authority.rb +3 -3
- data/vendored/puppet/lib/puppet/ssl/host.rb +258 -19
- data/vendored/puppet/lib/puppet/ssl/validator/default_validator.rb +33 -19
- data/vendored/puppet/lib/puppet/syntax_checkers/json.rb +1 -1
- data/vendored/puppet/lib/puppet/transaction/event.rb +34 -7
- data/vendored/puppet/lib/puppet/transaction/report.rb +17 -14
- data/vendored/puppet/lib/puppet/type.rb +20 -12
- data/vendored/puppet/lib/puppet/type/file.rb +1 -1
- data/vendored/puppet/lib/puppet/type/file/content.rb +15 -2
- data/vendored/puppet/lib/puppet/type/file/ensure.rb +1 -1
- data/vendored/puppet/lib/puppet/type/schedule.rb +1 -1
- data/vendored/puppet/lib/puppet/type/stage.rb +1 -1
- data/vendored/puppet/lib/puppet/type/tidy.rb +5 -1
- data/vendored/puppet/lib/puppet/type/user.rb +35 -18
- data/vendored/puppet/lib/puppet/type/yumrepo.rb +8 -17
- data/vendored/puppet/lib/puppet/util.rb +0 -1
- data/vendored/puppet/lib/puppet/util/autoload.rb +1 -6
- data/vendored/puppet/lib/puppet/util/checksums.rb +0 -2
- data/vendored/puppet/lib/puppet/util/classgen.rb +0 -6
- data/vendored/puppet/lib/puppet/util/fileparsing.rb +27 -5
- data/vendored/puppet/lib/puppet/util/instance_loader.rb +3 -3
- data/vendored/puppet/lib/puppet/util/json.rb +77 -0
- data/vendored/puppet/lib/puppet/util/json_lockfile.rb +3 -3
- data/vendored/puppet/lib/puppet/util/ldap/connection.rb +7 -7
- data/vendored/puppet/lib/puppet/util/log/destinations.rb +2 -2
- data/vendored/puppet/lib/puppet/util/logging.rb +1 -1
- data/vendored/puppet/lib/puppet/util/plist.rb +1 -1
- data/vendored/puppet/lib/puppet/util/provider_features.rb +2 -5
- data/vendored/puppet/lib/puppet/util/reference.rb +5 -4
- data/vendored/puppet/lib/puppet/util/tagging.rb +16 -3
- data/vendored/puppet/lib/puppet/version.rb +1 -1
- metadata +44 -26
- data/vendored/puppet/lib/puppet/application/master.rb +0 -317
- data/vendored/puppet/lib/puppet/feature/rack.rb +0 -19
- data/vendored/puppet/lib/puppet/network/http/api/ca.rb +0 -2
- data/vendored/puppet/lib/puppet/network/http/api/ca/v1.rb +0 -11
- data/vendored/puppet/lib/puppet/network/http/rack.rb +0 -33
- data/vendored/puppet/lib/puppet/network/http/rack/rest.rb +0 -162
- data/vendored/puppet/lib/puppet/network/http/webrick.rb +0 -124
- data/vendored/puppet/lib/puppet/network/http/webrick/rest.rb +0 -114
- data/vendored/puppet/lib/puppet/network/server.rb +0 -39
- data/vendored/puppet/lib/puppet/ssl/configuration.rb +0 -61
- data/vendored/puppet/lib/puppet/util/methodhelper.rb +0 -32
- data/vendored/puppet/lib/puppet/vendor/load_semantic.rb +0 -1
- data/vendored/puppet/lib/puppet/vendor/load_semantic_puppet.rb +0 -1
- data/vendored/puppet/lib/puppet/vendor/semantic/lib/semantic.rb +0 -5
- data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +0 -11
- data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency.rb +0 -181
- data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/graph.rb +0 -60
- data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/graph_node.rb +0 -117
- data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/module_release.rb +0 -58
- data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/source.rb +0 -25
- data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/unsatisfiable_graph.rb +0 -31
- data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +0 -3
- data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/version.rb +0 -203
- data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/version_range.rb +0 -758
@@ -1,58 +0,0 @@
|
|
1
|
-
require 'semantic_puppet/dependency'
|
2
|
-
|
3
|
-
module SemanticPuppet
|
4
|
-
module Dependency
|
5
|
-
class ModuleRelease
|
6
|
-
include GraphNode
|
7
|
-
|
8
|
-
attr_reader :name, :version
|
9
|
-
|
10
|
-
# Create a new instance of a module release.
|
11
|
-
#
|
12
|
-
# @param source [SemanticPuppet::Dependency::Source]
|
13
|
-
# @param name [String]
|
14
|
-
# @param version [SemanticPuppet::Version]
|
15
|
-
# @param dependencies [{String => SemanticPuppet::VersionRange}]
|
16
|
-
def initialize(source, name, version, dependencies = {})
|
17
|
-
@source = source
|
18
|
-
@name = name.freeze
|
19
|
-
@version = version.freeze
|
20
|
-
|
21
|
-
dependencies.each do |name, range|
|
22
|
-
add_constraint('initialize', name, range.to_s) do |node|
|
23
|
-
range === node.version
|
24
|
-
end
|
25
|
-
|
26
|
-
add_dependency(name)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def priority
|
31
|
-
@source.priority
|
32
|
-
end
|
33
|
-
|
34
|
-
def <=>(oth)
|
35
|
-
our_key = [ priority, name, version ]
|
36
|
-
their_key = [ oth.priority, oth.name, oth.version ]
|
37
|
-
|
38
|
-
return our_key <=> their_key
|
39
|
-
end
|
40
|
-
|
41
|
-
def eql?(other)
|
42
|
-
other.is_a?(ModuleRelease) &&
|
43
|
-
@name.eql?(other.name) &&
|
44
|
-
@version.eql?(other.version) &&
|
45
|
-
dependencies.eql?(other.dependencies)
|
46
|
-
end
|
47
|
-
alias == eql?
|
48
|
-
|
49
|
-
def hash
|
50
|
-
@name.hash ^ @version.hash
|
51
|
-
end
|
52
|
-
|
53
|
-
def to_s
|
54
|
-
"#<#{self.class} #{name}@#{version}>"
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/source.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'semantic_puppet/dependency'
|
2
|
-
|
3
|
-
module SemanticPuppet
|
4
|
-
module Dependency
|
5
|
-
class Source
|
6
|
-
def self.priority
|
7
|
-
0
|
8
|
-
end
|
9
|
-
|
10
|
-
def priority
|
11
|
-
self.class.priority
|
12
|
-
end
|
13
|
-
|
14
|
-
def create_release(name, version, dependencies = {})
|
15
|
-
version = Version.parse(version) if version.is_a? String
|
16
|
-
dependencies = dependencies.inject({}) do |hash, (key, value)|
|
17
|
-
hash[key] = VersionRange.parse(value || '>= 0.0.0')
|
18
|
-
hash[key] ||= VersionRange::EMPTY_RANGE
|
19
|
-
hash
|
20
|
-
end
|
21
|
-
ModuleRelease.new(self, name, version, dependencies)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'semantic_puppet/dependency'
|
2
|
-
|
3
|
-
module SemanticPuppet
|
4
|
-
module Dependency
|
5
|
-
class UnsatisfiableGraph < StandardError
|
6
|
-
attr_reader :graph
|
7
|
-
|
8
|
-
def initialize(graph)
|
9
|
-
@graph = graph
|
10
|
-
|
11
|
-
deps = sentence_from_list(graph.modules)
|
12
|
-
super "Could not find satisfying releases for #{deps}"
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
def sentence_from_list(list)
|
18
|
-
case list.length
|
19
|
-
when 1
|
20
|
-
list.first
|
21
|
-
when 2
|
22
|
-
list.join(' and ')
|
23
|
-
else
|
24
|
-
list = list.dup
|
25
|
-
list.push("and #{list.pop}")
|
26
|
-
list.join(', ')
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,203 +0,0 @@
|
|
1
|
-
require 'semantic_puppet'
|
2
|
-
|
3
|
-
module SemanticPuppet
|
4
|
-
# @note SemanticPuppet::Version subclasses Numeric so that it has sane Range
|
5
|
-
# semantics in Ruby 1.9+.
|
6
|
-
class Version < Numeric
|
7
|
-
include Comparable
|
8
|
-
|
9
|
-
class ValidationFailure < ArgumentError; end
|
10
|
-
|
11
|
-
# Parse a Semantic Version string.
|
12
|
-
#
|
13
|
-
# @param ver [String] the version string to parse
|
14
|
-
# @return [Version] a comparable {Version} object
|
15
|
-
def self.parse(ver)
|
16
|
-
match, major, minor, patch, prerelease, build = *ver.match(REGEX_FULL_RX)
|
17
|
-
|
18
|
-
raise ValidationFailure, _("Unable to parse '%{version}' as a semantic version identifier") % {version: ver} unless match
|
19
|
-
|
20
|
-
new(major.to_i, minor.to_i, patch.to_i, parse_prerelease(prerelease), parse_build(build)).freeze
|
21
|
-
end
|
22
|
-
|
23
|
-
# Validate a Semantic Version string.
|
24
|
-
#
|
25
|
-
# @param ver [String] the version string to validate
|
26
|
-
# @return [bool] whether or not the string represents a valid Semantic Version
|
27
|
-
def self.valid?(ver)
|
28
|
-
match = ver.match(REGEX_FULL_RX)
|
29
|
-
if match.nil?
|
30
|
-
false
|
31
|
-
else
|
32
|
-
prerelease = match[4]
|
33
|
-
prerelease.nil? || prerelease.split('.').all? { |x| !(x =~ /^0\d+$/) }
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.parse_build(build)
|
38
|
-
build.nil? ? nil : build.split('.').freeze
|
39
|
-
end
|
40
|
-
|
41
|
-
def self.parse_prerelease(prerelease)
|
42
|
-
return nil unless prerelease
|
43
|
-
prerelease.split('.').map do |x|
|
44
|
-
if x =~ /^\d+$/
|
45
|
-
raise ValidationFailure, _('Numeric pre-release identifiers MUST NOT contain leading zeroes') if x.length > 1 && x.start_with?('0')
|
46
|
-
x.to_i
|
47
|
-
else
|
48
|
-
x
|
49
|
-
end
|
50
|
-
end.freeze
|
51
|
-
end
|
52
|
-
|
53
|
-
attr_reader :major, :minor, :patch
|
54
|
-
|
55
|
-
def initialize(major, minor, patch, prerelease = nil, build = nil)
|
56
|
-
@major = major
|
57
|
-
@minor = minor
|
58
|
-
@patch = patch
|
59
|
-
@prerelease = prerelease
|
60
|
-
@build = build
|
61
|
-
end
|
62
|
-
|
63
|
-
def next(part)
|
64
|
-
case part
|
65
|
-
when :major
|
66
|
-
self.class.new(@major.next, 0, 0)
|
67
|
-
when :minor
|
68
|
-
self.class.new(@major, @minor.next, 0)
|
69
|
-
when :patch
|
70
|
-
self.class.new(@major, @minor, @patch.next)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
# @return [String] the `prerelease` identifier as a string without the leading '-'
|
75
|
-
def prerelease
|
76
|
-
(@prerelease.nil? || @prerelease.empty?) ? nil : @prerelease.join('.')
|
77
|
-
end
|
78
|
-
|
79
|
-
# @return [Boolean] true if this is a stable release
|
80
|
-
def stable?
|
81
|
-
@prerelease.nil? || @prerelease.empty?
|
82
|
-
end
|
83
|
-
|
84
|
-
# @return [Version] this version stripped from any prerelease identifier.
|
85
|
-
def to_stable
|
86
|
-
@prerelease.nil? ? self : Version.new(@major, @minor, @patch, nil, @build)
|
87
|
-
end
|
88
|
-
|
89
|
-
# @return [String] the `build` identifier as a string without the leading '+'
|
90
|
-
def build
|
91
|
-
(@build.nil? || @build.empty?) ? nil : @build.join('.')
|
92
|
-
end
|
93
|
-
|
94
|
-
def <=>(other)
|
95
|
-
return nil unless other.is_a?(Version)
|
96
|
-
cmp = @major <=> other.major
|
97
|
-
if cmp == 0
|
98
|
-
cmp = @minor <=> other.minor
|
99
|
-
if cmp == 0
|
100
|
-
cmp = @patch <=> other.patch
|
101
|
-
if cmp == 0
|
102
|
-
cmp = compare_prerelease(other)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
cmp
|
107
|
-
end
|
108
|
-
|
109
|
-
def eql?(other)
|
110
|
-
other.is_a?(Version) &&
|
111
|
-
@major.eql?(other.major) &&
|
112
|
-
@minor.eql?(other.minor) &&
|
113
|
-
@patch.eql?(other.patch) &&
|
114
|
-
@prerelease.eql?(other.instance_variable_get(:@prerelease)) &&
|
115
|
-
@build.eql?(other.instance_variable_get(:@build))
|
116
|
-
end
|
117
|
-
alias == eql?
|
118
|
-
|
119
|
-
def to_s
|
120
|
-
s = "#{@major}.#{@minor}.#{@patch}"
|
121
|
-
|
122
|
-
# Appending the @prerelease and @build in a thoroughly tested and optimized
|
123
|
-
# way. Using interpolations and/or array joins may look simpler but will slows
|
124
|
-
# things down. Don't change this code without measuring performance of new
|
125
|
-
# solution.
|
126
|
-
unless @prerelease.nil?
|
127
|
-
s << '-' << @prerelease[0].to_s
|
128
|
-
i = 0
|
129
|
-
l = @prerelease.length
|
130
|
-
while (i += 1) < l
|
131
|
-
s << '.' << @prerelease[i].to_s
|
132
|
-
end
|
133
|
-
end
|
134
|
-
unless @build.nil?
|
135
|
-
s << '+' << @build[0].to_s
|
136
|
-
i = 0
|
137
|
-
l = @build.length
|
138
|
-
while (i += 1) < l
|
139
|
-
s << '.' << @build[i].to_s
|
140
|
-
end
|
141
|
-
end
|
142
|
-
s
|
143
|
-
end
|
144
|
-
alias inspect to_s
|
145
|
-
|
146
|
-
def hash
|
147
|
-
(((((@major * 0x100) ^ @minor) * 0x100) ^ @patch) * 0x100) ^ @prerelease.hash
|
148
|
-
end
|
149
|
-
|
150
|
-
def compare_prerelease(other)
|
151
|
-
mine = @prerelease
|
152
|
-
|
153
|
-
# Need to use the instance variable here to avoid getting a string
|
154
|
-
yours = other.instance_variable_get(:@prerelease)
|
155
|
-
|
156
|
-
# A version that has a prerelease is always less than a version that doesn't
|
157
|
-
if mine.nil?
|
158
|
-
yours.nil? ? 0 : 1
|
159
|
-
elsif yours.nil?
|
160
|
-
-1
|
161
|
-
else
|
162
|
-
# Compare all prerelease identifier segments that can be compared. Should
|
163
|
-
# all segments compare equal up to the point where one of the prereleases
|
164
|
-
# have no more segments, then the one with more segments is greater.
|
165
|
-
your_max = yours.size
|
166
|
-
mine.each_with_index do |x, idx|
|
167
|
-
# 'mine' win if 'your' list of segments is exhausted
|
168
|
-
return 1 if idx >= your_max
|
169
|
-
y = yours[idx]
|
170
|
-
|
171
|
-
# Integer always wins over String
|
172
|
-
cmp = if x.is_a?(Integer)
|
173
|
-
y.is_a?(Integer) ? x <=> y : -1
|
174
|
-
elsif y.is_a?(Integer)
|
175
|
-
1
|
176
|
-
else
|
177
|
-
x <=> y
|
178
|
-
end
|
179
|
-
|
180
|
-
# No need to continue if a diff is found
|
181
|
-
return cmp unless cmp == 0
|
182
|
-
end
|
183
|
-
|
184
|
-
# All segments, up to the point where at least one list of segment is exhausted,
|
185
|
-
# compared equal. The one with the highest segment count wins.
|
186
|
-
mine.size <=> your_max
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
# Version string matching regexes
|
191
|
-
REGEX_NUMERIC = '(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)'.freeze # Major . Minor . Patch
|
192
|
-
REGEX_PRE = '(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?'.freeze # Prerelease
|
193
|
-
REGEX_BUILD = '(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?'.freeze # Build
|
194
|
-
REGEX_FULL = REGEX_NUMERIC + REGEX_PRE + REGEX_BUILD.freeze
|
195
|
-
REGEX_FULL_RX = /\A#{REGEX_FULL}\Z/.freeze
|
196
|
-
|
197
|
-
# The lowest precedence Version possible
|
198
|
-
MIN = self.new(0, 0, 0, [].freeze).freeze
|
199
|
-
|
200
|
-
# The highest precedence Version possible
|
201
|
-
MAX = self.new(Float::INFINITY, 0, 0).freeze
|
202
|
-
end
|
203
|
-
end
|
@@ -1,758 +0,0 @@
|
|
1
|
-
require 'semantic_puppet'
|
2
|
-
|
3
|
-
module SemanticPuppet
|
4
|
-
# A Semantic Version Range.
|
5
|
-
#
|
6
|
-
# @see https://github.com/npm/node-semver for full specification
|
7
|
-
# @api public
|
8
|
-
class VersionRange
|
9
|
-
UPPER_X = 'X'.freeze
|
10
|
-
LOWER_X = 'x'.freeze
|
11
|
-
STAR = '*'.freeze
|
12
|
-
|
13
|
-
NR = '0|[1-9][0-9]*'.freeze
|
14
|
-
XR = '(x|X|\*|' + NR + ')'.freeze
|
15
|
-
XR_NC = '(?:x|X|\*|' + NR + ')'.freeze
|
16
|
-
|
17
|
-
PART = '(?:[0-9A-Za-z-]+)'.freeze
|
18
|
-
PARTS = PART + '(?:\.' + PART + ')*'.freeze
|
19
|
-
QUALIFIER = '(?:-(' + PARTS + '))?(?:\+(' + PARTS + '))?'.freeze
|
20
|
-
QUALIFIER_NC = '(?:-' + PARTS + ')?(?:\+' + PARTS + ')?'.freeze
|
21
|
-
|
22
|
-
PARTIAL = XR_NC + '(?:\.' + XR_NC + '(?:\.' + XR_NC + QUALIFIER_NC + ')?)?'.freeze
|
23
|
-
|
24
|
-
# The ~> isn't in the spec but allowed
|
25
|
-
SIMPLE = '([<>=~^]|<=|>=|~>|~=)?(' + PARTIAL + ')'.freeze
|
26
|
-
SIMPLE_EXPR = /\A#{SIMPLE}\z/.freeze
|
27
|
-
|
28
|
-
SIMPLE_WITH_EXTRA_WS = '([<>=~^]|<=|>=)?\s+(' + PARTIAL + ')'.freeze
|
29
|
-
SIMPLE_WITH_EXTRA_WS_EXPR = /\A#{SIMPLE_WITH_EXTRA_WS}\z/.freeze
|
30
|
-
|
31
|
-
HYPHEN = '(' + PARTIAL + ')\s+-\s+(' + PARTIAL + ')'.freeze
|
32
|
-
HYPHEN_EXPR = /\A#{HYPHEN}\z/.freeze
|
33
|
-
|
34
|
-
PARTIAL_EXPR = /\A#{XR}(?:\.#{XR}(?:\.#{XR}#{QUALIFIER})?)?\z/.freeze
|
35
|
-
|
36
|
-
LOGICAL_OR = /\s*\|\|\s*/.freeze
|
37
|
-
RANGE_SPLIT = /\s+/.freeze
|
38
|
-
|
39
|
-
# Parses a version range string into a comparable {VersionRange} instance.
|
40
|
-
#
|
41
|
-
# Currently parsed version range string may take any of the following:
|
42
|
-
# forms:
|
43
|
-
#
|
44
|
-
# * Regular Semantic Version strings
|
45
|
-
# * ex. `"1.0.0"`, `"1.2.3-pre"`
|
46
|
-
# * Partial Semantic Version strings
|
47
|
-
# * ex. `"1.0.x"`, `"1"`, `"2.X"`, `"3.*"`,
|
48
|
-
# * Inequalities
|
49
|
-
# * ex. `"> 1.0.0"`, `"<3.2.0"`, `">=4.0.0"`
|
50
|
-
# * Approximate Caret Versions
|
51
|
-
# * ex. `"^1"`, `"^3.2"`, `"^4.1.0"`
|
52
|
-
# * Approximate Tilde Versions
|
53
|
-
# * ex. `"~1.0.0"`, `"~ 3.2.0"`, `"~4.0.0"`
|
54
|
-
# * Inclusive Ranges
|
55
|
-
# * ex. `"1.0.0 - 1.3.9"`
|
56
|
-
# * Range Intersections
|
57
|
-
# * ex. `">1.0.0 <=2.3.0"`
|
58
|
-
# * Combined ranges
|
59
|
-
# * ex, `">=1.0.0 <2.3.0 || >=2.5.0 <3.0.0"`
|
60
|
-
#
|
61
|
-
# @param range_string [String] the version range string to parse
|
62
|
-
# @param strict_semver [Boolean] `false` if pre-releases should be included even when not explicitly appointed
|
63
|
-
# @return [VersionRange] a new {VersionRange} instance
|
64
|
-
# @api public
|
65
|
-
def self.parse(range_string, strict_semver = true)
|
66
|
-
# Remove extra whitespace after operators. Such whitespace should not cause a split
|
67
|
-
range_set = range_string.gsub(/([><=~^])(?:\s+|\s*v)/, '\1')
|
68
|
-
ranges = range_set.split(LOGICAL_OR)
|
69
|
-
return ALL_RANGE if ranges.empty?
|
70
|
-
|
71
|
-
new(ranges.map do |range|
|
72
|
-
if range =~ HYPHEN_EXPR
|
73
|
-
MinMaxRange.create(GtEqRange.new(parse_version($1)), LtEqRange.new(parse_version($2)))
|
74
|
-
else
|
75
|
-
# Split on whitespace
|
76
|
-
simples = range.split(RANGE_SPLIT).map do |simple|
|
77
|
-
match_data = SIMPLE_EXPR.match(simple)
|
78
|
-
raise ArgumentError, _("Unparsable version range: \"%{range}\"") % { range: range_string } unless match_data
|
79
|
-
operand = match_data[2]
|
80
|
-
|
81
|
-
# Case based on operator
|
82
|
-
case match_data[1]
|
83
|
-
when '~', '~>', '~='
|
84
|
-
parse_tilde(operand)
|
85
|
-
when '^'
|
86
|
-
parse_caret(operand)
|
87
|
-
when '>'
|
88
|
-
parse_gt_version(operand)
|
89
|
-
when '>='
|
90
|
-
GtEqRange.new(parse_version(operand))
|
91
|
-
when '<'
|
92
|
-
LtRange.new(parse_version(operand))
|
93
|
-
when '<='
|
94
|
-
parse_lteq_version(operand)
|
95
|
-
when '='
|
96
|
-
parse_xrange(operand)
|
97
|
-
else
|
98
|
-
parse_xrange(operand)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
simples.size == 1 ? simples[0] : MinMaxRange.create(*simples)
|
102
|
-
end
|
103
|
-
end.uniq, range_string, strict_semver).freeze
|
104
|
-
end
|
105
|
-
|
106
|
-
def self.parse_partial(expr)
|
107
|
-
match_data = PARTIAL_EXPR.match(expr)
|
108
|
-
raise ArgumentError, _("Unparsable version range: \"%{expr}\"") % { expr: expr } unless match_data
|
109
|
-
match_data
|
110
|
-
end
|
111
|
-
private_class_method :parse_partial
|
112
|
-
|
113
|
-
def self.parse_caret(expr)
|
114
|
-
match_data = parse_partial(expr)
|
115
|
-
major = digit(match_data[1])
|
116
|
-
major == 0 ? allow_patch_updates(major, match_data) : allow_minor_updates(major, match_data)
|
117
|
-
end
|
118
|
-
private_class_method :parse_caret
|
119
|
-
|
120
|
-
def self.parse_tilde(expr)
|
121
|
-
match_data = parse_partial(expr)
|
122
|
-
allow_patch_updates(digit(match_data[1]), match_data)
|
123
|
-
end
|
124
|
-
private_class_method :parse_tilde
|
125
|
-
|
126
|
-
def self.parse_xrange(expr)
|
127
|
-
match_data = parse_partial(expr)
|
128
|
-
allow_patch_updates(digit(match_data[1]), match_data, false)
|
129
|
-
end
|
130
|
-
private_class_method :parse_xrange
|
131
|
-
|
132
|
-
def self.allow_patch_updates(major, match_data, tilde_or_caret = true)
|
133
|
-
return AllRange::SINGLETON unless major
|
134
|
-
|
135
|
-
minor = digit(match_data[2])
|
136
|
-
return MinMaxRange.new(GtEqRange.new(Version.new(major, 0, 0)), LtRange.new(Version.new(major + 1, 0, 0))) unless minor
|
137
|
-
|
138
|
-
patch = digit(match_data[3])
|
139
|
-
return MinMaxRange.new(GtEqRange.new(Version.new(major, minor, 0)), LtRange.new(Version.new(major, minor + 1, 0))) unless patch
|
140
|
-
|
141
|
-
version = Version.new(major, minor, patch, Version.parse_prerelease(match_data[4]), Version.parse_build(match_data[5]))
|
142
|
-
return EqRange.new(version) unless tilde_or_caret
|
143
|
-
|
144
|
-
MinMaxRange.new(GtEqRange.new(version), LtRange.new(Version.new(major, minor + 1, 0)))
|
145
|
-
end
|
146
|
-
private_class_method :allow_patch_updates
|
147
|
-
|
148
|
-
def self.allow_minor_updates(major, match_data)
|
149
|
-
return AllRange.SINGLETON unless major
|
150
|
-
minor = digit(match_data[2])
|
151
|
-
if minor
|
152
|
-
patch = digit(match_data[3])
|
153
|
-
if patch.nil?
|
154
|
-
MinMaxRange.new(GtEqRange.new(Version.new(major, minor, 0)), LtRange.new(Version.new(major + 1, 0, 0)))
|
155
|
-
else
|
156
|
-
if match_data[4].nil?
|
157
|
-
MinMaxRange.new(GtEqRange.new(Version.new(major, minor, patch)), LtRange.new(Version.new(major + 1, 0, 0)))
|
158
|
-
else
|
159
|
-
MinMaxRange.new(
|
160
|
-
GtEqRange.new(
|
161
|
-
Version.new(major, minor, patch, Version.parse_prerelease(match_data[4]), Version.parse_build(match_data[5]))),
|
162
|
-
LtRange.new(Version.new(major + 1, 0, 0)))
|
163
|
-
end
|
164
|
-
end
|
165
|
-
else
|
166
|
-
MinMaxRange.new(GtEqRange.new(Version.new(major, 0, 0)), LtRange.new(Version.new(major + 1, 0, 0)))
|
167
|
-
end
|
168
|
-
end
|
169
|
-
private_class_method :allow_minor_updates
|
170
|
-
|
171
|
-
def self.digit(str)
|
172
|
-
(str.nil? || UPPER_X == str || LOWER_X == str || STAR == str) ? nil : str.to_i
|
173
|
-
end
|
174
|
-
private_class_method :digit
|
175
|
-
|
176
|
-
def self.parse_version(expr)
|
177
|
-
match_data = parse_partial(expr)
|
178
|
-
major = digit(match_data[1]) || 0
|
179
|
-
minor = digit(match_data[2]) || 0
|
180
|
-
patch = digit(match_data[3]) || 0
|
181
|
-
Version.new(major, minor, patch, Version.parse_prerelease(match_data[4]), Version.parse_build(match_data[5]))
|
182
|
-
end
|
183
|
-
private_class_method :parse_version
|
184
|
-
|
185
|
-
def self.parse_gt_version(expr)
|
186
|
-
match_data = parse_partial(expr)
|
187
|
-
major = digit(match_data[1])
|
188
|
-
return LtRange::MATCH_NOTHING unless major
|
189
|
-
minor = digit(match_data[2])
|
190
|
-
return GtEqRange.new(Version.new(major + 1, 0, 0)) unless minor
|
191
|
-
patch = digit(match_data[3])
|
192
|
-
return GtEqRange.new(Version.new(major, minor + 1, 0)) unless patch
|
193
|
-
return GtRange.new(Version.new(major, minor, patch, Version.parse_prerelease(match_data[4]), Version.parse_build(match_data[5])))
|
194
|
-
end
|
195
|
-
private_class_method :parse_gt_version
|
196
|
-
|
197
|
-
def self.parse_lteq_version(expr)
|
198
|
-
match_data = parse_partial(expr)
|
199
|
-
major = digit(match_data[1])
|
200
|
-
return AllRange.SINGLETON unless major
|
201
|
-
minor = digit(match_data[2])
|
202
|
-
return LtRange.new(Version.new(major + 1, 0, 0)) unless minor
|
203
|
-
patch = digit(match_data[3])
|
204
|
-
return LtRange.new(Version.new(major, minor + 1, 0)) unless patch
|
205
|
-
return LtEqRange.new(Version.new(major, minor, patch, Version.parse_prerelease(match_data[4]), Version.parse_build(match_data[5])))
|
206
|
-
end
|
207
|
-
private_class_method :parse_lteq_version
|
208
|
-
|
209
|
-
# Provides read access to the ranges. For internal use only
|
210
|
-
# @api private
|
211
|
-
attr_reader :ranges
|
212
|
-
|
213
|
-
# Creates a new version range
|
214
|
-
# @overload initialize(from, to, exclude_end = false)
|
215
|
-
# Creates a new instance using ruby `Range` semantics
|
216
|
-
# @param begin [String,Version] the version denoting the start of the range (always inclusive)
|
217
|
-
# @param end [String,Version] the version denoting the end of the range
|
218
|
-
# @param exclude_end [Boolean] `true` if the `end` version should be excluded from the range
|
219
|
-
# @overload initialize(ranges, string)
|
220
|
-
# Creates a new instance based on parsed content. For internal use only
|
221
|
-
# @param ranges [Array<AbstractRange>] the ranges to include in this range
|
222
|
-
# @param string [String] the original string representation that was parsed to produce the ranges
|
223
|
-
# @param strict_semver [Boolean] `false` if pre-releases should be included even when not explicitly appointed
|
224
|
-
#
|
225
|
-
# @api private
|
226
|
-
def initialize(ranges, string, exclude_end = nil)
|
227
|
-
if ranges.is_a?(Array)
|
228
|
-
@strict_semver = exclude_end.nil? ? true : exclude_end
|
229
|
-
else
|
230
|
-
lb = GtEqRange.new(ranges)
|
231
|
-
if exclude_end
|
232
|
-
ub = LtRange.new(string)
|
233
|
-
string = ">=#{string} <#{ranges}"
|
234
|
-
else
|
235
|
-
ub = LtEqRange.new(string)
|
236
|
-
string = "#{string} - #{ranges}"
|
237
|
-
end
|
238
|
-
ranges = [MinMaxRange.create(lb, ub)]
|
239
|
-
@strict_semver = true
|
240
|
-
end
|
241
|
-
ranges.compact!
|
242
|
-
|
243
|
-
merge_happened = true
|
244
|
-
while ranges.size > 1 && merge_happened
|
245
|
-
# merge ranges if possible
|
246
|
-
merge_happened = false
|
247
|
-
result = []
|
248
|
-
until ranges.empty?
|
249
|
-
unmerged = []
|
250
|
-
x = ranges.pop
|
251
|
-
result << ranges.reduce(x) do |memo, y|
|
252
|
-
merged = memo.merge(y)
|
253
|
-
if merged.nil?
|
254
|
-
unmerged << y
|
255
|
-
else
|
256
|
-
merge_happened = true
|
257
|
-
memo = merged
|
258
|
-
end
|
259
|
-
memo
|
260
|
-
end
|
261
|
-
ranges = unmerged
|
262
|
-
end
|
263
|
-
ranges = result.reverse!
|
264
|
-
end
|
265
|
-
|
266
|
-
ranges = [LtRange::MATCH_NOTHING] if ranges.empty?
|
267
|
-
@ranges = ranges
|
268
|
-
@string = string.nil? ? ranges.join(' || ') : string
|
269
|
-
end
|
270
|
-
|
271
|
-
def eql?(range)
|
272
|
-
range.is_a?(VersionRange) && @ranges.eql?(range.ranges)
|
273
|
-
end
|
274
|
-
alias == eql?
|
275
|
-
|
276
|
-
def hash
|
277
|
-
@ranges.hash
|
278
|
-
end
|
279
|
-
|
280
|
-
# Returns the version that denotes the beginning of this range.
|
281
|
-
#
|
282
|
-
# Since this really is an OR between disparate ranges, it may have multiple beginnings. This method
|
283
|
-
# returns `nil` if that is the case.
|
284
|
-
#
|
285
|
-
# @return [Version] the beginning of the range, or `nil` if there are multiple beginnings
|
286
|
-
# @api public
|
287
|
-
def begin
|
288
|
-
@ranges.size == 1 ? @ranges[0].begin : nil
|
289
|
-
end
|
290
|
-
|
291
|
-
# Returns the version that denotes the end of this range.
|
292
|
-
#
|
293
|
-
# Since this really is an OR between disparate ranges, it may have multiple ends. This method
|
294
|
-
# returns `nil` if that is the case.
|
295
|
-
#
|
296
|
-
# @return [Version] the end of the range, or `nil` if there are multiple ends
|
297
|
-
# @api public
|
298
|
-
def end
|
299
|
-
@ranges.size == 1 ? @ranges[0].end : nil
|
300
|
-
end
|
301
|
-
|
302
|
-
# Returns `true` if the beginning is excluded from the range.
|
303
|
-
#
|
304
|
-
# Since this really is an OR between disparate ranges, it may have multiple beginnings. This method
|
305
|
-
# returns `nil` if that is the case.
|
306
|
-
#
|
307
|
-
# @return [Boolean] `true` if the beginning is excluded from the range, `false` if included, or `nil` if there are multiple beginnings
|
308
|
-
# @api public
|
309
|
-
def exclude_begin?
|
310
|
-
@ranges.size == 1 ? @ranges[0].exclude_begin? : nil
|
311
|
-
end
|
312
|
-
|
313
|
-
# Returns `true` if the end is excluded from the range.
|
314
|
-
#
|
315
|
-
# Since this really is an OR between disparate ranges, it may have multiple ends. This method
|
316
|
-
# returns `nil` if that is the case.
|
317
|
-
#
|
318
|
-
# @return [Boolean] `true` if the end is excluded from the range, `false` if not, or `nil` if there are multiple ends
|
319
|
-
# @api public
|
320
|
-
def exclude_end?
|
321
|
-
@ranges.size == 1 ? @ranges[0].exclude_end? : nil
|
322
|
-
end
|
323
|
-
|
324
|
-
# @return [Boolean] `true` if the given version is included in the range
|
325
|
-
# @api public
|
326
|
-
def include?(version)
|
327
|
-
if @strict_semver
|
328
|
-
@ranges.any? { |range| range.include?(version) && (version.stable? || range.test_prerelease?(version)) }
|
329
|
-
else
|
330
|
-
@ranges.any? { |range| range.include?(version) || !version.stable? && range.stable? && range.include?(version.to_stable) }
|
331
|
-
end
|
332
|
-
end
|
333
|
-
alias member? include?
|
334
|
-
alias cover? include?
|
335
|
-
alias === include?
|
336
|
-
|
337
|
-
# Computes the intersection of a pair of ranges. If the ranges have no
|
338
|
-
# useful intersection, an empty range is returned.
|
339
|
-
#
|
340
|
-
# @param other [VersionRange] the range to intersect with
|
341
|
-
# @return [VersionRange] the common subset
|
342
|
-
# @api public
|
343
|
-
def intersection(other)
|
344
|
-
raise ArgumentError, _("value must be a %{type}") % { :type => self.class.name } unless other.is_a?(VersionRange)
|
345
|
-
result = @ranges.map { |range| other.ranges.map { |o_range| range.intersection(o_range) } }.flatten
|
346
|
-
result.compact!
|
347
|
-
result.uniq!
|
348
|
-
result.empty? ? EMPTY_RANGE : VersionRange.new(result, nil)
|
349
|
-
end
|
350
|
-
alias :& :intersection
|
351
|
-
|
352
|
-
# Returns a string representation of this range. This will be the string that was used
|
353
|
-
# when the range was parsed.
|
354
|
-
#
|
355
|
-
# @return [String] a range expression representing this VersionRange
|
356
|
-
# @api public
|
357
|
-
def to_s
|
358
|
-
@string
|
359
|
-
end
|
360
|
-
|
361
|
-
# Returns a canonical string representation of this range, assembled from the internal
|
362
|
-
# matchers.
|
363
|
-
#
|
364
|
-
# @return [String] a range expression representing this VersionRange
|
365
|
-
# @api public
|
366
|
-
def inspect
|
367
|
-
@ranges.join(' || ')
|
368
|
-
end
|
369
|
-
|
370
|
-
# @api private
|
371
|
-
class AbstractRange
|
372
|
-
def include?(_)
|
373
|
-
true
|
374
|
-
end
|
375
|
-
|
376
|
-
def begin
|
377
|
-
Version::MIN
|
378
|
-
end
|
379
|
-
|
380
|
-
def end
|
381
|
-
Version::MAX
|
382
|
-
end
|
383
|
-
|
384
|
-
def exclude_begin?
|
385
|
-
false
|
386
|
-
end
|
387
|
-
|
388
|
-
def exclude_end?
|
389
|
-
false
|
390
|
-
end
|
391
|
-
|
392
|
-
def eql?(other)
|
393
|
-
other.class.eql?(self.class)
|
394
|
-
end
|
395
|
-
|
396
|
-
def ==(other)
|
397
|
-
eql?(other)
|
398
|
-
end
|
399
|
-
|
400
|
-
def lower_bound?
|
401
|
-
false
|
402
|
-
end
|
403
|
-
|
404
|
-
def upper_bound?
|
405
|
-
false
|
406
|
-
end
|
407
|
-
|
408
|
-
# Merge two ranges so that the result matches the intersection of all matching versions.
|
409
|
-
#
|
410
|
-
# @param range [AbstractRange] the range to intersect with
|
411
|
-
# @return [AbstractRange,nil] the intersection between the ranges
|
412
|
-
#
|
413
|
-
# @api private
|
414
|
-
def intersection(range)
|
415
|
-
cmp = self.begin <=> range.end
|
416
|
-
if cmp > 0
|
417
|
-
nil
|
418
|
-
elsif cmp == 0
|
419
|
-
exclude_begin? || range.exclude_end? ? nil : EqRange.new(self.begin)
|
420
|
-
else
|
421
|
-
cmp = range.begin <=> self.end
|
422
|
-
if cmp > 0
|
423
|
-
nil
|
424
|
-
elsif cmp == 0
|
425
|
-
range.exclude_begin? || exclude_end? ? nil : EqRange.new(range.begin)
|
426
|
-
else
|
427
|
-
cmp = self.begin <=> range.begin
|
428
|
-
min = if cmp < 0
|
429
|
-
range
|
430
|
-
elsif cmp > 0
|
431
|
-
self
|
432
|
-
else
|
433
|
-
self.exclude_begin? ? self : range
|
434
|
-
end
|
435
|
-
|
436
|
-
cmp = self.end <=> range.end
|
437
|
-
max = if cmp > 0
|
438
|
-
range
|
439
|
-
elsif cmp < 0
|
440
|
-
self
|
441
|
-
else
|
442
|
-
self.exclude_end? ? self : range
|
443
|
-
end
|
444
|
-
|
445
|
-
if !max.upper_bound?
|
446
|
-
min
|
447
|
-
elsif !min.lower_bound?
|
448
|
-
max
|
449
|
-
else
|
450
|
-
MinMaxRange.new(min, max)
|
451
|
-
end
|
452
|
-
end
|
453
|
-
end
|
454
|
-
end
|
455
|
-
|
456
|
-
# Merge two ranges so that the result matches the sum of all matching versions. A merge
|
457
|
-
# is only possible when the ranges are either adjacent or have an overlap.
|
458
|
-
#
|
459
|
-
# @param other [AbstractRange] the range to merge with
|
460
|
-
# @return [AbstractRange,nil] the result of the merge
|
461
|
-
#
|
462
|
-
# @api private
|
463
|
-
def merge(other)
|
464
|
-
if include?(other.begin) || other.include?(self.begin)
|
465
|
-
cmp = self.begin <=> other.begin
|
466
|
-
if cmp < 0
|
467
|
-
min = self.begin
|
468
|
-
excl_begin = exclude_begin?
|
469
|
-
elsif cmp > 0
|
470
|
-
min = other.begin
|
471
|
-
excl_begin = other.exclude_begin?
|
472
|
-
else
|
473
|
-
min = self.begin
|
474
|
-
excl_begin = exclude_begin? && other.exclude_begin?
|
475
|
-
end
|
476
|
-
|
477
|
-
cmp = self.end <=> other.end
|
478
|
-
if cmp > 0
|
479
|
-
max = self.end
|
480
|
-
excl_end = self.exclude_end?
|
481
|
-
elsif cmp < 0
|
482
|
-
max = other.end
|
483
|
-
excl_end = other.exclude_end?
|
484
|
-
else
|
485
|
-
max = self.end
|
486
|
-
excl_end = exclude_end && other.exclude_end?
|
487
|
-
end
|
488
|
-
|
489
|
-
MinMaxRange.create(excl_begin ? GtRange.new(min) : GtEqRange.new(min), excl_end ? LtRange.new(max) : LtEqRange.new(max))
|
490
|
-
elsif exclude_end? && !other.exclude_begin? && self.end == other.begin
|
491
|
-
# Adjacent, self before other
|
492
|
-
from_to(self, other)
|
493
|
-
elsif other.exclude_end? && !exclude_begin? && other.end == self.begin
|
494
|
-
# Adjacent, other before self
|
495
|
-
from_to(other, self)
|
496
|
-
elsif !exclude_end? && !other.exclude_begin? && self.end.next(:patch) == other.begin
|
497
|
-
# Adjacent, self before other
|
498
|
-
from_to(self, other)
|
499
|
-
elsif !other.exclude_end? && !exclude_begin? && other.end.next(:patch) == self.begin
|
500
|
-
# Adjacent, other before self
|
501
|
-
from_to(other, self)
|
502
|
-
else
|
503
|
-
# No overlap
|
504
|
-
nil
|
505
|
-
end
|
506
|
-
end
|
507
|
-
|
508
|
-
# Checks if this matcher accepts a prerelease with the same major, minor, patch triple as the given version. Only matchers
|
509
|
-
# where this has been explicitly stated will respond `true` to this method
|
510
|
-
#
|
511
|
-
# @return [Boolean] `true` if this matcher accepts a prerelease with the tuple from the given version
|
512
|
-
def test_prerelease?(_)
|
513
|
-
false
|
514
|
-
end
|
515
|
-
|
516
|
-
def stable?
|
517
|
-
false
|
518
|
-
end
|
519
|
-
|
520
|
-
private
|
521
|
-
|
522
|
-
def from_to(a, b)
|
523
|
-
MinMaxRange.create(a.exclude_begin? ? GtRange.new(a.begin) : GtEqRange.new(a.begin), b.exclude_end? ? LtRange.new(b.end) : LtEqRange.new(b.end))
|
524
|
-
end
|
525
|
-
end
|
526
|
-
|
527
|
-
# @api private
|
528
|
-
class AllRange < AbstractRange
|
529
|
-
SINGLETON = AllRange.new
|
530
|
-
|
531
|
-
def intersection(range)
|
532
|
-
range
|
533
|
-
end
|
534
|
-
|
535
|
-
def merge(range)
|
536
|
-
self
|
537
|
-
end
|
538
|
-
|
539
|
-
def test_prerelease?(_)
|
540
|
-
true
|
541
|
-
end
|
542
|
-
|
543
|
-
def stable?
|
544
|
-
true
|
545
|
-
end
|
546
|
-
|
547
|
-
def to_s
|
548
|
-
'*'
|
549
|
-
end
|
550
|
-
end
|
551
|
-
|
552
|
-
# @api private
|
553
|
-
class MinMaxRange < AbstractRange
|
554
|
-
attr_reader :min, :max
|
555
|
-
|
556
|
-
def self.create(*ranges)
|
557
|
-
ranges.reduce { |memo, range| memo.intersection(range) }
|
558
|
-
end
|
559
|
-
|
560
|
-
def initialize(min, max)
|
561
|
-
@min = min.is_a?(MinMaxRange) ? min.min : min
|
562
|
-
@max = max.is_a?(MinMaxRange) ? max.max : max
|
563
|
-
end
|
564
|
-
|
565
|
-
def begin
|
566
|
-
@min.begin
|
567
|
-
end
|
568
|
-
|
569
|
-
def end
|
570
|
-
@max.end
|
571
|
-
end
|
572
|
-
|
573
|
-
def exclude_begin?
|
574
|
-
@min.exclude_begin?
|
575
|
-
end
|
576
|
-
|
577
|
-
def exclude_end?
|
578
|
-
@max.exclude_end?
|
579
|
-
end
|
580
|
-
|
581
|
-
def eql?(other)
|
582
|
-
super && @min.eql?(other.min) && @max.eql?(other.max)
|
583
|
-
end
|
584
|
-
|
585
|
-
def hash
|
586
|
-
@min.hash ^ @max.hash
|
587
|
-
end
|
588
|
-
|
589
|
-
def include?(version)
|
590
|
-
@min.include?(version) && @max.include?(version)
|
591
|
-
end
|
592
|
-
|
593
|
-
def lower_bound?
|
594
|
-
@min.lower_bound?
|
595
|
-
end
|
596
|
-
|
597
|
-
def upper_bound?
|
598
|
-
@max.upper_bound?
|
599
|
-
end
|
600
|
-
|
601
|
-
def test_prerelease?(version)
|
602
|
-
@min.test_prerelease?(version) || @max.test_prerelease?(version)
|
603
|
-
end
|
604
|
-
|
605
|
-
def stable?
|
606
|
-
@min.stable? && @max.stable?
|
607
|
-
end
|
608
|
-
|
609
|
-
def to_s
|
610
|
-
"#{@min} #{@max}"
|
611
|
-
end
|
612
|
-
alias inspect to_s
|
613
|
-
end
|
614
|
-
|
615
|
-
# @api private
|
616
|
-
class ComparatorRange < AbstractRange
|
617
|
-
attr_reader :version
|
618
|
-
|
619
|
-
def initialize(version)
|
620
|
-
@version = version
|
621
|
-
end
|
622
|
-
|
623
|
-
def eql?(other)
|
624
|
-
super && @version.eql?(other.version)
|
625
|
-
end
|
626
|
-
|
627
|
-
def hash
|
628
|
-
@class.hash ^ @version.hash
|
629
|
-
end
|
630
|
-
|
631
|
-
# Checks if this matcher accepts a prerelease with the same major, minor, patch triple as the given version
|
632
|
-
def test_prerelease?(version)
|
633
|
-
!@version.stable? && @version.major == version.major && @version.minor == version.minor && @version.patch == version.patch
|
634
|
-
end
|
635
|
-
|
636
|
-
def stable?
|
637
|
-
@version.stable?
|
638
|
-
end
|
639
|
-
end
|
640
|
-
|
641
|
-
# @api private
|
642
|
-
class GtRange < ComparatorRange
|
643
|
-
def include?(version)
|
644
|
-
version > @version
|
645
|
-
end
|
646
|
-
|
647
|
-
def exclude_begin?
|
648
|
-
true
|
649
|
-
end
|
650
|
-
|
651
|
-
def begin
|
652
|
-
@version
|
653
|
-
end
|
654
|
-
|
655
|
-
def lower_bound?
|
656
|
-
true
|
657
|
-
end
|
658
|
-
|
659
|
-
def to_s
|
660
|
-
">#{@version}"
|
661
|
-
end
|
662
|
-
end
|
663
|
-
|
664
|
-
# @api private
|
665
|
-
class GtEqRange < ComparatorRange
|
666
|
-
def include?(version)
|
667
|
-
version >= @version
|
668
|
-
end
|
669
|
-
|
670
|
-
def begin
|
671
|
-
@version
|
672
|
-
end
|
673
|
-
|
674
|
-
def lower_bound?
|
675
|
-
@version != Version::MIN
|
676
|
-
end
|
677
|
-
|
678
|
-
def to_s
|
679
|
-
">=#{@version}"
|
680
|
-
end
|
681
|
-
end
|
682
|
-
|
683
|
-
# @api private
|
684
|
-
class LtRange < ComparatorRange
|
685
|
-
MATCH_NOTHING = LtRange.new(Version::MIN)
|
686
|
-
|
687
|
-
def include?(version)
|
688
|
-
version < @version
|
689
|
-
end
|
690
|
-
|
691
|
-
def exclude_end?
|
692
|
-
true
|
693
|
-
end
|
694
|
-
|
695
|
-
def end
|
696
|
-
@version
|
697
|
-
end
|
698
|
-
|
699
|
-
def upper_bound?
|
700
|
-
true
|
701
|
-
end
|
702
|
-
|
703
|
-
def to_s
|
704
|
-
self.equal?(MATCH_NOTHING) ? '<0.0.0' : "<#{@version}"
|
705
|
-
end
|
706
|
-
end
|
707
|
-
|
708
|
-
# @api private
|
709
|
-
class LtEqRange < ComparatorRange
|
710
|
-
def include?(version)
|
711
|
-
version <= @version
|
712
|
-
end
|
713
|
-
|
714
|
-
def end
|
715
|
-
@version
|
716
|
-
end
|
717
|
-
|
718
|
-
def upper_bound?
|
719
|
-
@version != Version::MAX
|
720
|
-
end
|
721
|
-
|
722
|
-
def to_s
|
723
|
-
"<=#{@version}"
|
724
|
-
end
|
725
|
-
end
|
726
|
-
|
727
|
-
# @api private
|
728
|
-
class EqRange < ComparatorRange
|
729
|
-
def include?(version)
|
730
|
-
version == @version
|
731
|
-
end
|
732
|
-
|
733
|
-
def begin
|
734
|
-
@version
|
735
|
-
end
|
736
|
-
|
737
|
-
def lower_bound?
|
738
|
-
@version != Version::MIN
|
739
|
-
end
|
740
|
-
|
741
|
-
def upper_bound?
|
742
|
-
@version != Version::MAX
|
743
|
-
end
|
744
|
-
|
745
|
-
def end
|
746
|
-
@version
|
747
|
-
end
|
748
|
-
|
749
|
-
def to_s
|
750
|
-
@version.to_s
|
751
|
-
end
|
752
|
-
end
|
753
|
-
|
754
|
-
# A range that matches no versions
|
755
|
-
EMPTY_RANGE = VersionRange.new([], nil).freeze
|
756
|
-
ALL_RANGE = VersionRange.new([AllRange::SINGLETON], '*')
|
757
|
-
end
|
758
|
-
end
|