nucleon 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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
data/Gemfile CHANGED
@@ -2,18 +2,14 @@ source "http://rubygems.org"
2
2
 
3
3
  gem "log4r", "~> 1.1"
4
4
  gem "i18n", "~> 0.6"
5
+ gem "rgen", "~> 0.6"
6
+ gem "netrc", "~> 0.7"
5
7
  gem "deep_merge", "~> 1.0"
6
- gem "celluloid", "~> 0.15"
7
- gem "sshkey", "~> 1.6"
8
- gem "hiera", "~> 1.3"
8
+
9
9
  gem "multi_json", "~> 1.7"
10
10
  gem "grit", "~> 2.5"
11
11
  gem "octokit", "~> 2.7"
12
- gem "netrc", "~> 0.7"
13
- gem "fog", "~> 1.20"
14
- gem "rgen", "~> 0.6"
15
- gem "facter", "~> 1.7"
16
- gem "puppet", "~> 3.2"
12
+ gem "celluloid", "~> 0.15"
17
13
 
18
14
  group :development do
19
15
  gem "bundler", "~> 1.2"
data/Gemfile.lock CHANGED
@@ -8,20 +8,8 @@ GEM
8
8
  deep_merge (1.0.1)
9
9
  descendants_tracker (0.0.3)
10
10
  diff-lcs (1.2.5)
11
- excon (0.31.0)
12
- facter (1.7.5)
13
11
  faraday (0.9.0)
14
12
  multipart-post (>= 1.2, < 3)
15
- fog (1.20.0)
16
- builder
17
- excon (~> 0.31.0)
18
- formatador (~> 0.2.0)
19
- mime-types
20
- multi_json (~> 1.0)
21
- net-scp (~> 1.1)
22
- net-ssh (>= 2.1.3)
23
- nokogiri (>= 1.5.11)
24
- formatador (0.2.4)
25
13
  git (1.2.6)
26
14
  github_api (0.11.2)
27
15
  addressable (~> 2.3)
@@ -36,8 +24,6 @@ GEM
36
24
  mime-types (~> 1.15)
37
25
  posix-spawn (~> 0.3.6)
38
26
  hashie (2.0.5)
39
- hiera (1.3.1)
40
- json_pure
41
27
  highline (1.6.20)
42
28
  i18n (0.6.9)
43
29
  jeweler (2.0.1)
@@ -50,7 +36,6 @@ GEM
50
36
  rake
51
37
  rdoc
52
38
  json (1.8.1)
53
- json_pure (1.8.1)
54
39
  jwt (0.1.11)
55
40
  multi_json (>= 1.5)
56
41
  log4r (1.1.10)
@@ -59,9 +44,6 @@ GEM
59
44
  multi_json (1.8.4)
60
45
  multi_xml (0.5.5)
61
46
  multipart-post (2.0.0)
62
- net-scp (1.1.2)
63
- net-ssh (>= 2.6.5)
64
- net-ssh (2.8.0)
65
47
  netrc (0.7.7)
66
48
  nokogiri (1.6.1)
67
49
  mini_portile (~> 0.5.0)
@@ -74,10 +56,6 @@ GEM
74
56
  octokit (2.7.1)
75
57
  sawyer (~> 0.5.2)
76
58
  posix-spawn (0.3.8)
77
- puppet (3.4.3)
78
- facter (~> 1.6)
79
- hiera (~> 1.0)
80
- rgen (~> 0.6.5)
81
59
  rack (1.5.2)
82
60
  rake (10.1.1)
83
61
  rdoc (3.12.2)
@@ -94,7 +72,6 @@ GEM
94
72
  sawyer (0.5.3)
95
73
  addressable (~> 2.3.5)
96
74
  faraday (~> 0.8, < 0.10)
97
- sshkey (1.6.1)
98
75
  timers (1.1.0)
99
76
  yard (0.8.7.3)
100
77
 
@@ -105,19 +82,14 @@ DEPENDENCIES
105
82
  bundler (~> 1.2)
106
83
  celluloid (~> 0.15)
107
84
  deep_merge (~> 1.0)
108
- facter (~> 1.7)
109
- fog (~> 1.20)
110
85
  grit (~> 2.5)
111
- hiera (~> 1.3)
112
86
  i18n (~> 0.6)
113
87
  jeweler (~> 2.0)
114
88
  log4r (~> 1.1)
115
89
  multi_json (~> 1.7)
116
90
  netrc (~> 0.7)
117
91
  octokit (~> 2.7)
118
- puppet (~> 3.2)
119
92
  rdoc (~> 3.12)
120
93
  rgen (~> 0.6)
121
94
  rspec (~> 2.10)
122
- sshkey (~> 1.6)
123
95
  yard (~> 0.8)
data/README.rdoc CHANGED
@@ -1,9 +1,17 @@
1
- = coral_gem
1
+ = Nucleon
2
2
 
3
- This gem provides starter scaffolding for further development. It is
4
- scaffolding but it is functional.
3
+ A framework that provides a simple foundation for building apps that are:
5
4
 
6
- == Contributing to coral_gem
5
+ 1. Distributively configured
6
+ 2. Extremely pluggable and extendable
7
+ 3. Easily parallel
8
+
9
+ More coming soon!
10
+
11
+ Note: This library is still very early in development!
12
+
13
+
14
+ == Contributing to Nucleon
7
15
 
8
16
  * Check out the latest {major}.{minor} branch to make sure the feature hasn't
9
17
  been implemented or the bug hasn't been fixed yet.
@@ -22,5 +30,5 @@ scaffolding but it is functional.
22
30
 
23
31
  Licensed under GPLv3. See LICENSE.txt for further details.
24
32
 
25
- Copyright (c) 2013 Adrian Webb <adrian.webb@coraltech.net>
33
+ Copyright (c) 2014 Adrian Webb <adrian.webb@coralnexus.com>
26
34
  Coral Technology Group LLC
data/Rakefile CHANGED
@@ -33,7 +33,15 @@ Jeweler::Tasks.new do |gem|
33
33
  gem.email = "adrian.webb@coralnexus.com"
34
34
  gem.authors = ["Adrian Webb"]
35
35
  gem.summary = %Q{Framework that provides a simple foundation for building distributively configured, extremely pluggable and extendable, and easily parallel Ruby applications}
36
- gem.description = %Q{Framework that provides a simple foundation for building distributively configured, extremely pluggable and extendable, and easily parallel Ruby applications}
36
+ gem.description = %Q{
37
+ A framework that provides a simple foundation for building Ruby applications that are:
38
+
39
+ * Highly configurable (with both distributed and persistent configurations)
40
+ * Extremely pluggable and extendable
41
+ * Easily parallel
42
+
43
+ Note: This framework is still very early in development!
44
+ }
37
45
  gem.required_ruby_version = '>= 1.8.1'
38
46
  gem.has_rdoc = true
39
47
  gem.rdoc_options << '--title' << 'Nucleon' <<
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
data/bin/nucleon ADDED
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ Signal.trap("INT") { exit 1 }
4
+
5
+ #---
6
+
7
+ require 'nucleon'
8
+
9
+ logger = Nucleon.logger
10
+ logger.info("`nucleon` invoked: #{ARGV.inspect}")
11
+
12
+ #---
13
+
14
+ $stdout.sync = true
15
+ $stderr.sync = true
16
+
17
+ #---
18
+
19
+ begin
20
+ logger.debug("Beginning execution run")
21
+
22
+ arg_components = Nucleon::Util::CLI::Parser.split(ARGV, 'nucleon <action> [ <arg> ... ]')
23
+ main_command = arg_components.shift
24
+ sub_command = arg_components.shift
25
+ sub_args = arg_components
26
+
27
+ if main_command.processed && sub_command
28
+ exit_status = Nucleon.action_cli(sub_command, sub_args)
29
+ else
30
+ puts I18n.t('nucleon.core.exec.help.usage') + ': ' + main_command.help + "\n"
31
+ puts I18n.t('nucleon.core.exec.help.header') + ":\n\n"
32
+
33
+ Nucleon.loaded_plugins(:action).each do |provider, action|
34
+ puts sprintf(" %-10s : %s\n",
35
+ "<#{provider}>",
36
+ Nucleon.action(provider, { :settings => {}, :quiet => true }).help
37
+ )
38
+ end
39
+
40
+ puts "\n" + I18n.t('nucleon.core.exec.help.footer') + "\n\n"
41
+ exit_status = Nucleon.code.help_wanted
42
+ end
43
+
44
+ rescue Exception => error
45
+ logger.error("Nucleon executable experienced an error:")
46
+ logger.error(error.inspect)
47
+ logger.error(error.message)
48
+ logger.error(Nucleon::Util::Data.to_yaml(error.backtrace))
49
+
50
+ Nucleon.ui.error(error.message, { :prefix => false }) if error.message
51
+
52
+ exit_status = error.status_code if error.respond_to?(:status_code)
53
+ end
54
+
55
+ exit(exit_status)
data/lib/core/codes.rb ADDED
@@ -0,0 +1,107 @@
1
+
2
+ module Nucleon
3
+ class Codes
4
+
5
+ #-----------------------------------------------------------------------------
6
+ # Code index
7
+
8
+ @@registry = {}
9
+ @@status_index = {}
10
+ @@next_code = 0
11
+
12
+ #---
13
+
14
+ def self.registry
15
+ @@registry
16
+ end
17
+
18
+ #---
19
+
20
+ def self.index(status_code = nil)
21
+ if status_code.nil? || ! status_code.integer?
22
+ @@status_index
23
+ else
24
+ status_code = status_code.to_i
25
+
26
+ if @@status_index.has_key?(status_code)
27
+ @@status_index[status_code]
28
+ else
29
+ @@status_index[registry[:unknown_status]]
30
+ end
31
+ end
32
+ end
33
+
34
+ #---
35
+
36
+ def self.render_index(status_code = nil)
37
+ output = "Status index:\n"
38
+ @@status_index.each do |code, name|
39
+ name = name.gsub(/_/, ' ').capitalize
40
+
41
+ if ! status_code.nil? && status_code == code
42
+ output << sprintf(" [ %3i ] - %s\n", code, name)
43
+ else
44
+ output << sprintf(" %3i - %s\n", code, name)
45
+ end
46
+ end
47
+ output << "\n"
48
+ output
49
+ end
50
+
51
+ #-----------------------------------------------------------------------------
52
+ # Code construction
53
+
54
+ def self.code(name)
55
+ name = name.to_sym
56
+
57
+ unless registry.has_key?(name)
58
+ status_code = @@next_code
59
+ @@next_code = @@next_code + 1
60
+
61
+ # TODO: Add more information to the index (like a help message)
62
+ @@registry[name] = status_code
63
+ @@status_index[status_code] = name.to_s
64
+ end
65
+ end
66
+
67
+ #---
68
+
69
+ def self.codes(*codes)
70
+ codes.each do |name|
71
+ code(name)
72
+ end
73
+ end
74
+
75
+ #-----------------------------------------------------------------------------
76
+ # Return status codes on demand
77
+
78
+ def [](name)
79
+ name = name.to_sym
80
+
81
+ if @@registry.has_key?(name)
82
+ @@registry[name]
83
+ else
84
+ @@registry[:unknown_status]
85
+ end
86
+ end
87
+
88
+ #---
89
+
90
+ def method_missing(method, *args, &block)
91
+ self[method]
92
+ end
93
+
94
+ #-----------------------------------------------------------------------------
95
+ # Core status codes
96
+
97
+ code(:success) # This must be added first (needs to be 0)
98
+ code(:help_wanted)
99
+ code(:unknown_status)
100
+
101
+ code(:action_unprocessed)
102
+ code(:batch_error)
103
+
104
+ code(:validation_failed)
105
+ code(:access_denied)
106
+ end
107
+ end
@@ -0,0 +1,57 @@
1
+
2
+ module Nucleon
3
+ class Config
4
+ class Collection
5
+
6
+ #-----------------------------------------------------------------------------
7
+ # Property accessor / modifiers
8
+
9
+ @@properties = {}
10
+
11
+ #---
12
+
13
+ def self.all
14
+ return @@properties
15
+ end
16
+
17
+ #---
18
+
19
+ def self.get(name)
20
+ return @@properties[name.to_sym]
21
+ end
22
+
23
+ #---
24
+
25
+ def self.set(name, value)
26
+ @@properties[name.to_sym] = value
27
+ end
28
+
29
+ #---
30
+
31
+ def self.delete(name)
32
+ @@properties.delete(name.to_sym)
33
+ end
34
+
35
+ #---
36
+
37
+ def self.clear
38
+ @@properties = {}
39
+ end
40
+
41
+ #---
42
+
43
+ def self.save
44
+ log_options = Options.get(:nucleon_log)
45
+
46
+ unless Util::Data.empty?(log_options[:config_log])
47
+ config_log = log_options[:config_log]
48
+
49
+ if log_options[:config_store]
50
+ Util::Disk.write(config_log, MultiJson.dump(@@properties, :pretty => true))
51
+ Util::Disk.close(config_log)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,70 @@
1
+
2
+ module Nucleon
3
+ class Config
4
+ class Options
5
+
6
+ #-----------------------------------------------------------------------------
7
+ # Property accessors / modifiers
8
+
9
+ @@options = {}
10
+
11
+ #---
12
+
13
+ def self.contexts(contexts = [], hierarchy = [])
14
+ contexts = [ 'all', contexts ].flatten
15
+
16
+ unless hierarchy.is_a?(Array)
17
+ hierarchy = ( ! Util::Data.empty?(hierarchy) ? [ hierarchy ].flatten : [] )
18
+ end
19
+
20
+ hierarchy.each do |group|
21
+ group_contexts = Util::Data.prefix(group, contexts)
22
+ contexts = [ contexts, group_contexts ].flatten
23
+ end
24
+
25
+ return contexts
26
+ end
27
+
28
+ #---
29
+
30
+ def self.get(contexts, force = true)
31
+ options = {}
32
+
33
+ unless contexts.is_a?(Array)
34
+ contexts = ( ! Util::Data.empty?(contexts) ? [ contexts ].flatten : [] )
35
+ end
36
+ contexts.each do |name|
37
+ name = name.to_sym
38
+ if @@options.has_key?(name)
39
+ options = Util::Data.merge([ options, @@options[name] ], force)
40
+ end
41
+ end
42
+ return options
43
+ end
44
+
45
+ #---
46
+
47
+ def self.set(contexts, options, force = true)
48
+ unless contexts.is_a?(Array)
49
+ contexts = ( ! Util::Data.empty?(contexts) ? [ contexts ].flatten : [] )
50
+ end
51
+ contexts.each do |name|
52
+ name = name.to_sym
53
+ current_options = ( @@options.has_key?(name) ? @@options[name] : {} )
54
+ @@options[name] = Util::Data.merge([ current_options, Config.symbol_map(options) ], force)
55
+ end
56
+ end
57
+
58
+ #---
59
+
60
+ def self.clear(contexts)
61
+ unless contexts.is_a?(Array)
62
+ contexts = [ contexts ]
63
+ end
64
+ contexts.each do |name|
65
+ @@options.delete(name.to_sym)
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end