falkorlib 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/falkorlib/common.rb +6 -3
- data/lib/falkorlib/config.rb +8 -2
- data/lib/falkorlib/puppet/modules.rb +172 -53
- data/lib/falkorlib/tasks/puppet_modules.rake +10 -2
- data/lib/falkorlib/version.rb +1 -1
- data/spec/falkorlib/puppet_modules_spec.rb +41 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 395609cb7eea10171f370b653926e3f45d1ec4fb
|
4
|
+
data.tar.gz: 4c1be259201f3f86178f6538930d2c62cbc727bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c373d7743ad2a45ec4a5f452d25ae24dc10476c12a879b3c8b8133287f1e4f22672c646aec4a40e77de138d588fcb102450b12d63c065ca434da55f14442e684
|
7
|
+
data.tar.gz: 43e3a90e07c2dac1298a096be8c1ea27fc450d2fcd0b130e64b642660ced449348c50b54a67d8ea8f52f820b813baf27a31f7f322daa4c713fe34ecf62c8e599
|
data/Gemfile.lock
CHANGED
data/lib/falkorlib/common.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
################################################################################
|
3
|
-
# Time-stamp: <
|
3
|
+
# Time-stamp: <Thu 2014-08-28 23:12 svarrette>
|
4
4
|
################################################################################
|
5
5
|
|
6
6
|
require "falkorlib"
|
@@ -171,11 +171,12 @@ module FalkorLib #:nodoc:
|
|
171
171
|
# :only_files [boolean]: list only files in the glob
|
172
172
|
# :only_dirs [boolean]: list only directories in the glob
|
173
173
|
# :pattern_include [array of strings]: pattern(s) to include for listing
|
174
|
-
# :pattern_exclude [array of strings]: pattern(s) to exclude for listing
|
174
|
+
# :pattern_exclude [array of strings]: pattern(s) to exclude for listing
|
175
|
+
# :text [string]: text to put
|
175
176
|
def list_items(glob_pattern, options = {})
|
176
177
|
list = { 0 => 'Exit' }
|
177
178
|
index = 1
|
178
|
-
raw_list = { }
|
179
|
+
raw_list = { 0 => 'Exit' }
|
179
180
|
|
180
181
|
Dir["#{glob_pattern}"].each do |elem|
|
181
182
|
#puts "=> element '#{elem}' - dir = #{File.directory?(elem)}; file = #{File.file?(elem)}"
|
@@ -206,6 +207,8 @@ module FalkorLib #:nodoc:
|
|
206
207
|
text = options[:text].nil? ? "select the index" : options[:text]
|
207
208
|
default_idx = options[:default].nil? ? 0 : options[:default]
|
208
209
|
raise SystemExit.new('Empty list') if index == 1
|
210
|
+
#ap list
|
211
|
+
#ap raw_list
|
209
212
|
# puts list.to_yaml
|
210
213
|
# answer = ask("=> #{text}", "#{default_idx}")
|
211
214
|
# raise SystemExit.new('exiting selection') if answer == '0'
|
data/lib/falkorlib/config.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
################################################################################
|
3
|
-
# Time-stamp: <
|
3
|
+
# Time-stamp: <Fri 2014-08-29 14:06 svarrette>
|
4
4
|
################################################################################
|
5
5
|
# FalkorLib Configuration
|
6
6
|
#
|
@@ -45,6 +45,9 @@ module FalkorLib #:nodoc:
|
|
45
45
|
:custom_cfg => '.falkorlib.yaml',
|
46
46
|
:rvm => {
|
47
47
|
:rubies => [ '1.9.3', '2.0.0', '2.1.0']
|
48
|
+
},
|
49
|
+
:templates => {
|
50
|
+
:puppet => {}
|
48
51
|
}
|
49
52
|
}
|
50
53
|
|
@@ -58,7 +61,10 @@ module FalkorLib #:nodoc:
|
|
58
61
|
res[:git] = FalkorLib::Config::Git::DEFAULTS if path.include?('lib/falkorlib/git.rb')
|
59
62
|
res[:gitflow] = FalkorLib::Config::GitFlow::DEFAULTS if path.include?('lib/falkorlib/git.rb')
|
60
63
|
res[:versioning] = FalkorLib::Config::Versioning::DEFAULTS if path.include?('lib/falkorlib/versioning.rb')
|
61
|
-
|
64
|
+
if path.include?('lib/falkorlib/puppet.rb')
|
65
|
+
res[:puppet] = FalkorLib::Config::Puppet::DEFAULTS
|
66
|
+
res[:templates][:puppet][:modules] = FalkorLib::Config::Puppet::Modules::DEFAULTS[:metadata]
|
67
|
+
end
|
62
68
|
end
|
63
69
|
# Check the potential local customizations
|
64
70
|
custom_cfg = File.join( res[:root], res[:custom_cfg])
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
################################################################################
|
3
|
-
# Time-stamp: <
|
3
|
+
# Time-stamp: <Thu 2014-08-28 23:02 svarrette>
|
4
4
|
################################################################################
|
5
5
|
# Interface for the main Puppet Module operations
|
6
6
|
#
|
@@ -9,6 +9,7 @@ require "falkorlib"
|
|
9
9
|
require "falkorlib/common"
|
10
10
|
|
11
11
|
require "pathname"
|
12
|
+
require 'json'
|
12
13
|
|
13
14
|
include FalkorLib::Common
|
14
15
|
|
@@ -51,18 +52,46 @@ module FalkorLib #:nodoc:
|
|
51
52
|
module Puppet
|
52
53
|
# Management of Puppet Modules operations
|
53
54
|
module Modules
|
54
|
-
module_function
|
55
55
|
|
56
|
-
|
57
|
-
|
56
|
+
module_function
|
57
|
+
|
58
|
+
def _get_classdefs(moduledir = Dir.pwd, type = 'classes')
|
59
|
+
name = File.basename( moduledir )
|
60
|
+
error "The module #{name} does not exist" unless File.directory?( moduledir )
|
61
|
+
t = case type
|
62
|
+
when /class*/i
|
63
|
+
'class'
|
64
|
+
when /def*/
|
65
|
+
'define'
|
66
|
+
else
|
67
|
+
''
|
68
|
+
end
|
69
|
+
error "Undefined type #{type}" if t.empty?
|
70
|
+
result = []
|
71
|
+
Dir["#{moduledir}/manifests/**/*.pp"].each do |ppfile|
|
72
|
+
File.read(ppfile).scan(/^[ \t]*#{t}[\s]+([0-9a-zA-z:]+).*$/).each do |line|
|
73
|
+
result << line[0]
|
74
|
+
end
|
75
|
+
end
|
76
|
+
result.uniq!
|
77
|
+
result
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
|
82
|
+
####
|
83
|
+
# Initialize a new Puppet Module named `name` in `rootdir`.
|
84
|
+
# Supported options:
|
58
85
|
# * :no_iteraction [boolean]
|
86
|
+
##
|
59
87
|
def init(rootdir = Dir.pwd, name = '', options = {})
|
60
88
|
config = {}
|
61
|
-
|
62
|
-
|
63
|
-
|
89
|
+
login = `whoami`.chomp
|
90
|
+
config[:name] = name unless name.empty?
|
91
|
+
moduledir = name.empty? ? rootdir : File.join(rootdir, name)
|
92
|
+
FalkorLib::Config::Puppet::Modules::DEFAULTS[:metadata].each do |k,v|
|
64
93
|
next if v.kind_of?(Array) or k == :license
|
65
|
-
|
94
|
+
next if k == :name and ! name.empty?
|
66
95
|
default_answer = case k
|
67
96
|
when :project_page
|
68
97
|
config[:source].nil? ? v : config[:source]
|
@@ -71,60 +100,150 @@ module FalkorLib #:nodoc:
|
|
71
100
|
when :issue_url
|
72
101
|
config[:project_page].nil? ? v : "#{config[:project_page]}/issues"
|
73
102
|
when :description
|
74
|
-
|
103
|
+
config[:summary].nil? ? v : "#{config[:summary]}"
|
75
104
|
when :source
|
76
|
-
|
105
|
+
v.empty? ? "https://github.com/#{`whoami`.chomp}/#{config[:name]}" : v
|
77
106
|
else
|
78
107
|
v
|
79
108
|
end
|
80
109
|
config[k.to_sym] = ask( "\t" + sprintf("%-20s", "Module #{k}"), default_answer)
|
81
110
|
end
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
#ap config
|
92
|
-
# Bootstrap the directory
|
93
|
-
templatedir = File.join( FalkorLib.templates, 'puppet', 'modules')
|
94
|
-
init_from_template(templatedir, rootdir, config, {
|
95
|
-
:erb_exclude => [ 'templates\/[^\/]*\.erb$' ]
|
96
|
-
})
|
97
|
-
# Rename the files / element templatename
|
98
|
-
Dir["#{rootdir}/**/*"].each do |e|
|
99
|
-
next unless e =~ /templatename/
|
100
|
-
info "renaming #{e}"
|
101
|
-
newname = e.gsub(/templatename/, "#{name}")
|
102
|
-
run %{ mv #{e} #{newname} }
|
103
|
-
end
|
111
|
+
name = config[:name].gsub(/.*-/, '')
|
112
|
+
tags = ask("\tKeywords (comma-separated list of tags)", name)
|
113
|
+
config[:tags] = tags.split(',')
|
114
|
+
license = select_from(FalkorLib::Config::Puppet::Modules::DEFAULTS[:licenses],
|
115
|
+
'Select the license index for the Puppet module:',
|
116
|
+
1)
|
117
|
+
config[:license] = license.downcase unless license.empty?
|
118
|
+
puts "\t" + sprintf("%-20s", "Module License:") + config[:license]
|
104
119
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
120
|
+
#ap config
|
121
|
+
# Bootstrap the directory
|
122
|
+
templatedir = File.join( FalkorLib.templates, 'puppet', 'modules')
|
123
|
+
init_from_template(templatedir, moduledir, config, {
|
124
|
+
:erb_exclude => [ 'templates\/[^\/]*\.erb$' ]
|
125
|
+
})
|
126
|
+
# Rename the files / element templatename
|
127
|
+
Dir["#{moduledir}/**/*"].each do |e|
|
128
|
+
next unless e =~ /templatename/
|
129
|
+
info "renaming #{e}"
|
130
|
+
newname = e.gsub(/templatename/, "#{name}")
|
131
|
+
run %{ mv #{e} #{newname} }
|
132
|
+
end
|
133
|
+
|
134
|
+
info "Generating the License file"
|
135
|
+
authors = config[:author].empty? ? 'UNKNOWN' : config[:author]
|
136
|
+
Dir.chdir(moduledir) do
|
137
|
+
run %{ licgen #{config[:license]} #{authors} }
|
138
|
+
end
|
139
|
+
info "Initialize RVM"
|
140
|
+
init_rvm(moduledir)
|
141
|
+
unless FalkorLib::GitFlow.init?(moduledir)
|
142
|
+
warn "Git [Flow] is not initialized in #{moduledir}."
|
143
|
+
a = ask("Proceed to git-flow initialization (Y|n)", 'Yes')
|
144
|
+
FalkorLib::GitFlow.init(moduledir) unless a =~ /n.*/i
|
145
|
+
end
|
146
|
+
|
147
|
+
# Propose to commit the key files
|
148
|
+
if FalkorLib::Git.init?(moduledir)
|
149
|
+
if FalkorLib::GitFlow.init?(moduledir)
|
150
|
+
info "=> preparing git-flow feature for the newly created module '#{config[:name]}'"
|
151
|
+
FalkorLib::GitFlow.start('feature', "init_#{name}", moduledir)
|
152
|
+
end
|
153
|
+
[ 'metadata.json', 'LICENSE', '.gitignore', 'Gemfile', 'Rakefile'].each do |f|
|
154
|
+
FalkorLib::Git.add(File.join(moduledir, f))
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end # init
|
158
|
+
|
159
|
+
####
|
160
|
+
# Parse a given modules to collect information
|
161
|
+
##
|
162
|
+
def parse(moduledir = Dir.pwd)
|
163
|
+
name = File.basename( moduledir )
|
164
|
+
error "The module #{name} does not exist" unless File.directory?( moduledir )
|
165
|
+
jsonfile = File.join( moduledir, 'metadata.json')
|
166
|
+
error "Unable to find #{jsonfile}" unless File.exist?( jsonfile )
|
167
|
+
metadata = JSON.parse( IO.read( jsonfile ) )
|
168
|
+
metadata["classes"] = classes(moduledir)
|
169
|
+
metadata["definitions"] = definitions(moduledir)
|
170
|
+
deps = deps(moduledir)
|
171
|
+
listed_deps = metadata["dependencies"]
|
172
|
+
missed_deps = []
|
173
|
+
metadata["dependencies"].each do |dep|
|
174
|
+
lib = dep["name"].gsub(/^[^\/-]+[\/-]/,'')
|
175
|
+
if deps.include?( lib )
|
176
|
+
deps.delete( lib )
|
177
|
+
else
|
178
|
+
unless lib =~ /stdlib/
|
179
|
+
warn "The library '#{dep["name"]}' is not analyzed as part of the #{name} module"
|
180
|
+
missed_deps << dep
|
181
|
+
end
|
122
182
|
end
|
123
|
-
|
124
|
-
|
183
|
+
end
|
184
|
+
if ! deps.empty?
|
185
|
+
deps.each do |l|
|
186
|
+
warn "The module '#{l}' is missing in the dependencies thus added"
|
187
|
+
login = ask("[Github] login for the module '#{lib}'")
|
188
|
+
version = ask("Version requirement (ex: '>=1.0.0 <2.0.0' or '1.2.3' or '1.x')")
|
189
|
+
metadata["dependencies"] << {
|
190
|
+
"name" => "#{login}/#{lib}",
|
191
|
+
"version_requirement" => "#{version}"
|
192
|
+
}
|
125
193
|
end
|
126
|
-
|
127
|
-
|
194
|
+
warn "About to commit these changes in the '#{name}/metadata.json' file"
|
195
|
+
really_continue?
|
196
|
+
File.open(jsonfile,"w") do |f|
|
197
|
+
f.write JSON.pretty_generate( metadata )
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end # parse
|
201
|
+
|
202
|
+
|
203
|
+
#######
|
204
|
+
# Find the classes of a given module
|
205
|
+
###
|
206
|
+
def classes(moduledir = Dir.pwd)
|
207
|
+
_get_classdefs(moduledir, 'classes')
|
208
|
+
end
|
209
|
+
|
210
|
+
#######
|
211
|
+
# Find the definitions of a given module
|
212
|
+
###
|
213
|
+
def definitions(moduledir = Dir.pwd)
|
214
|
+
_get_classdefs(moduledir, 'definitions')
|
215
|
+
end
|
216
|
+
|
217
|
+
#######
|
218
|
+
# Find the dependencies of a given module
|
219
|
+
###
|
220
|
+
def deps(moduledir = Dir.pwd)
|
221
|
+
name = File.basename( moduledir )
|
222
|
+
error "The module #{name} does not exist" unless File.directory?( moduledir )
|
223
|
+
|
224
|
+
result = Array.new
|
225
|
+
result2 = Array.new
|
226
|
+
resulttmp = Array.new
|
227
|
+
|
228
|
+
result << name
|
229
|
+
|
230
|
+
while result != result2 do
|
231
|
+
resulttmp = result.dup
|
232
|
+
(result - result2).each do |x|
|
233
|
+
Dir["#{moduledir}/**/*.pp"].each do |ppfile|
|
234
|
+
File.read(ppfile).scan(/^[ \t]*include.*$|^[ \t]*require.*$/).each do |line|
|
235
|
+
if line.scan(">").length == 0
|
236
|
+
result << line.gsub(/^[ \t]*(include|require) ([\"']|)([0-9a-zA-Z:{$}\-]*)([\"']|)/, '\3').split("::").first
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
result.uniq!
|
242
|
+
result2 = resulttmp.dup
|
243
|
+
end
|
244
|
+
result.delete "#{name}"
|
245
|
+
result
|
246
|
+
end
|
128
247
|
|
129
248
|
|
130
249
|
end # module FalkorLib::Puppet::Modules
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
################################################################################
|
3
3
|
# puppet_modules.rake - Special tasks for the management of Puppet modules
|
4
|
-
# Time-stamp: <
|
4
|
+
# Time-stamp: <Thu 2014-08-28 23:04 svarrette>
|
5
5
|
#
|
6
6
|
# Copyright (c) 2014 Sebastien Varrette <Sebastien.Varrette@uni.lu>
|
7
7
|
# http://varrette.gforge.uni.lu
|
@@ -26,10 +26,18 @@ namespace :bootstrap do
|
|
26
26
|
moduledir = File.join( FalkorLib.config[:puppet][:modulesdir], name)
|
27
27
|
dir = ask("Destination directory:", moduledir)
|
28
28
|
error "The module '#{name}' already exists" if File.directory?(dir)
|
29
|
-
FalkorLib::Puppet::Modules.init(dir
|
29
|
+
FalkorLib::Puppet::Modules.init(dir)
|
30
30
|
end
|
31
31
|
|
32
32
|
|
33
33
|
end # namespace bootstrap:puppet
|
34
34
|
end # namespace bootstrap
|
35
35
|
|
36
|
+
|
37
|
+
|
38
|
+
#.....................
|
39
|
+
namespace :puppet do
|
40
|
+
include FalkorLib::Common
|
41
|
+
|
42
|
+
|
43
|
+
end # namespace puppet
|
data/lib/falkorlib/version.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
#########################################
|
3
3
|
# puppet_modules_spec.rb
|
4
4
|
# @author Sebastien Varrette <Sebastien.Varrette@uni.lu>
|
5
|
-
# Time-stamp: <
|
5
|
+
# Time-stamp: <Fri 2014-08-29 11:32 svarrette>
|
6
6
|
#
|
7
7
|
# @description Check the Puppet Modules operations
|
8
8
|
#
|
@@ -19,6 +19,10 @@ describe FalkorLib::Puppet::Modules do
|
|
19
19
|
|
20
20
|
dir = Dir.mktmpdir
|
21
21
|
#afile = File.join(dir, 'a_file')
|
22
|
+
# before :all do
|
23
|
+
# ENV['GIT_AUTHOR_NAME'] = 'travis' if ENV['GIT_AUTHOR_NAME'].nil?
|
24
|
+
# ENV['GIT_AUTHOR_EMAIL'] = 'travis@domain.org' if ENV['GIT_AUTHOR_EMAIL'].nil?
|
25
|
+
# end
|
22
26
|
|
23
27
|
after :all do
|
24
28
|
FileUtils.remove_entry_secure dir
|
@@ -27,10 +31,14 @@ describe FalkorLib::Puppet::Modules do
|
|
27
31
|
#############################################################
|
28
32
|
context "Test Puppet Module creation within temporary directory " do
|
29
33
|
|
34
|
+
# Module name
|
35
|
+
name = 'toto'
|
36
|
+
moduledir = File.join(dir, name)
|
37
|
+
|
30
38
|
it "#init -- create a puppet module" do
|
31
|
-
Array.new(
|
32
|
-
|
33
|
-
FalkorLib::Puppet::Modules.init(
|
39
|
+
Array.new(26).each { |e| STDIN.should_receive(:gets).and_return('') }
|
40
|
+
STDIN.should_receive(:gets).and_return('No')
|
41
|
+
FalkorLib::Puppet::Modules.init(moduledir)
|
34
42
|
templatedir = File.join( FalkorLib.templates, 'puppet', 'modules')
|
35
43
|
s = true
|
36
44
|
Dir["#{templatedir}/**/*"].each do |e|
|
@@ -39,13 +47,41 @@ describe FalkorLib::Puppet::Modules do
|
|
39
47
|
file = e.gsub(/templatename/, "#{name}")
|
40
48
|
filename = File.basename(file)
|
41
49
|
filename = File.basename(file, '.erb') unless file =~ /templates\/toto-variables\.erb/
|
42
|
-
f = File.join(
|
50
|
+
f = File.join(moduledir, relative_dir, filename)
|
43
51
|
#puts "checking #{f} - #{File.exists?( f )}"
|
44
52
|
s &= File.exists?( f )
|
45
53
|
end
|
46
54
|
s.should be_true
|
47
55
|
end
|
48
56
|
|
57
|
+
it "#classes -- list classes" do
|
58
|
+
l = FalkorLib::Puppet::Modules._get_classdefs(moduledir, 'classes')
|
59
|
+
c = FalkorLib::Puppet::Modules.classes(moduledir)
|
60
|
+
c.should == l
|
61
|
+
ref = [
|
62
|
+
"toto::params",
|
63
|
+
"toto",
|
64
|
+
"toto::common",
|
65
|
+
"toto::debian",
|
66
|
+
"toto::redhat"
|
67
|
+
]
|
68
|
+
c.size.should == ref.size
|
69
|
+
c.each { |e| ref.should include(e) }
|
70
|
+
end
|
71
|
+
|
72
|
+
it "#definitions -- list definitions" do
|
73
|
+
d = FalkorLib::Puppet::Modules.definitions(moduledir)
|
74
|
+
d.should == [ "toto::mydef" ]
|
75
|
+
end
|
76
|
+
|
77
|
+
it "#deps -- list dependencies" do
|
78
|
+
d = FalkorLib::Puppet::Modules.deps(moduledir)
|
79
|
+
d.should == []
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
|
84
|
+
|
49
85
|
|
50
86
|
end
|
51
87
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: falkorlib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sebastien Varrette
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|