batali 0.1.16 → 0.1.18

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c69ca3a698a94a1797c499c491e9a50f69bc8d3b
4
- data.tar.gz: 781d13d797963bdb886c0a22f219bee3e161bd2b
3
+ metadata.gz: af52638ac3a1721abd7bb9615d6807ed37d9eea4
4
+ data.tar.gz: 2dbcf019a32eb2c3da9def2faafdeb5157488811
5
5
  SHA512:
6
- metadata.gz: 2c56fcd91bb80bcafdc94f5a5b13ff3db00f32066e754ec92a249f7d488b4da23a97bb0d2662fee2feab71408493d88289e7f06209545d68baac704c43f3ad69
7
- data.tar.gz: 1c171c5155f4ce221809273e899a6daa8a551aabc7fdfb25a14ae48617bc5e114fa5dabedc5e6f87431c00dab6a5e8093d2e27cac25fc0a9e57bd84076c928b1
6
+ metadata.gz: 0cc681411a0120068b946ee946763de6a0cbadad3bd8193242b86beab9c19f2c59e66ad006dfd87d3f1ef60d430c8e046d2e992c92f29608386d485b10a8a534
7
+ data.tar.gz: 553311a853ae125722fd8f78b97b745753a373e468992680c19bcf8f9a56027e8bf28ff7c1e615c15b6206aab7631c0694ba905049c61000557ca4514494e7cc
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # v0.1.18
2
+ * Update restriction key from :to -> :source (#7)
3
+ * Show unit removals on single path resolution output
4
+ * Complete unit scoring implementation (#11)
5
+
1
6
  # v0.1.16
2
7
  * Include cookbook removals on resolve output
3
8
  * Add initial infrastructure resolve output to show cookbooks + versions
data/README.md CHANGED
@@ -89,7 +89,63 @@ $ batali resolve example
89
89
  ```
90
90
 
91
91
  This will only update the version of the example cookbook, and any dependency cookbooks
92
- that _must_ be updated to provide resolution. Multiple cookbooks can be listed:
92
+ that _must_ be updated to provide resolution. Dependency cookbooks that require an upgrade
93
+ based on constraints will attempt to upgrade with the _least impact possible_ by attempting
94
+ to satisfy constraints within the minimum version segement possible. For example, if our
95
+ Batali file contains the following:
96
+
97
+ ```ruby
98
+ Batali.define do
99
+ source 'https://example.com'
100
+ cookbook 'soup'
101
+ end
102
+ ```
103
+
104
+ and after resolving we have two cookbooks in our manifest:
105
+
106
+ ```
107
+ soup <1.0.0>
108
+ salad <0.1.4>
109
+ ```
110
+
111
+ Some time passes and a new version of `soup` is released, version 1.0.2. In that time
112
+ multiple new versions of the `salad` cookbook have been released, with new features and
113
+ with some breaking changes. For this example, lets assume available versions of the `salad`
114
+ cookbook are:
115
+
116
+ ```
117
+ <0.1.4>
118
+ <0.1.6>
119
+ <0.1.8>
120
+ <0.2.0>
121
+ <0.2.2>
122
+ <0.3.0>
123
+ <1.0.0>
124
+ ```
125
+
126
+ and the `soup` cookbook has updated its `salad` dependency:
127
+
128
+ ```ruby
129
+ # soup metadata.rb
130
+ depends 'salad', '> 0.2'
131
+ ```
132
+
133
+ Due to the behavior of existing solvers, we may expect the resolved manifest to include
134
+ `salad` at the latest possible version: `1.0.0`. This is a valid solution, since the
135
+ dependency is simply stating the constraint requires `salad` be _greater_ than `0.2` and
136
+ nothing more. However, this is a very large jump from what we currently have defined
137
+ within our manifest, and jumps a major and minor version. The possibility of breaking
138
+ changes being introduced is extremely high.
139
+
140
+ Since Batali has the **least impact** feature enabled by default, it will only upgrade
141
+ `salad` to the `0.2.2` version. This is due to the fact that the **least impact** feature
142
+ prefers the _latest_ cookbook available within the _closest_ version segement of the cookbook
143
+ version currently defined within the manifest. Since thew new `soup` dependency contraint
144
+ requires versions `> 0.2`, no `> 0.1` versions are acceptable. Batali then looks to the
145
+ next available segment `0.2` and attempts to use the latest version: `0.2.2`. This solves the
146
+ constraint, and is used for the new solution.
147
+
148
+ Multiple cookbooks can be listed for upgrade:
93
149
 
94
150
  ```
95
151
  $ batali resolve example ipsum lorem
data/batali.gemspec CHANGED
@@ -10,12 +10,12 @@ Gem::Specification.new do |s|
10
10
  s.description = 'Magic'
11
11
  s.require_path = 'lib'
12
12
  s.license = 'Apache 2.0'
13
- s.add_runtime_dependency 'attribute_struct', '>= 0.2.14'
14
- s.add_runtime_dependency 'grimoire', '> 0.1.4'
15
- s.add_runtime_dependency 'bogo', '>= 0.1.12'
16
- s.add_runtime_dependency 'bogo-cli', '> 0.1.8'
17
- s.add_runtime_dependency 'bogo-config', '>= 0.1.10'
18
- s.add_runtime_dependency 'bogo-ui', '> 0.1.6'
13
+ s.add_runtime_dependency 'attribute_struct', '~> 0.2.14'
14
+ s.add_runtime_dependency 'grimoire', '~> 0.2.0'
15
+ s.add_runtime_dependency 'bogo', '~> 0.1.18'
16
+ s.add_runtime_dependency 'bogo-cli', '~> 0.1.8'
17
+ s.add_runtime_dependency 'bogo-config', '~> 0.1.10'
18
+ s.add_runtime_dependency 'bogo-ui', '~> 0.1.6'
19
19
  s.add_runtime_dependency 'git'
20
20
  s.add_runtime_dependency 'http'
21
21
  s.add_development_dependency 'minitest'
@@ -6,12 +6,67 @@ module Batali
6
6
 
7
7
  attribute :manifest, Manifest, :required => true
8
8
 
9
+ # Always prefer higher scoring units
10
+ #
11
+ # @return [Symbol] :highscore
12
+ def preferred_score
13
+ :highscore
14
+ end
15
+
9
16
  # Provide score for given unit
10
17
  #
11
- # @param unit [Unit]
18
+ # @param unit [Unit] unit to score
19
+ # @param idx [Integer] current index location
12
20
  # @return [Numeric, NilClass]
13
- def score_for(unit)
14
- manifest.include?(unit) ? 0 : nil
21
+ def score_for(unit, idx)
22
+ multiplier = 1
23
+ manifest_unit = manifest.cookbook.detect do |m_unit|
24
+ m_unit.name == unit.name
25
+ end
26
+ if(manifest_unit)
27
+ # If the unit version matches the manifest version, this
28
+ # should be _the_ preferred version
29
+ if(manifest_unit.version == unit.version)
30
+ multiplier = 10000000
31
+ else
32
+ # If the unit version satisfies within the patch segment of
33
+ # the manifest version score those versions highest for upgrade
34
+ if(UnitRequirement.new("~> #{manifest_unit.version}").satisfied_by?(unit.version))
35
+ multiplier = 1000000
36
+ else
37
+ # If the unit version satisfies within the minor or major
38
+ # version segments of the manifest version, bump score
39
+ # value up (with satisfaction within minor segment being
40
+ # worth more than satisfaction within major segment)
41
+ pos = UnitRequirement.new("~> #{manifest_unit.version.segments.slice(0,2).join('.')}").satisfied_by?(unit.version) ? 1 : 0
42
+ multi_val = pos == 1 ? 1000 : 100
43
+ distance = (manifest_unit.version.segments[pos] - unit.version.segments[pos])
44
+ if(distance > 0)
45
+ distance = 1.0 / distance
46
+ else
47
+ distance = 0
48
+ end
49
+ multiplier = multi_val + (multi_val * distance)
50
+ end
51
+ end
52
+ end
53
+ score = []
54
+ # Generate a "value" for each segment of the version with
55
+ # growing importance (major > minor > patch)
56
+ unit.version.segments.reverse.each_with_index.map do |val, pos|
57
+ if(val == 0)
58
+ score.push 0
59
+ else
60
+ score.push (2 - (1.0 / val)) * ((pos + 1)**10)
61
+ end
62
+ end
63
+ # Sum the score for each segment to provide the score for the
64
+ # version and multiply by defined multiplier to force higher
65
+ # score when manifest drives desire for versions closer to
66
+ # version defined within manifest
67
+ score = score.inject(&:+) * multiplier
68
+ debug "Score <#{unit.name}:#{unit.version}>: #{score}"
69
+ score
15
70
  end
16
71
 
17
72
  end
@@ -1,4 +1,4 @@
1
1
  module Batali
2
2
  # Current version
3
- VERSION = Gem::Version.new('0.1.16')
3
+ VERSION = Gem::Version.new('0.1.18')
4
4
  end
metadata CHANGED
@@ -1,97 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: batali
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.16
4
+ version: 0.1.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Roberts
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-20 00:00:00.000000000 Z
11
+ date: 2015-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: attribute_struct
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.2.14
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.2.14
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: grimoire
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">"
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.1.4
33
+ version: 0.2.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">"
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.1.4
40
+ version: 0.2.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bogo
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.1.12
47
+ version: 0.1.18
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.1.12
54
+ version: 0.1.18
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bogo-cli
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">"
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: 0.1.8
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">"
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.1.8
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bogo-config
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: 0.1.10
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.1.10
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: bogo-ui
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">"
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: 0.1.6
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">"
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: 0.1.6
97
97
  - !ruby/object:Gem::Dependency