nucleon 0.1.0 → 0.1.1

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.
Files changed (62) hide show
  1. data/Gemfile +4 -8
  2. data/Gemfile.lock +0 -28
  3. data/README.rdoc +13 -5
  4. data/Rakefile +9 -1
  5. data/VERSION +1 -1
  6. data/bin/nucleon +55 -0
  7. data/lib/core/codes.rb +107 -0
  8. data/lib/core/config/collection.rb +57 -0
  9. data/lib/core/config/options.rb +70 -0
  10. data/lib/core/config.rb +342 -0
  11. data/lib/core/core.rb +54 -0
  12. data/lib/core/errors.rb +84 -0
  13. data/lib/core/facade.rb +283 -0
  14. data/lib/core/gems.rb +80 -0
  15. data/lib/core/manager.rb +594 -0
  16. data/lib/core/mixin/action/commit.rb +58 -0
  17. data/lib/core/mixin/action/project.rb +53 -0
  18. data/lib/core/mixin/action/push.rb +52 -0
  19. data/lib/core/mixin/config/collection.rb +53 -0
  20. data/lib/core/mixin/config/options.rb +39 -0
  21. data/lib/core/mixin/macro/object_interface.rb +361 -0
  22. data/lib/core/mixin/macro/plugin_interface.rb +380 -0
  23. data/lib/core/mixin/settings.rb +46 -0
  24. data/lib/core/mixin/sub_config.rb +148 -0
  25. data/lib/core/mod/hash.rb +29 -0
  26. data/lib/core/plugin/action.rb +371 -0
  27. data/lib/core/plugin/base.rb +313 -0
  28. data/lib/core/plugin/command.rb +98 -0
  29. data/lib/core/plugin/event.rb +53 -0
  30. data/lib/core/plugin/extension.rb +12 -0
  31. data/lib/core/plugin/project.rb +890 -0
  32. data/lib/core/plugin/template.rb +80 -0
  33. data/lib/core/plugin/translator.rb +38 -0
  34. data/lib/core/util/cli.rb +353 -0
  35. data/lib/core/util/console.rb +237 -0
  36. data/lib/core/util/data.rb +404 -0
  37. data/lib/core/util/disk.rb +114 -0
  38. data/lib/core/util/git.rb +43 -0
  39. data/lib/core/util/liquid.rb +17 -0
  40. data/lib/core/util/logger.rb +147 -0
  41. data/lib/core/util/package.rb +93 -0
  42. data/lib/core/util/shell.rb +239 -0
  43. data/lib/nucleon/action/add.rb +69 -0
  44. data/lib/nucleon/action/create.rb +52 -0
  45. data/lib/nucleon/action/extract.rb +49 -0
  46. data/lib/nucleon/action/remove.rb +51 -0
  47. data/lib/nucleon/action/save.rb +53 -0
  48. data/lib/nucleon/action/update.rb +37 -0
  49. data/lib/nucleon/command/bash.rb +146 -0
  50. data/lib/nucleon/event/regex.rb +52 -0
  51. data/lib/nucleon/project/git.rb +465 -0
  52. data/lib/nucleon/project/github.rb +108 -0
  53. data/lib/nucleon/template/json.rb +16 -0
  54. data/lib/nucleon/template/wrapper.rb +16 -0
  55. data/lib/nucleon/template/yaml.rb +16 -0
  56. data/lib/nucleon/translator/json.rb +27 -0
  57. data/lib/nucleon/translator/yaml.rb +27 -0
  58. data/lib/nucleon.rb +18 -15
  59. data/locales/en.yml +3 -132
  60. data/nucleon.gemspec +66 -27
  61. data/spec/core/util/console_spec.rb +489 -0
  62. metadata +109 -96
@@ -0,0 +1,283 @@
1
+
2
+ module Nucleon
3
+
4
+ VERSION = File.read(File.join(File.dirname(__FILE__), '..', '..', 'VERSION'))
5
+
6
+ #-----------------------------------------------------------------------------
7
+
8
+ def self.ui
9
+ Core.ui
10
+ end
11
+
12
+ def self.quiet=quiet
13
+ Util::Console.quiet = quiet
14
+ end
15
+
16
+ #---
17
+
18
+ def self.logger
19
+ Core.logger
20
+ end
21
+
22
+ def self.log_level
23
+ Util::Logger.level
24
+ end
25
+
26
+ def self.log_level=log_level
27
+ Util::Logger.level = log_level
28
+ end
29
+
30
+ #-----------------------------------------------------------------------------
31
+
32
+ def self.admin?
33
+ is_admin = ( ENV['USER'] == 'root' )
34
+ ext_admin = exec(:check_admin) do |op, results|
35
+ if op == :reduce
36
+ results.values.include?(true)
37
+ else
38
+ results ? true : false
39
+ end
40
+ end
41
+ is_admin || ext_admin ? true : false
42
+ end
43
+
44
+ #-----------------------------------------------------------------------------
45
+ # Status codes
46
+
47
+ @@codes = Codes.new
48
+
49
+ def self.code
50
+ @@codes
51
+ end
52
+
53
+ def self.codes(*codes)
54
+ Codes.codes(*codes)
55
+ end
56
+
57
+ #-----------------------------------------------------------------------------
58
+ # Core plugin interface
59
+
60
+ def self.reload
61
+ Manager.connection.reload
62
+ end
63
+
64
+ #---
65
+
66
+ def self.types
67
+ Manager.connection.types
68
+ end
69
+
70
+ def self.define_type(type_info)
71
+ Manager.connection.define_type(type_info)
72
+ end
73
+
74
+ def self.type_default(type)
75
+ Manager.connection.type_default(type)
76
+ end
77
+
78
+ #---
79
+
80
+ def self.register(base_path, &code)
81
+ Manager.connection.register(base_path, &code)
82
+ Manager.connection.autoload
83
+ end
84
+
85
+ def self.loaded_plugins(type = nil, provider = nil)
86
+ Manager.connection.loaded_plugins(type, provider)
87
+ end
88
+
89
+ #---
90
+
91
+ def self.active_plugins(type = nil, provider = nil)
92
+ Manager.connection.plugins(type, provider)
93
+ end
94
+
95
+ #---
96
+
97
+ def self.plugin(type, provider, options = {})
98
+ Manager.connection.load(type, provider, options)
99
+ end
100
+
101
+ #---
102
+
103
+ def self.plugins(type, data, build_hash = false, keep_array = false)
104
+ Manager.connection.load_multiple(type, data, build_hash, keep_array)
105
+ end
106
+
107
+ #---
108
+
109
+ def self.get_plugin(type, name)
110
+ Manager.connection.get(type, name)
111
+ end
112
+
113
+ #---
114
+
115
+ def self.remove_plugin(plugin)
116
+ Manager.connection.remove(plugin)
117
+ end
118
+
119
+ #-----------------------------------------------------------------------------
120
+ # Core plugin type facade
121
+
122
+ def self.extension(provider)
123
+ plugin(:extension, provider, {})
124
+ end
125
+
126
+ #---
127
+
128
+ def self.action(provider, options)
129
+ plugin(:action, provider, options)
130
+ end
131
+
132
+ def self.actions(data, build_hash = false, keep_array = false)
133
+ plugins(:action, data, build_hash, keep_array)
134
+ end
135
+
136
+ def self.action_config(provider)
137
+ action(provider, { :settings => {}, :quiet => true }).configure
138
+ end
139
+
140
+ def self.action_run(provider, options = {}, quiet = true)
141
+ Plugin::Action.exec(provider, options, quiet)
142
+ end
143
+
144
+ def self.action_cli(provider, args = [], quiet = false)
145
+ Plugin::Action.exec_cli(provider, args, quiet)
146
+ end
147
+
148
+ #---
149
+
150
+ def self.project(options, provider = nil)
151
+ plugin(:project, provider, options)
152
+ end
153
+
154
+ def self.projects(data, build_hash = false, keep_array = false)
155
+ plugins(:project, data, build_hash, keep_array)
156
+ end
157
+
158
+ #-----------------------------------------------------------------------------
159
+ # Utility plugin type facade
160
+
161
+ def self.command(options, provider = nil)
162
+ plugin(:command, provider, options)
163
+ end
164
+
165
+ def self.commands(data, build_hash = false, keep_array = false)
166
+ plugins(:command, data, build_hash, keep_array)
167
+ end
168
+
169
+ #---
170
+
171
+ def self.event(options, provider = nil)
172
+ plugin(:event, provider, options)
173
+ end
174
+
175
+ def self.events(data, build_hash = false, keep_array = false)
176
+ plugins(:event, data, build_hash, keep_array)
177
+ end
178
+
179
+ #---
180
+
181
+ def self.template(options, provider = nil)
182
+ plugin(:template, provider, options)
183
+ end
184
+
185
+ def self.templates(data, build_hash = false, keep_array = false)
186
+ plugins(:template, data, build_hash, keep_array)
187
+ end
188
+
189
+ #---
190
+
191
+ def self.translator(options, provider = nil)
192
+ plugin(:translator, provider, options)
193
+ end
194
+
195
+ def self.translators(data, build_hash = false, keep_array = false)
196
+ plugins(:translator, data, build_hash, keep_array)
197
+ end
198
+
199
+ #-----------------------------------------------------------------------------
200
+ # Plugin extensions
201
+
202
+ def self.exec(method, options = {}, &code)
203
+ Manager.connection.exec(method, options, &code)
204
+ end
205
+
206
+ #---
207
+
208
+ def self.config(type, options = {})
209
+ Manager.connection.config(method, options)
210
+ end
211
+
212
+ #---
213
+
214
+ def self.check(method, options = {})
215
+ Manager.connection.check(method, options)
216
+ end
217
+
218
+ #---
219
+
220
+ def self.value(method, value, options = {})
221
+ Manager.connection.value(method, value, options)
222
+ end
223
+
224
+ #---
225
+
226
+ def self.collect(method, options = {})
227
+ Manager.connection.collect(method, options)
228
+ end
229
+
230
+ #-----------------------------------------------------------------------------
231
+ # External execution
232
+
233
+ def self.run
234
+ begin
235
+ logger.debug("Running contained process at #{Time.now}")
236
+ yield
237
+
238
+ rescue Exception => error
239
+ logger.error("Nucleon run experienced an error! Details:")
240
+ logger.error(error.inspect)
241
+ logger.error(error.message)
242
+ logger.error(Util::Data.to_yaml(error.backtrace))
243
+
244
+ ui.error(error.message) if error.message
245
+ raise
246
+ end
247
+ end
248
+
249
+ #---
250
+
251
+ def self.cli_run(command, options = {}, &code)
252
+ command = command.join(' ') if command.is_a?(Array)
253
+ config = Config.ensure(options)
254
+
255
+ logger.info("Executing command #{command}")
256
+
257
+ result = Util::Shell.connection.exec(command, config, &code)
258
+
259
+ unless result.status == Nucleon.code.success
260
+ ui.error("Command #{command} failed to execute")
261
+ end
262
+ result
263
+ end
264
+
265
+ #-----------------------------------------------------------------------------
266
+ # Utilities
267
+
268
+ def self.class_name(name, separator = '::', want_array = false)
269
+ Manager.connection.class_name(name, separator, want_array)
270
+ end
271
+
272
+ #---
273
+
274
+ def self.class_const(name, separator = '::')
275
+ Manager.connection.class_const(name, separator)
276
+ end
277
+
278
+ #---
279
+
280
+ def self.sha1(data)
281
+ Digest::SHA1.hexdigest(Util::Data.to_json(data, false))
282
+ end
283
+ end
data/lib/core/gems.rb ADDED
@@ -0,0 +1,80 @@
1
+
2
+ module Nucleon
3
+ module Gems
4
+
5
+ #-----------------------------------------------------------------------------
6
+
7
+ @@core = nil
8
+ @@gems = {}
9
+
10
+ #-----------------------------------------------------------------------------
11
+ # Gem interface
12
+
13
+ def self.logger
14
+ Core.logger
15
+ end
16
+
17
+ #---
18
+
19
+ def self.core
20
+ @@core
21
+ end
22
+
23
+ #---
24
+
25
+ def self.registered
26
+ @@gems
27
+ end
28
+
29
+ #---
30
+
31
+ def self.register(reset = false)
32
+ if reset || Util::Data.empty?(@@gems)
33
+ logger.info("Registering external gem defined Nucleon plugins at #{Time.now}")
34
+
35
+ if defined?(Gem)
36
+ if ! defined?(Bundler) && Gem::Specification.respond_to?(:latest_specs)
37
+ logger.debug("Not using bundler")
38
+ Gem::Specification.latest_specs(true).each do |spec|
39
+ register_gem(spec)
40
+ end
41
+ else
42
+ logger.debug("Using bundler or Gem specification without latest_specs")
43
+ Gem.loaded_specs.each do |name, spec|
44
+ register_gem(spec)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ @@gems
50
+ end
51
+
52
+ #---
53
+
54
+ def self.register_gem(spec)
55
+ name = spec.name
56
+ base_path = File.join(spec.full_gem_path, 'lib')
57
+
58
+ Manager.connection.register(base_path) do |data|
59
+ namespace = data[:namespace]
60
+ plugin_path = data[:directory]
61
+
62
+ logger.info("Registering gem #{name} at #{plugin_path} at #{Time.now}")
63
+
64
+ unless @@gems.has_key?(name)
65
+ @@gems[name] = {
66
+ :spec => spec,
67
+ :base_path => base_path,
68
+ :namespaces => []
69
+ }
70
+ end
71
+ @@gems[name][:namespaces] << namespace unless @@gems[name][:namespaces].include?(namespace)
72
+
73
+ if name == 'nucleon'
74
+ logger.debug("Setting Nucleon core gemspec")
75
+ @@core = spec
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end