berktacular 0.1.7 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|