berktacular 0.1.7 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -13
- data/VERSION +1 -0
- data/bin/berktacular +27 -3
- data/lib/berktacular/berksfile.rb +42 -14
- data/lib/berktacular/cookbook.rb +8 -6
- data/lib/berktacular/version.rb +1 -1
- metadata +59 -42
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZDZhYWRhMDM3MmIxMzM3M2ZmYzE0NTVmNzgyMWQ4MjgyN2VlNTMzNQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f6406cbc6a3da17b4bf06d75953d84b6ab648b08
|
4
|
+
data.tar.gz: f05fdf6ac3fc1087f94b0147280c254d083f4f0f
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
NWI1OWRjZTk4YjZkZDJkNGI1OGRiOTUwMzZmZDhiNGI2YTYzMGY4YWFiNGM5
|
11
|
-
ZTFhYTMwMGNlNjhhMThjMjI0NDNiMjIxZWEzMjdkM2Q2OGE1YTI=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
YmRkMzhhMDY0ZWQ3NTQ5Yzc1NDY2MjI1MmQxZmY1YjBmZmY0MDhjMGI0ZDU5
|
14
|
-
MzJiYzBiMGQ4ZjYyYTNjNGI0YWIyM2ZjOThiOGFhODE3ZjZjYjUzM2JmMWQw
|
15
|
-
YTUzNDg0ZDYwMjAwZmFjOWEwNDlmZDM4MzBjNGIwMjM4MWZmNzU=
|
6
|
+
metadata.gz: e4c097ae8d61574ea027f200ab651294b3f3045dce6e81434e6f7b8c55f16b5476ae6d0f15770c1b15afe06eca9592c2e2c16be0bc71f994dd4da71fe21a7600
|
7
|
+
data.tar.gz: 5b3c6047f2c51cd241423ea341586273b14e3b5f2940b14a678bc11bdd0c2a9e9f314533b48cb612cb5aee1ace1a27706752ecd1417c9e410f4a8505f098c67a
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.0
|
data/bin/berktacular
CHANGED
@@ -19,6 +19,8 @@ berks_conf = nil
|
|
19
19
|
knife_conf = nil
|
20
20
|
workdir = nil
|
21
21
|
verbose = false
|
22
|
+
source_list = []
|
23
|
+
versions_only = false
|
22
24
|
|
23
25
|
options = OptionParser.new do |opts|
|
24
26
|
opts.banner = "Read environment json file and spit out a berksfile"
|
@@ -66,9 +68,21 @@ options = OptionParser.new do |opts|
|
|
66
68
|
workdir = w
|
67
69
|
preserve = true
|
68
70
|
end
|
71
|
+
opts.on("-s", "--source SOURCE", String,
|
72
|
+
"Add this source to the generated Berksfile in addition to the default source",
|
73
|
+
"(https://api.berkshelf.com). This may be e.g. an internal Berkshelf API server URL.",
|
74
|
+
"This option can be used multiple times. Custom sources are always included before the ",
|
75
|
+
"default source, unless the default source is explicitly specified using this option.") do |s|
|
76
|
+
source_list << s
|
77
|
+
end
|
69
78
|
opts.on("-v", "--verbose", "Turn on verbose output" ) do
|
70
79
|
verbose = true
|
71
80
|
end
|
81
|
+
opts.on("--versions-only",
|
82
|
+
"Include only cookbook versions in the Berksfile (no protocol or git URL).",
|
83
|
+
"This can be used with --source to download cookbooks using an API server.") do
|
84
|
+
versions_only = true
|
85
|
+
end
|
72
86
|
opts.on("--version", "Print the version and exit" ) do
|
73
87
|
puts Berktacular::VERSION
|
74
88
|
exit 0
|
@@ -97,6 +111,10 @@ unless env_file && File.exist?(env_file)
|
|
97
111
|
end
|
98
112
|
|
99
113
|
my_env = JSON.parse( File.read( env_file ) )
|
114
|
+
if versions_only
|
115
|
+
# Ignore cookbook locations. Only include versions in the generated Berksfile.
|
116
|
+
my_env.delete('cookbook_locations')
|
117
|
+
end
|
100
118
|
|
101
119
|
unless github_token
|
102
120
|
if File.exists? gtoken_path
|
@@ -129,9 +147,15 @@ puts "Using workdir: '#{workdir}'" if verbose
|
|
129
147
|
|
130
148
|
# Create a new berksfile
|
131
149
|
puts "Checking updates, this can take some time..." if check || upgrade
|
132
|
-
b = Berktacular::Berksfile.new(
|
133
|
-
|
134
|
-
|
150
|
+
b = Berktacular::Berksfile.new(
|
151
|
+
my_env,
|
152
|
+
upgrade: upgrade,
|
153
|
+
github_token: github_token,
|
154
|
+
verbose: verbose,
|
155
|
+
source_list: source_list
|
156
|
+
)
|
157
|
+
b.check_updates if check
|
158
|
+
puts "#{b}" if printit
|
135
159
|
if berksfile
|
136
160
|
FileUtils.mkdir_p( File.dirname(berksfile) )
|
137
161
|
File.write(berksfile, b)
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'json'
|
3
|
+
|
1
4
|
module Berktacular
|
2
5
|
|
3
6
|
# This class represents a Berksfile
|
@@ -20,6 +23,8 @@ module Berktacular
|
|
20
23
|
# @option opts [String] :github_token (nil) the github token to use.
|
21
24
|
# @option opts [True,False] :upgrade (False) whether or not to check for upgraded cookbooks.
|
22
25
|
# @option opts [True,False] :verbose (False) be more verbose.
|
26
|
+
# @option opts [Array<String>] :source_list additional Berkshelf API sources to include in the
|
27
|
+
# generated Berksfile.
|
23
28
|
def initialize( environment, opts = {})
|
24
29
|
@env_hash = environment # Save the whole thing so we can emit an updated version if needed.
|
25
30
|
@name = environment['name'] || nil
|
@@ -29,11 +34,13 @@ module Berktacular
|
|
29
34
|
@opts = {
|
30
35
|
:upgrade => opts.has_key?(:upgrade) ? opts[:upgrade] : false,
|
31
36
|
:github_token => opts.has_key?(:github_token) ? opts[:github_token] : nil,
|
32
|
-
:verbose => opts.has_key?(:verbose) ? opts[:verbose] : false
|
37
|
+
:verbose => opts.has_key?(:verbose) ? opts[:verbose] : false,
|
38
|
+
:source_list => opts.has_key?(:source_list) ? opts[:source_list] : []
|
33
39
|
}
|
34
40
|
@installed = {}
|
35
41
|
# only connect once, pass the client to each cookbook. and only if needed
|
36
42
|
connect_to_git if @opts[:upgrade]
|
43
|
+
@opts[:source_list] = (@opts[:source_list] + ["https://api.berkshelf.com"]).uniq
|
37
44
|
end
|
38
45
|
|
39
46
|
# @return [Hash] representation of the env_file.
|
@@ -71,7 +78,7 @@ module Berktacular
|
|
71
78
|
cookbooks = File.join(workdir, "cookbooks")
|
72
79
|
FileUtils.rm(lck) if File.exists? lck
|
73
80
|
File.write(berksfile, self)
|
74
|
-
Berktacular.run_command("berks
|
81
|
+
Berktacular.run_command("berks vendor --berksfile #{berksfile} #{cookbooks}")
|
75
82
|
@installed[workdir] = {berksfile: berksfile, lck: lck, cookbooks: cookbooks}
|
76
83
|
end
|
77
84
|
workdir
|
@@ -87,10 +94,14 @@ module Berktacular
|
|
87
94
|
dependencies = {}
|
88
95
|
Dir["#{@installed[workdir][:cookbooks]}/*"].each do |cookbook_dir|
|
89
96
|
next unless File.directory?(cookbook_dir)
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
97
|
+
metadata_candidates = ['rb', 'json'].map {|ext| File.join(cookbook_dir, "metadata.#{ext}") }
|
98
|
+
metadata_path = metadata_candidates.find {|f| File.exists?(f) }
|
99
|
+
raise "Metadata file not found: #{metadata_candidates}" if metadata_path.nil?
|
100
|
+
metadata =
|
101
|
+
metadata_path =~ /\.json$/ ? metadata_from_json(IO.read(metadata_path)) :
|
102
|
+
Ridley::Chef::Cookbook::Metadata.from_file(metadata_path)
|
103
|
+
cookbook_name = metadata.name
|
104
|
+
name_from_path = File.basename(cookbook_dir)
|
94
105
|
unless cookbook_name == name_from_path
|
95
106
|
if cookbook_name.empty?
|
96
107
|
puts "Cookbook #{name_from_path} has no name specified in metadata.rb"
|
@@ -112,14 +123,24 @@ module Berktacular
|
|
112
123
|
@missing_deps[name] = "#{name}-#{versions[name]} depends on #{dep_name} which was not installed!"
|
113
124
|
warn @missing_deps[name]
|
114
125
|
errors = true
|
115
|
-
elsif
|
116
|
-
|
117
|
-
|
118
|
-
|
126
|
+
elsif constraint != [] # some cookbooks have '[]' as a dependency in their json metadata
|
127
|
+
constraint_obj = begin
|
128
|
+
Semverse::Constraint.new(constraint)
|
129
|
+
rescue Semverse::InvalidConstraintFormat => ex
|
130
|
+
warn "Could not parse version constraint '#{constraint}' " +
|
131
|
+
"for dependency '#{dep_name}' of cookbook '#{name}'"
|
132
|
+
raise ex
|
133
|
+
end
|
134
|
+
|
135
|
+
unless constraint_obj.satisfies?(actual_version)
|
136
|
+
@missing_deps[name] = "#{name}-#{versions[name]} depends on #{dep_name} #{constraint} but #{dep_name} is #{actual_version}!"
|
137
|
+
warn @missing_deps[name]
|
138
|
+
errors = true
|
139
|
+
end
|
119
140
|
end
|
120
141
|
end
|
121
142
|
end
|
122
|
-
!errors
|
143
|
+
!errors
|
123
144
|
end
|
124
145
|
|
125
146
|
# @param berks_conf [String] path to the berkshelf config file to use.
|
@@ -151,7 +172,7 @@ module Berktacular
|
|
151
172
|
|
152
173
|
# @param [IO] where to write the data.
|
153
174
|
def print_berksfile( io = STDOUT )
|
154
|
-
io.puts to_s
|
175
|
+
io.puts to_s
|
155
176
|
end
|
156
177
|
|
157
178
|
# @return [String] the berksfile as a String object
|
@@ -162,7 +183,10 @@ module Berktacular
|
|
162
183
|
str << "# This file is auto-generated, changes will be overwritten\n"
|
163
184
|
str << "# Modify the .json environment file and regenerate this Berksfile to make changes.\n\n"
|
164
185
|
|
165
|
-
|
186
|
+
@opts[:source_list].each do |source_url|
|
187
|
+
str << "source '#{source_url}'\n"
|
188
|
+
end
|
189
|
+
str << "\n"
|
166
190
|
cookbooks.each { |l| str << l.to_s << "\n" }
|
167
191
|
str
|
168
192
|
end
|
@@ -170,7 +194,7 @@ module Berktacular
|
|
170
194
|
# @return [Array] a list of Cookbook objects for this environment.
|
171
195
|
def cookbooks
|
172
196
|
@cookbooks ||= @cookbook_versions.sort.map do |book, version|
|
173
|
-
Cookbook.new(book, version, @cookbook_locations[book], @opts )
|
197
|
+
Cookbook.new(book, version, @cookbook_locations[book], @opts )
|
174
198
|
end
|
175
199
|
end
|
176
200
|
|
@@ -197,5 +221,9 @@ module Berktacular
|
|
197
221
|
@opts[:git_client] ||= Octokit::Client.new(access_token: @opts[:github_token])
|
198
222
|
end
|
199
223
|
|
224
|
+
def metadata_from_json(json_str)
|
225
|
+
OpenStruct.new(JSON.parse(json_str))
|
226
|
+
end
|
227
|
+
|
200
228
|
end
|
201
229
|
end
|
data/lib/berktacular/cookbook.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'semverse'
|
2
|
+
|
1
3
|
module Berktacular
|
2
4
|
|
3
5
|
# This class represents a cookbook entry form a Berksfile
|
@@ -26,7 +28,7 @@ module Berktacular
|
|
26
28
|
@name = name || raise( "Missing cookbook name" )
|
27
29
|
@version_spec = version_spec || raise( "Missing cookbook version" )
|
28
30
|
@version_number = VERSION_RE.match( version_spec )[0]
|
29
|
-
@version_solved =
|
31
|
+
@version_solved = Semverse::Version.new(@version_number)
|
30
32
|
@auto_upgrade = config && config['auto_upgrade'] || false
|
31
33
|
@versions = config && config['versions'] || {}
|
32
34
|
@config = config ? config.reject{ |k,v| k == 'auto_upgrade' || k == 'versions' } : nil
|
@@ -69,8 +71,8 @@ module Berktacular
|
|
69
71
|
next unless m
|
70
72
|
v = m[0]
|
71
73
|
begin
|
72
|
-
t =
|
73
|
-
rescue
|
74
|
+
t = Semverse::Version.new(v)
|
75
|
+
rescue Semverse::InvalidVersionFormat
|
74
76
|
next
|
75
77
|
end
|
76
78
|
next unless t > @version_solved
|
@@ -79,7 +81,7 @@ module Berktacular
|
|
79
81
|
end
|
80
82
|
|
81
83
|
private
|
82
|
-
|
84
|
+
|
83
85
|
# @param upgrade [True,False] use updated cookbook version if @auto_update is also true.
|
84
86
|
# @param config [Hash] the cookbook_locations hash associated with this cookbook.
|
85
87
|
# @return [String] the config line for this cookbook, everything after the cookbook name.
|
@@ -88,7 +90,7 @@ module Berktacular
|
|
88
90
|
line = []
|
89
91
|
if config
|
90
92
|
if config.has_key?('github')
|
91
|
-
line << "
|
93
|
+
line << "git: \"git@github.com:#{config['github']}.git\""
|
92
94
|
line << "rel: \"#{config['rel']}\"" if config.has_key?('rel')
|
93
95
|
line << 'protocol: :ssh'
|
94
96
|
end
|
@@ -106,7 +108,7 @@ module Berktacular
|
|
106
108
|
end
|
107
109
|
line.join(", ").gsub('%{version}', ver)
|
108
110
|
end
|
109
|
-
|
111
|
+
|
110
112
|
# return [Array] a list of tags from the github repository of this cookbook.
|
111
113
|
def get_tags_from_github
|
112
114
|
@git_client.repo(@config['github']).rels[:tags].get.data.map { |obj| obj.name }
|
data/lib/berktacular/version.rb
CHANGED
metadata
CHANGED
@@ -1,117 +1,133 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: berktacular
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Harvey-Smith
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: solve
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
- - ! '>='
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: 0.8.2
|
19
|
+
version: '1.2'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0.8'
|
30
|
-
- - ! '>='
|
24
|
+
- - "~>"
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
26
|
+
version: '1.2'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: ridley
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
36
30
|
requirements:
|
37
|
-
- - ~>
|
31
|
+
- - "~>"
|
38
32
|
- !ruby/object:Gem::Version
|
39
|
-
version: '
|
40
|
-
- - ! '>='
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version: 1.5.3
|
33
|
+
version: '4.0'
|
43
34
|
type: :runtime
|
44
35
|
prerelease: false
|
45
36
|
version_requirements: !ruby/object:Gem::Requirement
|
46
37
|
requirements:
|
47
|
-
- - ~>
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: '1.5'
|
50
|
-
- - ! '>='
|
38
|
+
- - "~>"
|
51
39
|
- !ruby/object:Gem::Version
|
52
|
-
version:
|
40
|
+
version: '4.0'
|
53
41
|
- !ruby/object:Gem::Dependency
|
54
42
|
name: faraday
|
55
43
|
requirement: !ruby/object:Gem::Requirement
|
56
44
|
requirements:
|
57
|
-
- - ~>
|
45
|
+
- - "~>"
|
58
46
|
- !ruby/object:Gem::Version
|
59
|
-
version: 0.
|
47
|
+
version: '0.9'
|
60
48
|
type: :runtime
|
61
49
|
prerelease: false
|
62
50
|
version_requirements: !ruby/object:Gem::Requirement
|
63
51
|
requirements:
|
64
|
-
- - ~>
|
52
|
+
- - "~>"
|
65
53
|
- !ruby/object:Gem::Version
|
66
|
-
version: 0.
|
54
|
+
version: '0.9'
|
67
55
|
- !ruby/object:Gem::Dependency
|
68
56
|
name: octokit
|
69
57
|
requirement: !ruby/object:Gem::Requirement
|
70
58
|
requirements:
|
71
|
-
- - ~>
|
59
|
+
- - "~>"
|
72
60
|
- !ruby/object:Gem::Version
|
73
61
|
version: '3.0'
|
74
|
-
- -
|
62
|
+
- - ">="
|
75
63
|
- !ruby/object:Gem::Version
|
76
64
|
version: 3.0.0
|
77
65
|
type: :runtime
|
78
66
|
prerelease: false
|
79
67
|
version_requirements: !ruby/object:Gem::Requirement
|
80
68
|
requirements:
|
81
|
-
- - ~>
|
69
|
+
- - "~>"
|
82
70
|
- !ruby/object:Gem::Version
|
83
71
|
version: '3.0'
|
84
|
-
- -
|
72
|
+
- - ">="
|
85
73
|
- !ruby/object:Gem::Version
|
86
74
|
version: 3.0.0
|
87
75
|
- !ruby/object:Gem::Dependency
|
88
76
|
name: hashie
|
89
77
|
requirement: !ruby/object:Gem::Requirement
|
90
78
|
requirements:
|
91
|
-
- -
|
79
|
+
- - "~>"
|
92
80
|
- !ruby/object:Gem::Version
|
93
|
-
version:
|
81
|
+
version: '2.1'
|
94
82
|
type: :runtime
|
95
83
|
prerelease: false
|
96
84
|
version_requirements: !ruby/object:Gem::Requirement
|
97
85
|
requirements:
|
98
|
-
- -
|
86
|
+
- - "~>"
|
99
87
|
- !ruby/object:Gem::Version
|
100
|
-
version:
|
88
|
+
version: '2.1'
|
101
89
|
- !ruby/object:Gem::Dependency
|
102
90
|
name: berkshelf
|
103
91
|
requirement: !ruby/object:Gem::Requirement
|
104
92
|
requirements:
|
105
|
-
- -
|
93
|
+
- - "~>"
|
106
94
|
- !ruby/object:Gem::Version
|
107
|
-
version: 3.
|
95
|
+
version: '3.1'
|
108
96
|
type: :runtime
|
109
97
|
prerelease: false
|
110
98
|
version_requirements: !ruby/object:Gem::Requirement
|
111
99
|
requirements:
|
112
|
-
- -
|
100
|
+
- - "~>"
|
113
101
|
- !ruby/object:Gem::Version
|
114
|
-
version: 3.
|
102
|
+
version: '3.1'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: yard
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0.8'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0.8'
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: minitest
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '5.3'
|
124
|
+
type: :development
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '5.3'
|
115
131
|
description: Generates a Berksfile from JSON style Chef environment files. Also support
|
116
132
|
extension to environment file with 'cookbook_locations'. Verifies the Berksfile
|
117
133
|
is consistent (all dependencies met) and will upload updated cookbooks and env files
|
@@ -126,8 +142,9 @@ files:
|
|
126
142
|
- bin/berktacular
|
127
143
|
- lib/berktacular.rb
|
128
144
|
- lib/berktacular/berksfile.rb
|
129
|
-
- lib/berktacular/cookbook.rb
|
130
145
|
- lib/berktacular/version.rb
|
146
|
+
- lib/berktacular/cookbook.rb
|
147
|
+
- VERSION
|
131
148
|
homepage: https://rubygems.org/gems/berktacular
|
132
149
|
licenses:
|
133
150
|
- Apache License, Version 2.0
|
@@ -138,17 +155,17 @@ require_paths:
|
|
138
155
|
- lib
|
139
156
|
required_ruby_version: !ruby/object:Gem::Requirement
|
140
157
|
requirements:
|
141
|
-
- -
|
158
|
+
- - ">="
|
142
159
|
- !ruby/object:Gem::Version
|
143
160
|
version: '1.9'
|
144
161
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
145
162
|
requirements:
|
146
|
-
- -
|
163
|
+
- - ">="
|
147
164
|
- !ruby/object:Gem::Version
|
148
165
|
version: '0'
|
149
166
|
requirements: []
|
150
167
|
rubyforge_project:
|
151
|
-
rubygems_version: 2.
|
168
|
+
rubygems_version: 2.0.14
|
152
169
|
signing_key:
|
153
170
|
specification_version: 4
|
154
171
|
summary: Parse chef env files, generates a Berksfile and verifies it.
|