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.

Files changed (256) hide show
  1. checksums.yaml +4 -4
  2. data/bolt-modules/boltlib/lib/puppet/functions/run_task.rb +3 -3
  3. data/bolt-modules/boltlib/lib/puppet/functions/set_feature.rb +33 -0
  4. data/lib/bolt/inventory.rb +19 -1
  5. data/lib/bolt/target.rb +15 -0
  6. data/lib/bolt/transport/local.rb +6 -1
  7. data/lib/bolt/transport/orch.rb +2 -0
  8. data/lib/bolt/transport/ssh.rb +7 -2
  9. data/lib/bolt/transport/winrm.rb +6 -1
  10. data/lib/bolt/version.rb +1 -1
  11. data/modules/facts/plans/retrieve.pp +2 -26
  12. data/modules/facts/tasks/init.json +9 -0
  13. data/vendored/puppet/lib/hiera/puppet_function.rb +1 -1
  14. data/vendored/puppet/lib/hiera/scope.rb +24 -2
  15. data/vendored/puppet/lib/puppet.rb +4 -13
  16. data/vendored/puppet/lib/puppet/application.rb +2 -2
  17. data/vendored/puppet/lib/puppet/application/agent.rb +1 -1
  18. data/vendored/puppet/lib/puppet/application/apply.rb +1 -1
  19. data/vendored/puppet/lib/puppet/application/cert.rb +1 -1
  20. data/vendored/puppet/lib/puppet/application/device.rb +8 -8
  21. data/vendored/puppet/lib/puppet/application/face_base.rb +1 -1
  22. data/vendored/puppet/lib/puppet/application/lookup.rb +2 -2
  23. data/vendored/puppet/lib/puppet/application/resource.rb +2 -2
  24. data/vendored/puppet/lib/puppet/application/script.rb +1 -1
  25. data/vendored/puppet/lib/puppet/configurer.rb +47 -24
  26. data/vendored/puppet/lib/puppet/confine.rb +4 -1
  27. data/vendored/puppet/lib/puppet/context.rb +1 -1
  28. data/vendored/puppet/lib/puppet/defaults.rb +32 -44
  29. data/vendored/puppet/lib/puppet/error.rb +14 -7
  30. data/vendored/puppet/lib/puppet/external/dot.rb +23 -17
  31. data/vendored/puppet/lib/puppet/face/config.rb +58 -3
  32. data/vendored/puppet/lib/puppet/face/epp.rb +1 -1
  33. data/vendored/puppet/lib/puppet/face/module/build.rb +3 -3
  34. data/vendored/puppet/lib/puppet/face/module/install.rb +0 -4
  35. data/vendored/puppet/lib/puppet/face/module/list.rb +0 -5
  36. data/vendored/puppet/lib/puppet/face/module/search.rb +1 -1
  37. data/vendored/puppet/lib/puppet/face/module/uninstall.rb +0 -4
  38. data/vendored/puppet/lib/puppet/face/module/upgrade.rb +0 -4
  39. data/vendored/puppet/lib/puppet/face/status.rb +2 -2
  40. data/vendored/puppet/lib/puppet/file_serving/base.rb +5 -5
  41. data/vendored/puppet/lib/puppet/file_serving/metadata.rb +2 -1
  42. data/vendored/puppet/lib/puppet/forge.rb +7 -8
  43. data/vendored/puppet/lib/puppet/forge/errors.rb +3 -3
  44. data/vendored/puppet/lib/puppet/functions/abs.rb +61 -0
  45. data/vendored/puppet/lib/puppet/functions/all.rb +2 -2
  46. data/vendored/puppet/lib/puppet/functions/any.rb +2 -2
  47. data/vendored/puppet/lib/puppet/functions/assert_type.rb +3 -3
  48. data/vendored/puppet/lib/puppet/functions/break.rb +3 -7
  49. data/vendored/puppet/lib/puppet/functions/camelcase.rb +62 -0
  50. data/vendored/puppet/lib/puppet/functions/capitalize.rb +61 -0
  51. data/vendored/puppet/lib/puppet/functions/ceiling.rb +37 -0
  52. data/vendored/puppet/lib/puppet/functions/chomp.rb +57 -0
  53. data/vendored/puppet/lib/puppet/functions/chop.rb +67 -0
  54. data/vendored/puppet/lib/puppet/functions/compare.rb +125 -0
  55. data/vendored/puppet/lib/puppet/functions/convert_to.rb +3 -2
  56. data/vendored/puppet/lib/puppet/functions/dig.rb +21 -1
  57. data/vendored/puppet/lib/puppet/functions/downcase.rb +89 -0
  58. data/vendored/puppet/lib/puppet/functions/each.rb +2 -2
  59. data/vendored/puppet/lib/puppet/functions/empty.rb +1 -3
  60. data/vendored/puppet/lib/puppet/functions/eyaml_lookup_key.rb +4 -2
  61. data/vendored/puppet/lib/puppet/functions/filter.rb +2 -2
  62. data/vendored/puppet/lib/puppet/functions/floor.rb +37 -0
  63. data/vendored/puppet/lib/puppet/functions/get.rb +150 -0
  64. data/vendored/puppet/lib/puppet/functions/getvar.rb +87 -0
  65. data/vendored/puppet/lib/puppet/functions/hiera.rb +5 -5
  66. data/vendored/puppet/lib/puppet/functions/hiera_array.rb +5 -5
  67. data/vendored/puppet/lib/puppet/functions/hiera_hash.rb +6 -6
  68. data/vendored/puppet/lib/puppet/functions/hiera_include.rb +7 -7
  69. data/vendored/puppet/lib/puppet/functions/hocon_data.rb +1 -1
  70. data/vendored/puppet/lib/puppet/functions/json_data.rb +3 -3
  71. data/vendored/puppet/lib/puppet/functions/lest.rb +1 -1
  72. data/vendored/puppet/lib/puppet/functions/lookup.rb +3 -2
  73. data/vendored/puppet/lib/puppet/functions/lstrip.rb +58 -0
  74. data/vendored/puppet/lib/puppet/functions/map.rb +1 -1
  75. data/vendored/puppet/lib/puppet/functions/match.rb +11 -0
  76. data/vendored/puppet/lib/puppet/functions/max.rb +183 -0
  77. data/vendored/puppet/lib/puppet/functions/min.rb +182 -0
  78. data/vendored/puppet/lib/puppet/functions/next.rb +1 -8
  79. data/vendored/puppet/lib/puppet/functions/reduce.rb +1 -1
  80. data/vendored/puppet/lib/puppet/functions/return.rb +1 -8
  81. data/vendored/puppet/lib/puppet/functions/reverse_each.rb +1 -1
  82. data/vendored/puppet/lib/puppet/functions/round.rb +24 -0
  83. data/vendored/puppet/lib/puppet/functions/rstrip.rb +58 -0
  84. data/vendored/puppet/lib/puppet/functions/size.rb +15 -0
  85. data/vendored/puppet/lib/puppet/functions/sort.rb +74 -0
  86. data/vendored/puppet/lib/puppet/functions/step.rb +1 -1
  87. data/vendored/puppet/lib/puppet/functions/strftime.rb +1 -7
  88. data/vendored/puppet/lib/puppet/functions/strip.rb +58 -0
  89. data/vendored/puppet/lib/puppet/functions/then.rb +1 -1
  90. data/vendored/puppet/lib/puppet/functions/tree_each.rb +7 -7
  91. data/vendored/puppet/lib/puppet/functions/upcase.rb +89 -0
  92. data/vendored/puppet/lib/puppet/functions/with.rb +4 -4
  93. data/vendored/puppet/lib/puppet/functions/yaml_data.rb +4 -2
  94. data/vendored/puppet/lib/puppet/graph/simple_graph.rb +9 -5
  95. data/vendored/puppet/lib/puppet/indirector/certificate_revocation_list/rest.rb +0 -11
  96. data/vendored/puppet/lib/puppet/indirector/indirection.rb +8 -12
  97. data/vendored/puppet/lib/puppet/indirector/node/exec.rb +1 -1
  98. data/vendored/puppet/lib/puppet/indirector/node/ldap.rb +1 -1
  99. data/vendored/puppet/lib/puppet/indirector/request.rb +11 -11
  100. data/vendored/puppet/lib/puppet/indirector/rest.rb +11 -11
  101. data/vendored/puppet/lib/puppet/interface/action.rb +2 -5
  102. data/vendored/puppet/lib/puppet/metatype/manager.rb +0 -2
  103. data/vendored/puppet/lib/puppet/module.rb +7 -33
  104. data/vendored/puppet/lib/puppet/module/task.rb +0 -1
  105. data/vendored/puppet/lib/puppet/module_tool.rb +2 -5
  106. data/vendored/puppet/lib/puppet/module_tool/applications/application.rb +5 -5
  107. data/vendored/puppet/lib/puppet/module_tool/applications/builder.rb +2 -2
  108. data/vendored/puppet/lib/puppet/module_tool/applications/checksummer.rb +3 -3
  109. data/vendored/puppet/lib/puppet/module_tool/applications/installer.rb +6 -7
  110. data/vendored/puppet/lib/puppet/module_tool/applications/uninstaller.rb +1 -2
  111. data/vendored/puppet/lib/puppet/module_tool/applications/unpacker.rb +2 -2
  112. data/vendored/puppet/lib/puppet/module_tool/applications/upgrader.rb +5 -6
  113. data/vendored/puppet/lib/puppet/module_tool/dependency.rb +1 -1
  114. data/vendored/puppet/lib/puppet/module_tool/installed_modules.rb +2 -2
  115. data/vendored/puppet/lib/puppet/module_tool/local_tarball.rb +3 -3
  116. data/vendored/puppet/lib/puppet/module_tool/metadata.rb +3 -4
  117. data/vendored/puppet/lib/puppet/module_tool/shared_behaviors.rb +2 -2
  118. data/vendored/puppet/lib/puppet/network/authconfig.rb +0 -13
  119. data/vendored/puppet/lib/puppet/network/format_support.rb +1 -1
  120. data/vendored/puppet/lib/puppet/network/formats.rb +5 -7
  121. data/vendored/puppet/lib/puppet/network/http.rb +0 -2
  122. data/vendored/puppet/lib/puppet/network/http/api.rb +1 -10
  123. data/vendored/puppet/lib/puppet/network/http/api/master/v3/environment.rb +2 -2
  124. data/vendored/puppet/lib/puppet/network/http/api/master/v3/environments.rb +2 -2
  125. data/vendored/puppet/lib/puppet/network/http/compression.rb +1 -1
  126. data/vendored/puppet/lib/puppet/network/http/connection.rb +11 -3
  127. data/vendored/puppet/lib/puppet/network/http/error.rb +3 -3
  128. data/vendored/puppet/lib/puppet/network/http/factory.rb +3 -0
  129. data/vendored/puppet/lib/puppet/network/http/handler.rb +59 -27
  130. data/vendored/puppet/lib/puppet/network/resolver.rb +140 -67
  131. data/vendored/puppet/lib/puppet/node/environment.rb +2 -19
  132. data/vendored/puppet/lib/puppet/parameter.rb +12 -7
  133. data/vendored/puppet/lib/puppet/parser/ast.rb +4 -8
  134. data/vendored/puppet/lib/puppet/parser/ast/branch.rb +3 -3
  135. data/vendored/puppet/lib/puppet/parser/ast/leaf.rb +5 -0
  136. data/vendored/puppet/lib/puppet/parser/ast/pops_bridge.rb +18 -0
  137. data/vendored/puppet/lib/puppet/parser/compiler.rb +3 -4
  138. data/vendored/puppet/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +9 -2
  139. data/vendored/puppet/lib/puppet/parser/functions.rb +1 -1
  140. data/vendored/puppet/lib/puppet/parser/functions/assert_type.rb +3 -3
  141. data/vendored/puppet/lib/puppet/parser/functions/create_resources.rb +1 -7
  142. data/vendored/puppet/lib/puppet/parser/functions/each.rb +2 -2
  143. data/vendored/puppet/lib/puppet/parser/functions/filter.rb +1 -1
  144. data/vendored/puppet/lib/puppet/parser/functions/hiera.rb +4 -4
  145. data/vendored/puppet/lib/puppet/parser/functions/hiera_array.rb +5 -5
  146. data/vendored/puppet/lib/puppet/parser/functions/hiera_hash.rb +6 -6
  147. data/vendored/puppet/lib/puppet/parser/functions/hiera_include.rb +10 -11
  148. data/vendored/puppet/lib/puppet/parser/functions/inline_template.rb +1 -1
  149. data/vendored/puppet/lib/puppet/parser/functions/lest.rb +1 -1
  150. data/vendored/puppet/lib/puppet/parser/functions/lookup.rb +1 -1
  151. data/vendored/puppet/lib/puppet/parser/functions/map.rb +1 -1
  152. data/vendored/puppet/lib/puppet/parser/functions/reduce.rb +1 -1
  153. data/vendored/puppet/lib/puppet/parser/functions/return.rb +22 -1
  154. data/vendored/puppet/lib/puppet/parser/functions/reverse_each.rb +1 -1
  155. data/vendored/puppet/lib/puppet/parser/functions/step.rb +1 -1
  156. data/vendored/puppet/lib/puppet/parser/functions/then.rb +1 -1
  157. data/vendored/puppet/lib/puppet/parser/functions/with.rb +4 -4
  158. data/vendored/puppet/lib/puppet/parser/resource.rb +0 -1
  159. data/vendored/puppet/lib/puppet/parser/resource/param.rb +12 -5
  160. data/vendored/puppet/lib/puppet/parser/scope.rb +5 -7
  161. data/vendored/puppet/lib/puppet/pops/evaluator/compare_operator.rb +3 -1
  162. data/vendored/puppet/lib/puppet/pops/evaluator/runtime3_support.rb +2 -7
  163. data/vendored/puppet/lib/puppet/pops/issues.rb +4 -0
  164. data/vendored/puppet/lib/puppet/pops/loader/loader_paths.rb +2 -2
  165. data/vendored/puppet/lib/puppet/pops/loader/module_loaders.rb +17 -12
  166. data/vendored/puppet/lib/puppet/pops/loader/task_instantiator.rb +73 -45
  167. data/vendored/puppet/lib/puppet/pops/lookup/lookup_adapter.rb +55 -6
  168. data/vendored/puppet/lib/puppet/pops/model/model_label_provider.rb +2 -0
  169. data/vendored/puppet/lib/puppet/pops/parser/epp_parser.rb +1 -1
  170. data/vendored/puppet/lib/puppet/pops/parser/epp_support.rb +6 -2
  171. data/vendored/puppet/lib/puppet/pops/parser/lexer2.rb +1 -1
  172. data/vendored/puppet/lib/puppet/pops/pcore.rb +7 -7
  173. data/vendored/puppet/lib/puppet/pops/puppet_stack.rb +15 -1
  174. data/vendored/puppet/lib/puppet/pops/serialization.rb +2 -2
  175. data/vendored/puppet/lib/puppet/pops/serialization/from_data_converter.rb +2 -2
  176. data/vendored/puppet/lib/puppet/pops/serialization/json.rb +7 -7
  177. data/vendored/puppet/lib/puppet/pops/serialization/to_data_converter.rb +5 -5
  178. data/vendored/puppet/lib/puppet/pops/types/types.rb +8 -4
  179. data/vendored/puppet/lib/puppet/pops/validation/checker4_0.rb +73 -0
  180. data/vendored/puppet/lib/puppet/pops/validation/validator_factory_4_0.rb +4 -3
  181. data/vendored/puppet/lib/puppet/provider/augeas/augeas.rb +7 -0
  182. data/vendored/puppet/lib/puppet/provider/service/systemd.rb +1 -1
  183. data/vendored/puppet/lib/puppet/provider/user/aix.rb +2 -2
  184. data/vendored/puppet/lib/puppet/provider/yumrepo/inifile.rb +21 -9
  185. data/vendored/puppet/lib/puppet/reference/providers.rb +1 -1
  186. data/vendored/puppet/lib/puppet/reference/report.rb +1 -1
  187. data/vendored/puppet/lib/puppet/resource.rb +1 -1
  188. data/vendored/puppet/lib/puppet/resource/capability_finder.rb +4 -4
  189. data/vendored/puppet/lib/puppet/resource/catalog.rb +6 -3
  190. data/vendored/puppet/lib/puppet/resource/type.rb +6 -2
  191. data/vendored/puppet/lib/puppet/rest/client.rb +79 -0
  192. data/vendored/puppet/lib/puppet/rest/errors.rb +14 -0
  193. data/vendored/puppet/lib/puppet/rest/response.rb +29 -0
  194. data/vendored/puppet/lib/puppet/rest/route.rb +102 -0
  195. data/vendored/puppet/lib/puppet/rest/routes.rb +31 -0
  196. data/vendored/puppet/lib/puppet/settings.rb +9 -5
  197. data/vendored/puppet/lib/puppet/settings/config_file.rb +1 -1
  198. data/vendored/puppet/lib/puppet/settings/environment_conf.rb +10 -1
  199. data/vendored/puppet/lib/puppet/ssl.rb +0 -1
  200. data/vendored/puppet/lib/puppet/ssl/certificate.rb +6 -2
  201. data/vendored/puppet/lib/puppet/ssl/certificate_authority.rb +3 -3
  202. data/vendored/puppet/lib/puppet/ssl/host.rb +258 -19
  203. data/vendored/puppet/lib/puppet/ssl/validator/default_validator.rb +33 -19
  204. data/vendored/puppet/lib/puppet/syntax_checkers/json.rb +1 -1
  205. data/vendored/puppet/lib/puppet/transaction/event.rb +34 -7
  206. data/vendored/puppet/lib/puppet/transaction/report.rb +17 -14
  207. data/vendored/puppet/lib/puppet/type.rb +20 -12
  208. data/vendored/puppet/lib/puppet/type/file.rb +1 -1
  209. data/vendored/puppet/lib/puppet/type/file/content.rb +15 -2
  210. data/vendored/puppet/lib/puppet/type/file/ensure.rb +1 -1
  211. data/vendored/puppet/lib/puppet/type/schedule.rb +1 -1
  212. data/vendored/puppet/lib/puppet/type/stage.rb +1 -1
  213. data/vendored/puppet/lib/puppet/type/tidy.rb +5 -1
  214. data/vendored/puppet/lib/puppet/type/user.rb +35 -18
  215. data/vendored/puppet/lib/puppet/type/yumrepo.rb +8 -17
  216. data/vendored/puppet/lib/puppet/util.rb +0 -1
  217. data/vendored/puppet/lib/puppet/util/autoload.rb +1 -6
  218. data/vendored/puppet/lib/puppet/util/checksums.rb +0 -2
  219. data/vendored/puppet/lib/puppet/util/classgen.rb +0 -6
  220. data/vendored/puppet/lib/puppet/util/fileparsing.rb +27 -5
  221. data/vendored/puppet/lib/puppet/util/instance_loader.rb +3 -3
  222. data/vendored/puppet/lib/puppet/util/json.rb +77 -0
  223. data/vendored/puppet/lib/puppet/util/json_lockfile.rb +3 -3
  224. data/vendored/puppet/lib/puppet/util/ldap/connection.rb +7 -7
  225. data/vendored/puppet/lib/puppet/util/log/destinations.rb +2 -2
  226. data/vendored/puppet/lib/puppet/util/logging.rb +1 -1
  227. data/vendored/puppet/lib/puppet/util/plist.rb +1 -1
  228. data/vendored/puppet/lib/puppet/util/provider_features.rb +2 -5
  229. data/vendored/puppet/lib/puppet/util/reference.rb +5 -4
  230. data/vendored/puppet/lib/puppet/util/tagging.rb +16 -3
  231. data/vendored/puppet/lib/puppet/version.rb +1 -1
  232. metadata +44 -26
  233. data/vendored/puppet/lib/puppet/application/master.rb +0 -317
  234. data/vendored/puppet/lib/puppet/feature/rack.rb +0 -19
  235. data/vendored/puppet/lib/puppet/network/http/api/ca.rb +0 -2
  236. data/vendored/puppet/lib/puppet/network/http/api/ca/v1.rb +0 -11
  237. data/vendored/puppet/lib/puppet/network/http/rack.rb +0 -33
  238. data/vendored/puppet/lib/puppet/network/http/rack/rest.rb +0 -162
  239. data/vendored/puppet/lib/puppet/network/http/webrick.rb +0 -124
  240. data/vendored/puppet/lib/puppet/network/http/webrick/rest.rb +0 -114
  241. data/vendored/puppet/lib/puppet/network/server.rb +0 -39
  242. data/vendored/puppet/lib/puppet/ssl/configuration.rb +0 -61
  243. data/vendored/puppet/lib/puppet/util/methodhelper.rb +0 -32
  244. data/vendored/puppet/lib/puppet/vendor/load_semantic.rb +0 -1
  245. data/vendored/puppet/lib/puppet/vendor/load_semantic_puppet.rb +0 -1
  246. data/vendored/puppet/lib/puppet/vendor/semantic/lib/semantic.rb +0 -5
  247. data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +0 -11
  248. data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency.rb +0 -181
  249. data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/graph.rb +0 -60
  250. data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/graph_node.rb +0 -117
  251. data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/module_release.rb +0 -58
  252. data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/source.rb +0 -25
  253. data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/unsatisfiable_graph.rb +0 -31
  254. data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +0 -3
  255. data/vendored/puppet/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/version.rb +0 -203
  256. 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
@@ -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,3 +0,0 @@
1
- module SemanticPuppet
2
- VERSION = '1.0.1'
3
- 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