bonethug 0.0.7 → 0.0.10
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.
- data/Gemfile +30 -4
- data/bonethug.gemspec +9 -1
- data/{skel/base/config/example → config}/backup.rb +7 -2
- data/{skel/base/config/example → config}/cnf.yml +11 -0
- data/{skel/base/config/example → config}/deploy.rb +16 -3
- data/{skel/base/config/example → config}/schedule.rb +1 -1
- data/lib/bonethug/cli.rb +52 -2
- data/lib/bonethug/conf.rb +280 -0
- data/lib/bonethug/installer.rb +85 -48
- data/lib/bonethug/version.rb +1 -1
- data/lib/bonethug/watcher.rb +121 -0
- data/lib/bonethug.rb +1 -0
- data/skel/base/config/example/.gitkeep +0 -0
- data/skel/base/lib/.gitkeep +0 -0
- data/skel/project_types/silverstripe3/composer.json +5 -4
- data/skel/project_types/silverstripe3/config/example/schedule.rb +18 -18
- data/skel/project_types/silverstripe3/public/project/_config.php +1 -1
- metadata +27 -9
- data/skel/base/lib/conf.rb +0 -275
- data/skel/project_types/silverstripe3/config.ru +0 -3
data/Gemfile
CHANGED
@@ -1,10 +1,36 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
|
1
3
|
source 'https://rubygems.org'
|
2
4
|
|
3
5
|
# Specify your gem's dependencies in bonethug.gemspec
|
4
6
|
gemspec
|
5
7
|
|
6
8
|
# tell bundler to get stuff from git hub
|
7
|
-
gem 'mina',
|
8
|
-
gem 'astrails-safe',
|
9
|
-
gem 'whenever',
|
10
|
-
|
9
|
+
gem 'mina', github: 'nadarei/mina'
|
10
|
+
gem 'astrails-safe', github: 'astrails/safe'
|
11
|
+
gem 'whenever', github: 'javan/whenever'
|
12
|
+
|
13
|
+
# gem 'sass', github: 'nex3/sass'
|
14
|
+
# gem 'coffee-script', github: 'jashkenas/coffee-script'
|
15
|
+
|
16
|
+
gem 'guard-sprockets', github: 'dormi/guard-sprockets'
|
17
|
+
gem 'uglifier'
|
18
|
+
|
19
|
+
# gem 'less'
|
20
|
+
# gem 'sass-rails'
|
21
|
+
# gem 'execjs'
|
22
|
+
|
23
|
+
if RbConfig::CONFIG['target_os'] =~ /mswin|mingw/i
|
24
|
+
gem 'wdm', '>= 0.1.0'
|
25
|
+
end
|
26
|
+
|
27
|
+
# if RUBY_PLATFORM.downcase.include?('linux')
|
28
|
+
# gem 'therubyracer'
|
29
|
+
# gem 'rb-inotify'
|
30
|
+
# end
|
31
|
+
|
32
|
+
# if RUBY_PLATFORM.downcase.include?('darwin')
|
33
|
+
# gem 'rb-fsevent'
|
34
|
+
# gem 'terminal-notifier-guard'
|
35
|
+
# gem 'growl'
|
36
|
+
# end
|
data/bonethug.gemspec
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
4
|
require 'bonethug/version'
|
5
|
+
require 'rbconfig'
|
6
|
+
|
5
7
|
|
6
8
|
Gem::Specification.new do |spec|
|
7
9
|
|
@@ -25,6 +27,12 @@ Gem::Specification.new do |spec|
|
|
25
27
|
spec.add_dependency 'mina'
|
26
28
|
spec.add_dependency 'astrails-safe'
|
27
29
|
spec.add_dependency 'whenever'
|
28
|
-
spec.add_dependency '
|
30
|
+
# spec.add_dependency 'sass'
|
31
|
+
# spec.add_dependency 'coffee-script'
|
32
|
+
spec.add_dependency 'guard-sprockets'
|
33
|
+
|
34
|
+
if RbConfig::CONFIG['target_os'] =~ /mswin|mingw/i
|
35
|
+
spec.add_dependency 'wdm', '>= 0.1.0'
|
36
|
+
end
|
29
37
|
|
30
38
|
end
|
@@ -2,6 +2,12 @@
|
|
2
2
|
# bundle exec astrails-safe CONFIG_FILE
|
3
3
|
# more info: https://github.com/astrails/safe
|
4
4
|
|
5
|
+
# require some shit
|
6
|
+
# --------------------------------
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
require 'bonethug/conf'
|
10
|
+
|
5
11
|
# Load some data
|
6
12
|
# --------------------------------
|
7
13
|
|
@@ -10,8 +16,7 @@ exec_path = File.expand_path(File.dirname(__FILE__))
|
|
10
16
|
env = ENV['to']
|
11
17
|
|
12
18
|
# load config
|
13
|
-
|
14
|
-
conf = Conf.new.add(exec_path + '/config/cnf.yml').add(exec_path + '/config/database.yml' => { root: 'dbs.default' })
|
19
|
+
conf = Bonethug::Conf.new.add(exec_path + '/config/cnf.yml').add(exec_path + '/config/database.yml' => { root: 'dbs.default' })
|
15
20
|
|
16
21
|
# do a check
|
17
22
|
raise 'could not find deployment environment' unless conf.get('deploy.environments').has_key? env
|
@@ -119,5 +119,16 @@ chgrp:
|
|
119
119
|
resources:
|
120
120
|
- public/assets
|
121
121
|
- public/uploads
|
122
|
+
watch:
|
123
|
+
sass:
|
124
|
+
-
|
125
|
+
src: public/assets/scss
|
126
|
+
dest: public/assets/css
|
127
|
+
filter:
|
128
|
+
coffee:
|
129
|
+
-
|
130
|
+
src: public/assets/coffee
|
131
|
+
dest: public/assets/js
|
132
|
+
filter:
|
122
133
|
log_dirs:
|
123
134
|
- log
|
@@ -6,8 +6,8 @@
|
|
6
6
|
|
7
7
|
# Requires
|
8
8
|
# ---------------------------------------------------------------
|
9
|
-
|
10
|
-
require
|
9
|
+
require 'rubygems'
|
10
|
+
require 'bonethug/conf'
|
11
11
|
require 'mina/bundler'
|
12
12
|
require 'mina/rails'
|
13
13
|
require 'mina/git'
|
@@ -18,7 +18,7 @@ require 'mina/whenever'
|
|
18
18
|
# ---------------------------------------------------------------
|
19
19
|
|
20
20
|
# load the conf
|
21
|
-
conf = Conf.new
|
21
|
+
conf = Bonethug::Conf.new
|
22
22
|
cnf = conf.to_hash
|
23
23
|
|
24
24
|
# pull config from environment vars
|
@@ -111,6 +111,11 @@ task :init_db => :environment do
|
|
111
111
|
queue! %[cd #{deploy_to}/current && bundle exec rake db:reset RAILS_ENV="#{env}"] if deploy.get('project_type') == 'rails'
|
112
112
|
end
|
113
113
|
|
114
|
+
desc "Restores application state to the most recent backup"
|
115
|
+
task :backup => :environment do
|
116
|
+
queue! %[cd #{deploy_to}/current && export to=#{env} && bundle exec astrails-safe .bonethug/backup.rb] if deploy.get('project_type') == 'rails'
|
117
|
+
end
|
118
|
+
|
114
119
|
desc "Restores application state to the most recent backup"
|
115
120
|
task :restore_backup => :environment do
|
116
121
|
# to be implemented
|
@@ -194,6 +199,14 @@ task :deploy => :environment do
|
|
194
199
|
|
195
200
|
to :launch do
|
196
201
|
|
202
|
+
if ['rails3'].include? deploy.get('project_type')
|
203
|
+
|
204
|
+
# make sure passenger runs the app as apache
|
205
|
+
queue! %[cd #{deploy_to}/current/config && chown -R www-data:www-data environment.rb]
|
206
|
+
queue! %[cd #{deploy_to}/current && chown -R www-data:www-data config.ru]
|
207
|
+
|
208
|
+
end
|
209
|
+
|
197
210
|
# ensure that the correct directory permissions are set
|
198
211
|
queue! %[cd #{deploy_to}/current/public && chown -R www-data:www-data . && chmod -R 775 .]
|
199
212
|
queue! %[cd #{deploy_to}/shared/tmp && chown -R www-data:www-data . && chmod -R 775 .]
|
@@ -30,5 +30,5 @@ set :output, {:error => base_path+'/log/cron_error.log', :standard => base_path+
|
|
30
30
|
|
31
31
|
# actual jobs
|
32
32
|
every 1.day, :at => '11 pm' do
|
33
|
-
command "cd #{base_path} && export to=#{@environment} && bundle exec astrails-safe
|
33
|
+
command "cd #{base_path} && export to=#{@environment} && bundle exec astrails-safe .bonethug/backup.rb"
|
34
34
|
end
|
data/lib/bonethug/cli.rb
CHANGED
@@ -17,10 +17,60 @@ module Bonethug
|
|
17
17
|
# handle args
|
18
18
|
type = ARGV[1]
|
19
19
|
location = ARGV[2] || '.'
|
20
|
-
|
20
|
+
|
21
|
+
# validate
|
22
|
+
if type.empty?
|
23
|
+
puts 'Usage: bonethug install [type] [location]'
|
24
|
+
return
|
25
|
+
end
|
26
|
+
|
27
|
+
# run the installer
|
28
|
+
Installer.install type, location
|
29
|
+
|
30
|
+
when 'init', 'update'
|
31
|
+
|
32
|
+
# handle args
|
33
|
+
location = ARGV[1] || '.'
|
34
|
+
|
35
|
+
# validate
|
36
|
+
if location.empty?
|
37
|
+
puts 'Usage: bonethug #{task} [location]'
|
38
|
+
return
|
39
|
+
end
|
40
|
+
|
41
|
+
# run the initaliser
|
42
|
+
Installer.bonethugise(location, task.to_sym)
|
43
|
+
|
44
|
+
when 'deploy', 'setup', 'remote-backup', 'local-backup'
|
45
|
+
|
46
|
+
# handle args
|
47
|
+
environment = ARGV[1]
|
48
|
+
|
49
|
+
# validate
|
50
|
+
if environment.empty?
|
51
|
+
puts 'Usage: bonethug #{task} [environment]'
|
52
|
+
return
|
53
|
+
end
|
54
|
+
|
55
|
+
case task
|
56
|
+
when 'deploy'
|
57
|
+
exec "export to=#{environment} && bundle exec mina -f .bonethug/deploy.rb deploy --verbose"
|
58
|
+
when 'setup'
|
59
|
+
exec "export to=#{environment} && bundle exec mina -f .bonethug/deploy.rb setup --verbose"
|
60
|
+
when 'remote-backup'
|
61
|
+
exec "export to=#{environment} && bundle exec mina -f .bonethug/deploy.rb backup --verbose"
|
62
|
+
when 'local-backup'
|
63
|
+
exec "export to=#{environment} && bundle exec astrails-safe .bonethug/backup.rb"
|
64
|
+
end
|
65
|
+
|
66
|
+
when 'watch'
|
67
|
+
|
68
|
+
# handle args
|
69
|
+
type = ARGV[1] || 'all'
|
70
|
+
location = ARGV[2] || '.'
|
21
71
|
|
22
72
|
# run the installer
|
23
|
-
|
73
|
+
Watcher.watch type, location
|
24
74
|
|
25
75
|
when 'clean'
|
26
76
|
|
@@ -0,0 +1,280 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Bonethug
|
4
|
+
|
5
|
+
class Conf
|
6
|
+
|
7
|
+
@@default_paths = {
|
8
|
+
File.expand_path('./config/cnf.yml') => nil,
|
9
|
+
File.expand_path('./config/database.yml') => {root: 'dbs.default'}
|
10
|
+
}
|
11
|
+
@@fallbacks = {
|
12
|
+
'name' => 'database',
|
13
|
+
'user' => 'username',
|
14
|
+
'pass' => 'password'
|
15
|
+
}
|
16
|
+
|
17
|
+
def initialize(new_hash = nil, options = {})
|
18
|
+
raise "New hash must be of type Hash" if new_hash && new_hash.class.name != 'Hash'
|
19
|
+
@options = {use_fallbacks: true}.merge options
|
20
|
+
@loaded_paths = []
|
21
|
+
@paths = {}
|
22
|
+
@config_hashes = {}
|
23
|
+
@compiled_hash = new_hash ? new_hash : {}
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_path(new_path)
|
27
|
+
if new_path.class.name == 'Hash'
|
28
|
+
path_hash = new_path
|
29
|
+
elsif new_path.class.name == 'String'
|
30
|
+
path_hash = {new_path => nil}
|
31
|
+
else
|
32
|
+
raise "add_path only accepts stings or hashes"
|
33
|
+
end
|
34
|
+
@paths = @paths.merge path_hash
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
def remove_path(path_to_remove)
|
39
|
+
# deletes an element from a hash if its key can be found
|
40
|
+
@paths.delete path_to_remove
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
def compile_configuration
|
45
|
+
|
46
|
+
# load the defaults if we haven't loaded anything
|
47
|
+
use_defaults if @paths.empty?
|
48
|
+
|
49
|
+
# generate output
|
50
|
+
out = {}
|
51
|
+
@paths.each do |path,options|
|
52
|
+
|
53
|
+
# load the file if we haven't already
|
54
|
+
load_path path unless @loaded_paths.include? path
|
55
|
+
|
56
|
+
# create a base fragment
|
57
|
+
fragment_base = {}
|
58
|
+
|
59
|
+
# create the other nodes
|
60
|
+
if options and options.has_key? :root
|
61
|
+
fragment = fragment_base
|
62
|
+
nodes = options[:root].split '.'
|
63
|
+
nodes.each_with_index do |node,i|
|
64
|
+
fragment[node] = i == nodes.length-1 ? @config_hashes[path] : {}
|
65
|
+
fragment = fragment[node]
|
66
|
+
end
|
67
|
+
else
|
68
|
+
fragment_base = @config_hashes[path]
|
69
|
+
end
|
70
|
+
|
71
|
+
# output
|
72
|
+
out = out.merge fragment_base
|
73
|
+
|
74
|
+
end
|
75
|
+
@compiled_hash = out
|
76
|
+
self
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
def all_paths_loaded?
|
81
|
+
@paths.each do |path,options|
|
82
|
+
return false unless @loaded_paths.include? path
|
83
|
+
end
|
84
|
+
true
|
85
|
+
end
|
86
|
+
|
87
|
+
def path_ok?(path)
|
88
|
+
path && path.class.name == 'String' and File.exist?(path) and File.file?(path)
|
89
|
+
end
|
90
|
+
|
91
|
+
def check_path!(path)
|
92
|
+
raise 'config file "' + path.to_s + '" does not exist' unless path_ok? path
|
93
|
+
end
|
94
|
+
|
95
|
+
def check_paths!
|
96
|
+
raise 'No config files have not been set' if @paths.empty?
|
97
|
+
@paths.each do |path,options|
|
98
|
+
check_path! path
|
99
|
+
end
|
100
|
+
self
|
101
|
+
end
|
102
|
+
|
103
|
+
def check_paths
|
104
|
+
@paths.each do |path,options|
|
105
|
+
@paths.delete path unless path_ok? path
|
106
|
+
end
|
107
|
+
self
|
108
|
+
end
|
109
|
+
|
110
|
+
def load_paths
|
111
|
+
@paths.each do |path,options|
|
112
|
+
load_path path
|
113
|
+
end
|
114
|
+
self
|
115
|
+
end
|
116
|
+
|
117
|
+
def load_path(path)
|
118
|
+
load_path? path
|
119
|
+
self
|
120
|
+
end
|
121
|
+
|
122
|
+
def load_path?(path)
|
123
|
+
return false unless path_ok? path
|
124
|
+
@loaded_paths.push path
|
125
|
+
@config_hashes[path] = YAML.load_file path
|
126
|
+
self
|
127
|
+
end
|
128
|
+
|
129
|
+
def use_defaults
|
130
|
+
@paths = @@default_paths if @paths.empty?
|
131
|
+
load_paths
|
132
|
+
self
|
133
|
+
end
|
134
|
+
|
135
|
+
def get(node = nil, force_type = nil)
|
136
|
+
node_val = node ? get_compiled_hash_node_handle(node) : self
|
137
|
+
case force_type
|
138
|
+
when 'Array'
|
139
|
+
return [] unless node_val
|
140
|
+
return [node_val] if node_val.class.name == 'String'
|
141
|
+
return node_val.class.name == 'Array' ? node_val.clone : node_val.to_a
|
142
|
+
when 'Hash'
|
143
|
+
return {} unless node_val
|
144
|
+
if node_val.class.name == 'Array'
|
145
|
+
return array2hash node_val
|
146
|
+
elsif node_val.class.name == 'Hash'
|
147
|
+
return node_val.clone
|
148
|
+
else
|
149
|
+
return node_val.to_hash
|
150
|
+
end
|
151
|
+
else
|
152
|
+
return handle_node_value node_val
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def has_key?(key)
|
157
|
+
compiled_hash.has_key? key
|
158
|
+
end
|
159
|
+
|
160
|
+
def get_compiled_hash_node_handle(node = nil)
|
161
|
+
if node
|
162
|
+
nodes = node.split('.')
|
163
|
+
current = compiled_hash
|
164
|
+
nodes.each do |node|
|
165
|
+
node = @@fallbacks[node] if @options[:use_fallbacks] and !current[node] and @@fallbacks[node]
|
166
|
+
current = (current.class.name == 'Hash' or current.class.name == 'Array') ? current[node] : nil
|
167
|
+
end
|
168
|
+
return current
|
169
|
+
else
|
170
|
+
return self.compiled_hash
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def handle_node_value(node)
|
175
|
+
return node if node.class.name == 'Conf'
|
176
|
+
node = array2hash node if node.class.name == 'Array'
|
177
|
+
return node.class.name == 'Hash' ? self.clone.set_compiled_hash(node) : node
|
178
|
+
end
|
179
|
+
|
180
|
+
def array2hash(arr)
|
181
|
+
return arr if arr.class.name == 'Hash'
|
182
|
+
hsh = {}
|
183
|
+
arr.each_with_index do |item,i|
|
184
|
+
hsh[i] = item
|
185
|
+
end
|
186
|
+
hsh
|
187
|
+
end
|
188
|
+
|
189
|
+
def get_hash(node = nil)
|
190
|
+
get(node).compiled_hash
|
191
|
+
end
|
192
|
+
|
193
|
+
def to_hash
|
194
|
+
compiled_hash.clone
|
195
|
+
end
|
196
|
+
|
197
|
+
def to_a
|
198
|
+
to_hash.to_a
|
199
|
+
end
|
200
|
+
|
201
|
+
def node_merge!(node1,node2)
|
202
|
+
cnf1 = get_compiled_hash_node_handle node1
|
203
|
+
cnf2 = get_compiled_hash_node_handle node2
|
204
|
+
cnf1.merge!(cnf2) if cnf1 && cnf2
|
205
|
+
return self
|
206
|
+
end
|
207
|
+
|
208
|
+
def node_merge(node1,node2)
|
209
|
+
cnf1 = get_compiled_hash_node_handle node1
|
210
|
+
cnf2 = get_compiled_hash_node_handle node2
|
211
|
+
return handle_node_value cnf1 if cnf1 && !cnf2
|
212
|
+
return handle_node_value cnf1 if cnf2 && !cnf1
|
213
|
+
return handle_node_value cnf1.merge(cnf2) if cnf1 && cnf2
|
214
|
+
end
|
215
|
+
|
216
|
+
def merge(node)
|
217
|
+
return self unless node
|
218
|
+
return handle_node_value compiled_hash.merge(node.to_hash)
|
219
|
+
end
|
220
|
+
|
221
|
+
def each
|
222
|
+
compiled_hash.each do |k,v|
|
223
|
+
yield k,handle_node_value(v)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
# Getters and Setters
|
228
|
+
# -------------------
|
229
|
+
|
230
|
+
def paths=(new_paths)
|
231
|
+
raise "paths must be a hash" unless new_hash.class.name == 'Hash'
|
232
|
+
@paths = new_paths
|
233
|
+
end
|
234
|
+
|
235
|
+
def paths
|
236
|
+
@paths
|
237
|
+
end
|
238
|
+
|
239
|
+
def config_hashes
|
240
|
+
@config_hashes
|
241
|
+
end
|
242
|
+
|
243
|
+
def compiled_hash
|
244
|
+
compile_configuration if @compiled_hash.empty?
|
245
|
+
@compiled_hash
|
246
|
+
end
|
247
|
+
|
248
|
+
def compiled_hash=(new_hash)
|
249
|
+
raise "compiled hash must be a hash" unless new_hash.class.name == 'Hash'
|
250
|
+
@compiled_hash = new_hash
|
251
|
+
end
|
252
|
+
|
253
|
+
def set_compiled_hash(new_hash)
|
254
|
+
raise "compiled hash must be a hash" unless new_hash.class.name == 'Hash'
|
255
|
+
@compiled_hash = new_hash
|
256
|
+
self
|
257
|
+
end
|
258
|
+
|
259
|
+
# Method Aliases
|
260
|
+
# --------------
|
261
|
+
|
262
|
+
def a2h(arr)
|
263
|
+
array2hash arr
|
264
|
+
end
|
265
|
+
|
266
|
+
def to_hash
|
267
|
+
compiled_hash
|
268
|
+
end
|
269
|
+
|
270
|
+
def add(new_path)
|
271
|
+
add_path new_path
|
272
|
+
end
|
273
|
+
|
274
|
+
def remove(path_to_remove)
|
275
|
+
remove_path path_to_remove
|
276
|
+
end
|
277
|
+
|
278
|
+
end
|
279
|
+
|
280
|
+
end
|
data/lib/bonethug/installer.rb
CHANGED
@@ -2,9 +2,11 @@
|
|
2
2
|
# ----------------
|
3
3
|
# - Have some sort of safe vs forced install - tie in with exlcuded paths
|
4
4
|
# - Check that excluded paths is working in manifest
|
5
|
+
# - Gemfile, .gitignore, composer.json need to be no go zones
|
5
6
|
# ----------------
|
6
7
|
|
7
|
-
require
|
8
|
+
require 'rubygems'
|
9
|
+
require 'bonethug/conf'
|
8
10
|
require 'fileutils'
|
9
11
|
require 'find'
|
10
12
|
require 'digest/md5'
|
@@ -17,9 +19,10 @@ module Bonethug
|
|
17
19
|
include FileUtils
|
18
20
|
include Digest
|
19
21
|
|
20
|
-
@@
|
22
|
+
@@bonthug_gem_dir = File.expand_path(File.dirname(__FILE__)) + '/../..'
|
23
|
+
@@skel_dir = @@bonthug_gem_dir + '/skel'
|
21
24
|
@@conf = Conf.new.add(@@skel_dir + '/skel.yml')
|
22
|
-
@@project_config_files = ['
|
25
|
+
@@project_config_files = {editable: ['cnf.yml','schedule.rb'], generated: ['backup.rb','deploy.rb']}
|
23
26
|
|
24
27
|
def self.install(type, target = '.')
|
25
28
|
|
@@ -72,20 +75,20 @@ module Bonethug
|
|
72
75
|
puts 'Installing build to ' + target + '...'
|
73
76
|
FileUtils.cp_r tmp_dir + '/.', target
|
74
77
|
|
75
|
-
# try to update the configuration files
|
76
|
-
puts 'Updating configs...'
|
77
|
-
self.update_configuration_files(target)
|
78
|
-
|
79
78
|
# try to update the configuration files
|
80
79
|
puts 'Updating build informtation...'
|
81
80
|
self.save_project_meta_data(target)
|
82
81
|
|
83
82
|
# clean up any exisitng install tmp files
|
84
83
|
puts 'Cleaning up temporary files...'
|
85
|
-
FileUtils.rm_rf tmp_dir
|
84
|
+
FileUtils.rm_rf tmp_dir
|
86
85
|
|
87
86
|
puts "Installation Complete"
|
88
87
|
|
88
|
+
# try to update the configuration files
|
89
|
+
puts 'Updating configs...'
|
90
|
+
self.bonethugise(target, :init)
|
91
|
+
|
89
92
|
end
|
90
93
|
|
91
94
|
def self.clean(target)
|
@@ -136,48 +139,11 @@ module Bonethug
|
|
136
139
|
|
137
140
|
def self.build_manifest(dir)
|
138
141
|
dir_contents = Find.find(dir).map { |p| File.expand_path(p) }
|
139
|
-
manifest = dir_contents - ((@@conf.get('exlcuded_paths') || []).map { |p| File.expand_path(p) })
|
142
|
+
manifest = dir_contents - ((@@conf.get('exlcuded_paths','Array') || []).map { |p| File.expand_path(p) })
|
140
143
|
File.open(dir + '/.bonethug/manifest','w') { |file| file.puts manifest.join("\n") }
|
141
144
|
self
|
142
145
|
end
|
143
146
|
|
144
|
-
def self.update_configuration_files(target)
|
145
|
-
|
146
|
-
# load the existing project's datafile if present
|
147
|
-
meta_data = self.get_project_meta_data target
|
148
|
-
|
149
|
-
@@project_config_files.each do |config|
|
150
|
-
|
151
|
-
do_copy = true
|
152
|
-
example_file = target + '/config/example/' + config
|
153
|
-
target_file = target + '/config/' + config
|
154
|
-
|
155
|
-
# analyse the config file + build data file
|
156
|
-
file_exists = File.exist?(target_file)
|
157
|
-
contents_not_modified = false
|
158
|
-
contents_not_modified = true if file_exists and meta_data and meta_data['config_digests'] and meta_data['config_digests']['example/' + config] == self.contents_md5(target_file)
|
159
|
-
|
160
|
-
# meta_data_is_hash = meta_data_exists and meta_data.class.name == 'Hash' and meta_data['config_digests'].class.name == 'Hash'
|
161
|
-
# config_digests_found = meta_data_is_hash and meta_data['config_digests'].methods.include?('has_key?') and meta_data['config_digests'].has_key?('example/' + config)
|
162
|
-
# contents_not_modified = config_digests_found and meta_data['config_digests']['example/' + config] == self.contents_md5(target_file)
|
163
|
-
|
164
|
-
# don't copy if the file exists...
|
165
|
-
do_copy = false if file_exists
|
166
|
-
|
167
|
-
# unless it hasn't been modified, i.e. probably not conf.yml, but possibly some of the other ones
|
168
|
-
|
169
|
-
do_copy = true if contents_not_modified
|
170
|
-
|
171
|
-
# Copy if that's ok
|
172
|
-
FileUtils.cp example_file, target_file if do_copy
|
173
|
-
|
174
|
-
end
|
175
|
-
|
176
|
-
# return self for chaining
|
177
|
-
self
|
178
|
-
|
179
|
-
end
|
180
|
-
|
181
147
|
def self.contents_md5(file)
|
182
148
|
return false unless File.exist?(file)
|
183
149
|
MD5.digest File.read(file)
|
@@ -186,7 +152,7 @@ module Bonethug
|
|
186
152
|
def self.save_project_meta_data(base_dir)
|
187
153
|
|
188
154
|
meta_data = {'config_digests' => {}}
|
189
|
-
@@project_config_files.each do |file|
|
155
|
+
@@project_config_files[:editable].each do |file|
|
190
156
|
meta_data['config_digests']['example/' + file] = self.contents_md5(base_dir + '/config/example/' + file)
|
191
157
|
end
|
192
158
|
File.open(base_dir + '/.bonethug/data','w') { |file| file.puts meta_data.to_yaml }
|
@@ -202,7 +168,78 @@ module Bonethug
|
|
202
168
|
return YAML.load_file data_file if File.exists? data_file
|
203
169
|
return false
|
204
170
|
|
205
|
-
end
|
171
|
+
end
|
172
|
+
|
173
|
+
# mode == :init
|
174
|
+
# copy cnf.yml + schedule.rb to config if possible
|
175
|
+
# copy cnf.yml + schedule.rb to config/example if possible
|
176
|
+
# copy backup.rb and deploy.rb to .bonethug if possible
|
177
|
+
# add bonethug to gemfile if required
|
178
|
+
# run bundle install
|
179
|
+
|
180
|
+
# mode == :update
|
181
|
+
# copy cnf.yml + schedule.rb to config if possible
|
182
|
+
# force copy cnf.yml + schedule.rb to config/example
|
183
|
+
# force copy backup.rb and deploy.rb to .bonethug
|
184
|
+
# add bonethug to gemfile if required
|
185
|
+
# run bundle install
|
186
|
+
|
187
|
+
def self.bonethugise(dir='.', mode=:init)
|
188
|
+
|
189
|
+
target = File.expand_path(dir)
|
190
|
+
|
191
|
+
# check for the existence of required dirs and create if required
|
192
|
+
[target + '/.bonethug', target + '/config', target + '/config/example'].each do |path|
|
193
|
+
FileUtils.mkdir path unless File.directory? path
|
194
|
+
end
|
195
|
+
|
196
|
+
# Handle config files
|
197
|
+
@@project_config_files.each do |type, dirs|
|
198
|
+
dirs.each do |config|
|
199
|
+
|
200
|
+
src_file = @@bonthug_gem_dir + '/config/' + config
|
201
|
+
example_file = target + '/config/example/' + config if type == :editable
|
202
|
+
target_file = type == :editable ? target + '/config/' + config : target + '/.bonethug/' + config
|
203
|
+
|
204
|
+
if mode == :init
|
205
|
+
FileUtils.cp src_file, example_file if type == :editable and !File.exist?(example_file)
|
206
|
+
FileUtils.cp src_file, target_file unless File.exist?(target_file)
|
207
|
+
elsif mode == :update
|
208
|
+
FileUtils.cp src_file, example_file if type == :editable
|
209
|
+
FileUtils.cp src_file, target_file if type == :generated or !File.exist?(target_file)
|
210
|
+
else
|
211
|
+
raise "invalid bonethugise mode"
|
212
|
+
end
|
213
|
+
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
# handle gemfile
|
218
|
+
gemfile_path = target + '/Gemfile'
|
219
|
+
if File.exist? gemfile_path
|
220
|
+
gemfile_contents = File.read(gemfile_path)
|
221
|
+
unless /gem ["']bonethug["']/ =~ File.read(gemfile_path)
|
222
|
+
File.open(gemfile_path,'w') { |file| gemfile_contents + "\n" + 'gem "bonethug"' }
|
223
|
+
end
|
224
|
+
else
|
225
|
+
FileUtils.cp @@skel_dir + '/base/Gemfile', gemfile_path
|
226
|
+
end
|
227
|
+
|
228
|
+
# run bundler
|
229
|
+
exec 'bundle install --path vendor --binstubs'
|
230
|
+
|
231
|
+
# self
|
232
|
+
|
233
|
+
end
|
234
|
+
|
235
|
+
def self.update(dir = '.')
|
236
|
+
self.bonethugise(dir,:update)
|
237
|
+
end
|
238
|
+
|
239
|
+
def self.init(dir = '.')
|
240
|
+
self.bonethugise(dir,:init)
|
241
|
+
end
|
242
|
+
|
206
243
|
end
|
207
244
|
|
208
245
|
end
|
data/lib/bonethug/version.rb
CHANGED
@@ -0,0 +1,121 @@
|
|
1
|
+
# Todo
|
2
|
+
# ----------------
|
3
|
+
# - Have some sort of safe vs forced install - tie in with exlcuded paths
|
4
|
+
# - Check that excluded paths is working in manifest
|
5
|
+
# ----------------
|
6
|
+
|
7
|
+
require 'bonethug/conf'
|
8
|
+
require 'fileutils'
|
9
|
+
require 'find'
|
10
|
+
require 'digest/md5'
|
11
|
+
require 'yaml'
|
12
|
+
|
13
|
+
module Bonethug
|
14
|
+
|
15
|
+
class Watcher
|
16
|
+
|
17
|
+
include FileUtils
|
18
|
+
include Digest
|
19
|
+
|
20
|
+
def self.watch(type = 'all', target = '.')
|
21
|
+
|
22
|
+
# create full path
|
23
|
+
target = File.expand_path target
|
24
|
+
|
25
|
+
# load config
|
26
|
+
puts "Parsing Config..."
|
27
|
+
unless conf = Conf.new.add(target + '/config/cnf.yml')
|
28
|
+
puts "Couldn't find project configuration"
|
29
|
+
return
|
30
|
+
end
|
31
|
+
|
32
|
+
# project type
|
33
|
+
project_type = conf.get('deploy.project_type')
|
34
|
+
|
35
|
+
# end now if its a rails project
|
36
|
+
if ['rails','rails3'].include? project_type
|
37
|
+
puts "Rails doesn't require watching"
|
38
|
+
return
|
39
|
+
end
|
40
|
+
|
41
|
+
sass = []
|
42
|
+
if sasses = conf.get('watch.sass')
|
43
|
+
sasses.each do |index, watch|
|
44
|
+
sass.push(src: watch.get('src','Array'), dest: watch.get('dest'))
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
coffee = []
|
49
|
+
if coffees = conf.get('watch.coffee')
|
50
|
+
coffees.each do |index, watch|
|
51
|
+
coffee.push(src: watch.get('src','Array'), dest: watch.get('dest'))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Generate Guardfile
|
56
|
+
puts 'Generating Guardfile...'
|
57
|
+
guardfile_content = ''
|
58
|
+
|
59
|
+
# puts 'Starting Watch Daemons...'
|
60
|
+
# puts 'This may start more than one watch process and you may have to ctrl + c more than once to quit.'
|
61
|
+
|
62
|
+
# sass compiler
|
63
|
+
sass_watch_str = ''
|
64
|
+
sass.each do |watch|
|
65
|
+
filter = watch[:filter] ? "watch '#{watch[:filter]}'" : ""
|
66
|
+
guardfile_content += "
|
67
|
+
guard 'sprockets', :minify => true, :destination => '#{watch[:dest]}', :asset_paths => #{watch[:src].to_s} do
|
68
|
+
#{filter}
|
69
|
+
end
|
70
|
+
"
|
71
|
+
end
|
72
|
+
|
73
|
+
# # Coffescript compiler
|
74
|
+
coffee_watch_str = ''
|
75
|
+
coffee.each do |watch|
|
76
|
+
filter = watch[:filter] ? "watch '#{watch[:filter]}'" : ""
|
77
|
+
guardfile_content += "
|
78
|
+
guard 'sprockets', :minify => true, :destination => '#{watch[:dest]}', :asset_paths => #{watch[:src].to_s} do
|
79
|
+
#{filter}
|
80
|
+
end
|
81
|
+
"
|
82
|
+
end
|
83
|
+
|
84
|
+
# save the guardfile
|
85
|
+
File.open(target + '/.bonethug/Guardfile','w') do |file|
|
86
|
+
file.puts guardfile_content
|
87
|
+
end
|
88
|
+
|
89
|
+
puts 'Starting Watch Daemon...'
|
90
|
+
cmd = 'bundle exec guard --guardfile ' + target + '/.bonethug/Guardfile'
|
91
|
+
puts "calling: " + cmd
|
92
|
+
exec cmd
|
93
|
+
|
94
|
+
# puts 'Starting Watch Daemons...'
|
95
|
+
# puts 'This may start more than one watch process and you may have to ctrl + c more than once to quit.'
|
96
|
+
|
97
|
+
# # sass compiler
|
98
|
+
# sass_watch_str = ''
|
99
|
+
# sass.each do |watch|
|
100
|
+
# sass_watch_str += ' '+watch[:src]+':'+watch[:dest]
|
101
|
+
# end
|
102
|
+
# sass_cmd = "sass --watch #{sass_watch_str} --style compressed"
|
103
|
+
|
104
|
+
# # Coffescript compiler
|
105
|
+
# coffee_watch_str = ''
|
106
|
+
# coffee.each do |watch|
|
107
|
+
# coffee_watch_str += ' && coffee -o '+watch[:dest]+'/ -cw '+watch[:src]+'/'
|
108
|
+
# end
|
109
|
+
# coffee_cmd = coffee_watch_str
|
110
|
+
|
111
|
+
# # call it
|
112
|
+
# cmd = "#{sass_cmd} #{coffee_cmd}"
|
113
|
+
# puts "Running: " + cmd
|
114
|
+
|
115
|
+
# log = `#{cmd}`
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
data/lib/bonethug.rb
CHANGED
File without changes
|
File without changes
|
@@ -8,8 +8,7 @@
|
|
8
8
|
"silverstripe/installer" : "3.1.*@dev",
|
9
9
|
"silverstripe/bootstrap-forms" : "dev-master",
|
10
10
|
"silverstripe/html5" : "dev-master",
|
11
|
-
"silverstripe/widgets" : "dev-master"
|
12
|
-
"silverstripe/compass" : "dev-master"
|
11
|
+
"silverstripe/widgets" : "dev-master"
|
13
12
|
},
|
14
13
|
"extra": {
|
15
14
|
"installer-paths": {
|
@@ -17,14 +16,16 @@
|
|
17
16
|
],
|
18
17
|
"public/themes/{$name}": [
|
19
18
|
"silverstripe-themes/simple"
|
20
|
-
],
|
19
|
+
],
|
20
|
+
"public": [
|
21
|
+
"silverstripe/installer"
|
22
|
+
],
|
21
23
|
"public/{$name}": [
|
22
24
|
"silverstripe/framework",
|
23
25
|
"silverstripe/cms",
|
24
26
|
"silverstripe/bootstrap-forms",
|
25
27
|
"silverstripe/html5",
|
26
28
|
"silverstripe/widgets",
|
27
|
-
"silverstripe/compass"
|
28
29
|
]
|
29
30
|
}
|
30
31
|
}
|
@@ -33,26 +33,26 @@ every 1.day, :at => '11 pm' do
|
|
33
33
|
command "cd #{base_path} && export to=#{@environment} && bundle exec astrails-safe config/backup.rb"
|
34
34
|
end
|
35
35
|
|
36
|
-
every 15.minutes do
|
37
|
-
|
38
|
-
end
|
36
|
+
# every 15.minutes do
|
37
|
+
# command "php #{base_path}/public/framework/cli-script.php /QuarterlyHourlyTask"
|
38
|
+
# end
|
39
39
|
|
40
|
-
every 1.hour do
|
41
|
-
|
42
|
-
end
|
40
|
+
# every 1.hour do
|
41
|
+
# command "php #{base_path}/public/framework/cli-script.php /HourlyTask"
|
42
|
+
# end
|
43
43
|
|
44
|
-
every 1.day :at => '2am'.minutes do
|
45
|
-
|
46
|
-
end
|
44
|
+
# every 1.day :at => '2am'.minutes do
|
45
|
+
# command "php #{base_path}/public/framework/cli-script.php /DailyTask"
|
46
|
+
# end
|
47
47
|
|
48
|
-
every 1.week do
|
49
|
-
|
50
|
-
end
|
48
|
+
# every 1.week do
|
49
|
+
# command "php #{base_path}/public/framework/cli-script.php /WeeklyTask"
|
50
|
+
# end
|
51
51
|
|
52
|
-
every 1.month do
|
53
|
-
|
54
|
-
end
|
52
|
+
# every 1.month do
|
53
|
+
# command "php #{base_path}/public/framework/cli-script.php /MonthlyTask"
|
54
|
+
# end
|
55
55
|
|
56
|
-
every 1.year do
|
57
|
-
|
58
|
-
end
|
56
|
+
# every 1.year do
|
57
|
+
# command "php #{base_path}/public/framework/cli-script.php YearlyTask"
|
58
|
+
# end
|
@@ -36,7 +36,7 @@ $mail = (object) $cnf['mail']['smtp'][APPLICATION_ENV];
|
|
36
36
|
|
37
37
|
// file to url
|
38
38
|
$base_dir = __DIR__ . '/..';
|
39
|
-
$url =
|
39
|
+
$url = 'http://'.$cnf['apache'][APPLICATION_ENV]['server_name'];
|
40
40
|
$_FILE_TO_URL_MAPPING[$base_dir] = $url;
|
41
41
|
|
42
42
|
// Env specific settings
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bonethug
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
12
|
+
date: 2013-08-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -92,7 +92,7 @@ dependencies:
|
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: '0'
|
94
94
|
- !ruby/object:Gem::Dependency
|
95
|
-
name: sprockets
|
95
|
+
name: guard-sprockets
|
96
96
|
requirement: !ruby/object:Gem::Requirement
|
97
97
|
none: false
|
98
98
|
requirements:
|
@@ -107,6 +107,22 @@ dependencies:
|
|
107
107
|
- - ! '>='
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: wdm
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.1.0
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 0.1.0
|
110
126
|
description: Project Skeleton Manager
|
111
127
|
email:
|
112
128
|
- breaks.nz@gmail.com
|
@@ -123,20 +139,23 @@ files:
|
|
123
139
|
- Rakefile
|
124
140
|
- bin/bonethug
|
125
141
|
- bonethug.gemspec
|
142
|
+
- config/backup.rb
|
143
|
+
- config/cnf.yml
|
144
|
+
- config/deploy.rb
|
145
|
+
- config/schedule.rb
|
126
146
|
- lib/bonethug.rb
|
127
147
|
- lib/bonethug/cli.rb
|
148
|
+
- lib/bonethug/conf.rb
|
128
149
|
- lib/bonethug/installer.rb
|
129
150
|
- lib/bonethug/utils.rb
|
130
151
|
- lib/bonethug/version.rb
|
152
|
+
- lib/bonethug/watcher.rb
|
131
153
|
- lib/tasks/setup.rake
|
132
154
|
- skel/base/.gitignore
|
133
155
|
- skel/base/Gemfile
|
134
156
|
- skel/base/README.md
|
135
|
-
- skel/base/config/example
|
136
|
-
- skel/base/
|
137
|
-
- skel/base/config/example/deploy.rb
|
138
|
-
- skel/base/config/example/schedule.rb
|
139
|
-
- skel/base/lib/conf.rb
|
157
|
+
- skel/base/config/example/.gitkeep
|
158
|
+
- skel/base/lib/.gitkeep
|
140
159
|
- skel/base/log/.gitkeep
|
141
160
|
- skel/base/public/apple-touch-icon-114x114-precomposed.png
|
142
161
|
- skel/base/public/apple-touch-icon-72x72-precomposed.png
|
@@ -154,7 +173,6 @@ files:
|
|
154
173
|
- skel/project_types/php/composer.json
|
155
174
|
- skel/project_types/silverstripe3/.gitignore
|
156
175
|
- skel/project_types/silverstripe3/composer.json
|
157
|
-
- skel/project_types/silverstripe3/config.ru
|
158
176
|
- skel/project_types/silverstripe3/config/example/schedule.rb
|
159
177
|
- skel/project_types/silverstripe3/public/.htaccess
|
160
178
|
- skel/project_types/silverstripe3/public/abc/_config.php
|
data/skel/base/lib/conf.rb
DELETED
@@ -1,275 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
|
3
|
-
class Conf
|
4
|
-
|
5
|
-
@@default_paths = {
|
6
|
-
File.expand_path(File.dirname(__FILE__)) + '/../config/cnf.yml' => nil,
|
7
|
-
File.expand_path(File.dirname(__FILE__)) + '/../config/database.yml' => {root: 'dbs.default'}
|
8
|
-
}
|
9
|
-
@@fallbacks = {
|
10
|
-
'name' => 'database',
|
11
|
-
'user' => 'username',
|
12
|
-
'pass' => 'password'
|
13
|
-
}
|
14
|
-
|
15
|
-
def initialize(new_hash = nil, options = {})
|
16
|
-
raise "New hash must be of type Hash" if new_hash && new_hash.class.name != 'Hash'
|
17
|
-
@options = {use_fallbacks: true}.merge options
|
18
|
-
@loaded_paths = []
|
19
|
-
@paths = {}
|
20
|
-
@config_hashes = {}
|
21
|
-
@compiled_hash = new_hash ? new_hash : {}
|
22
|
-
end
|
23
|
-
|
24
|
-
def add_path(new_path)
|
25
|
-
if new_path.class.name == 'Hash'
|
26
|
-
path_hash = new_path
|
27
|
-
elsif new_path.class.name == 'String'
|
28
|
-
path_hash = {new_path => nil}
|
29
|
-
else
|
30
|
-
raise "add_path only accepts stings or hashes"
|
31
|
-
end
|
32
|
-
@paths = @paths.merge path_hash
|
33
|
-
self
|
34
|
-
end
|
35
|
-
|
36
|
-
def remove_path(path_to_remove)
|
37
|
-
# deletes an element from a hash if its key can be found
|
38
|
-
@paths.delete path_to_remove
|
39
|
-
self
|
40
|
-
end
|
41
|
-
|
42
|
-
def compile_configuration
|
43
|
-
|
44
|
-
# load the defaults if we haven't loaded anything
|
45
|
-
use_defaults if @paths.empty?
|
46
|
-
|
47
|
-
# generate output
|
48
|
-
out = {}
|
49
|
-
@paths.each do |path,options|
|
50
|
-
|
51
|
-
# load the file if we haven't already
|
52
|
-
load_path path unless @loaded_paths.include? path
|
53
|
-
|
54
|
-
# create a base fragment
|
55
|
-
fragment_base = {}
|
56
|
-
|
57
|
-
# create the other nodes
|
58
|
-
if options and options.has_key? :root
|
59
|
-
fragment = fragment_base
|
60
|
-
nodes = options[:root].split '.'
|
61
|
-
nodes.each_with_index do |node,i|
|
62
|
-
fragment[node] = i == nodes.length-1 ? @config_hashes[path] : {}
|
63
|
-
fragment = fragment[node]
|
64
|
-
end
|
65
|
-
else
|
66
|
-
fragment_base = @config_hashes[path]
|
67
|
-
end
|
68
|
-
|
69
|
-
# output
|
70
|
-
out = out.merge fragment_base
|
71
|
-
|
72
|
-
end
|
73
|
-
@compiled_hash = out
|
74
|
-
self
|
75
|
-
|
76
|
-
end
|
77
|
-
|
78
|
-
def all_paths_loaded?
|
79
|
-
@paths.each do |path,options|
|
80
|
-
return false unless @loaded_paths.include? path
|
81
|
-
end
|
82
|
-
true
|
83
|
-
end
|
84
|
-
|
85
|
-
def path_ok?(path)
|
86
|
-
path && path.class.name == 'String' and File.exist?(path) and File.file?(path)
|
87
|
-
end
|
88
|
-
|
89
|
-
def check_path!(path)
|
90
|
-
raise 'config file "' + path.to_s + '" does not exist' unless path_ok? path
|
91
|
-
end
|
92
|
-
|
93
|
-
def check_paths!
|
94
|
-
raise 'No config files have not been set' if @paths.empty?
|
95
|
-
@paths.each do |path,options|
|
96
|
-
check_path! path
|
97
|
-
end
|
98
|
-
self
|
99
|
-
end
|
100
|
-
|
101
|
-
def check_paths
|
102
|
-
@paths.each do |path,options|
|
103
|
-
@paths.delete path unless path_ok? path
|
104
|
-
end
|
105
|
-
self
|
106
|
-
end
|
107
|
-
|
108
|
-
def load_paths
|
109
|
-
@paths.each do |path,options|
|
110
|
-
load_path path
|
111
|
-
end
|
112
|
-
self
|
113
|
-
end
|
114
|
-
|
115
|
-
def load_path(path)
|
116
|
-
load_path? path
|
117
|
-
self
|
118
|
-
end
|
119
|
-
|
120
|
-
def load_path?(path)
|
121
|
-
return false unless path_ok? path
|
122
|
-
@loaded_paths.push path
|
123
|
-
@config_hashes[path] = YAML.load_file path
|
124
|
-
self
|
125
|
-
end
|
126
|
-
|
127
|
-
def use_defaults
|
128
|
-
@paths = @@default_paths if @paths.empty?
|
129
|
-
load_paths
|
130
|
-
self
|
131
|
-
end
|
132
|
-
|
133
|
-
def get(node = nil, force_type = nil)
|
134
|
-
node_val = node ? get_compiled_hash_node_handle(node) : self
|
135
|
-
case force_type
|
136
|
-
when 'Array'
|
137
|
-
return [] unless node_val
|
138
|
-
return node_val.class.name == 'Array' ? node_val.clone : node_val.to_a
|
139
|
-
when 'Hash'
|
140
|
-
return {} unless node_val
|
141
|
-
if node_val.class.name == 'Array'
|
142
|
-
return array2hash node_val
|
143
|
-
elsif node_val.class.name == 'Hash'
|
144
|
-
return node_val.clone
|
145
|
-
else
|
146
|
-
return node_val.to_hash
|
147
|
-
end
|
148
|
-
else
|
149
|
-
return handle_node_value node_val
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
def has_key?(key)
|
154
|
-
compiled_hash.has_key? key
|
155
|
-
end
|
156
|
-
|
157
|
-
def get_compiled_hash_node_handle(node = nil)
|
158
|
-
if node
|
159
|
-
nodes = node.split('.')
|
160
|
-
current = compiled_hash
|
161
|
-
nodes.each do |node|
|
162
|
-
node = @@fallbacks[node] if @options[:use_fallbacks] and !current[node] and @@fallbacks[node]
|
163
|
-
current = (current.class.name == 'Hash' or current.class.name == 'Array') ? current[node] : nil
|
164
|
-
end
|
165
|
-
return current
|
166
|
-
else
|
167
|
-
return self.compiled_hash
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
def handle_node_value(node)
|
172
|
-
return node if node.class.name == 'Conf'
|
173
|
-
node = array2hash node if node.class.name == 'Array'
|
174
|
-
return node.class.name == 'Hash' ? self.clone.set_compiled_hash(node) : node
|
175
|
-
end
|
176
|
-
|
177
|
-
def array2hash(arr)
|
178
|
-
return arr if arr.class.name == 'Hash'
|
179
|
-
hsh = {}
|
180
|
-
arr.each_with_index do |item,i|
|
181
|
-
hsh[i] = item
|
182
|
-
end
|
183
|
-
hsh
|
184
|
-
end
|
185
|
-
|
186
|
-
def get_hash(node = nil)
|
187
|
-
get(node).compiled_hash
|
188
|
-
end
|
189
|
-
|
190
|
-
def to_hash
|
191
|
-
compiled_hash.clone
|
192
|
-
end
|
193
|
-
|
194
|
-
def to_a
|
195
|
-
to_hash.to_a
|
196
|
-
end
|
197
|
-
|
198
|
-
def node_merge!(node1,node2)
|
199
|
-
cnf1 = get_compiled_hash_node_handle node1
|
200
|
-
cnf2 = get_compiled_hash_node_handle node2
|
201
|
-
cnf1.merge!(cnf2) if cnf1 && cnf2
|
202
|
-
return self
|
203
|
-
end
|
204
|
-
|
205
|
-
def node_merge(node1,node2)
|
206
|
-
cnf1 = get_compiled_hash_node_handle node1
|
207
|
-
cnf2 = get_compiled_hash_node_handle node2
|
208
|
-
return handle_node_value cnf1 if cnf1 && !cnf2
|
209
|
-
return handle_node_value cnf1 if cnf2 && !cnf1
|
210
|
-
return handle_node_value cnf1.merge(cnf2) if cnf1 && cnf2
|
211
|
-
end
|
212
|
-
|
213
|
-
def merge(node)
|
214
|
-
return self unless node
|
215
|
-
return handle_node_value compiled_hash.merge(node.to_hash)
|
216
|
-
end
|
217
|
-
|
218
|
-
def each
|
219
|
-
compiled_hash.each do |k,v|
|
220
|
-
yield k,handle_node_value(v)
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
# Getters and Setters
|
225
|
-
# -------------------
|
226
|
-
|
227
|
-
def paths=(new_paths)
|
228
|
-
raise "paths must be a hash" unless new_hash.class.name == 'Hash'
|
229
|
-
@paths = new_paths
|
230
|
-
end
|
231
|
-
|
232
|
-
def paths
|
233
|
-
@paths
|
234
|
-
end
|
235
|
-
|
236
|
-
def config_hashes
|
237
|
-
@config_hashes
|
238
|
-
end
|
239
|
-
|
240
|
-
def compiled_hash
|
241
|
-
compile_configuration if @compiled_hash.empty?
|
242
|
-
@compiled_hash
|
243
|
-
end
|
244
|
-
|
245
|
-
def compiled_hash=(new_hash)
|
246
|
-
raise "compiled hash must be a hash" unless new_hash.class.name == 'Hash'
|
247
|
-
@compiled_hash = new_hash
|
248
|
-
end
|
249
|
-
|
250
|
-
def set_compiled_hash(new_hash)
|
251
|
-
raise "compiled hash must be a hash" unless new_hash.class.name == 'Hash'
|
252
|
-
@compiled_hash = new_hash
|
253
|
-
self
|
254
|
-
end
|
255
|
-
|
256
|
-
# Method Aliases
|
257
|
-
# --------------
|
258
|
-
|
259
|
-
def a2h(arr)
|
260
|
-
array2hash arr
|
261
|
-
end
|
262
|
-
|
263
|
-
def to_hash
|
264
|
-
compiled_hash
|
265
|
-
end
|
266
|
-
|
267
|
-
def add(new_path)
|
268
|
-
add_path new_path
|
269
|
-
end
|
270
|
-
|
271
|
-
def remove(path_to_remove)
|
272
|
-
remove_path path_to_remove
|
273
|
-
end
|
274
|
-
|
275
|
-
end
|