nucleon 0.1.12 → 0.1.13

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8dd7fe9a002e9dc6651cfb1d29a8bc4c018b7c2e
4
- data.tar.gz: 245aa7ddc78a89366e6485787c07ae8e34db9a85
3
+ metadata.gz: f70ed4e699ce46380540f987964c6dc765f542a0
4
+ data.tar.gz: 291ade54e0558e342f349adc551b0ebd7d0bf492
5
5
  SHA512:
6
- metadata.gz: 66614d6050b88c9d13d0ab233277537be26bf1f587bbf9ff995b40af2ea427b33f821edf4beadb0a08589a9638506ed80197d4b731063d6b570569177b0dda6d
7
- data.tar.gz: 70e40b7931c525a9c62711d9dfcd47835fddcb7b283a5b0d899f35376fa6215226c1b0becf00b0d97adfdfc7d4bcf17f10b746687eb97dd5db04ad8d90606017
6
+ metadata.gz: 19ba8e9c5ccfb4bbbcc44115ceda60d0af1f11879e65e10d81b4ce4b5ff11e69da0d03648a899c236197a7fb1e8e1944145965e8228213c8f9623956ebf8cdd4
7
+ data.tar.gz: 970bef07364f59149c7c87cd20b598b1cb9372709e04a10aad3d3a7187818d7fb85423be7d0fb86cc4602bc1398d1ced493815f62ab3b5a6c4381fde730f9c80
data/Gemfile CHANGED
@@ -21,4 +21,7 @@ group :development do
21
21
  gem "rspec", "~> 2.10"
22
22
  gem "rdoc", "~> 3.12"
23
23
  gem "yard", "~> 0.8"
24
+ gem "pry", "~> 0.9"
25
+ gem "pry-stack_explorer", "~> 0.4"
26
+ gem "pry-debugger", "~> 0.2"
24
27
  end
@@ -2,11 +2,22 @@ GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
4
  addressable (2.3.6)
5
+ binding_of_caller (0.7.2)
6
+ debug_inspector (>= 0.0.1)
5
7
  builder (3.2.2)
6
8
  celluloid (0.15.2)
7
9
  timers (~> 1.1.0)
8
10
  childprocess (0.5.2)
9
11
  ffi (~> 1.0, >= 1.0.11)
12
+ coderay (1.1.0)
13
+ columnize (0.3.6)
14
+ debug_inspector (0.0.2)
15
+ debugger (1.6.6)
16
+ columnize (>= 0.3.1)
17
+ debugger-linecache (~> 1.2.0)
18
+ debugger-ruby_core_source (~> 1.3.2)
19
+ debugger-linecache (1.2.0)
20
+ debugger-ruby_core_source (1.3.2)
10
21
  deep_merge (1.0.1)
11
22
  descendants_tracker (0.0.4)
12
23
  thread_safe (~> 0.3, >= 0.3.1)
@@ -23,7 +34,7 @@ GEM
23
34
  multi_json (>= 1.7.5, < 2.0)
24
35
  nokogiri (~> 1.6.0)
25
36
  oauth2
26
- hashie (2.1.0)
37
+ hashie (2.1.1)
27
38
  highline (1.6.21)
28
39
  i18n (0.6.9)
29
40
  jeweler (2.0.1)
@@ -39,6 +50,7 @@ GEM
39
50
  jwt (0.1.11)
40
51
  multi_json (>= 1.5)
41
52
  log4r (1.1.10)
53
+ method_source (0.8.2)
42
54
  mini_portile (0.5.3)
43
55
  multi_json (1.9.2)
44
56
  multi_xml (0.5.5)
@@ -54,6 +66,16 @@ GEM
54
66
  rack (~> 1.2)
55
67
  octokit (2.7.2)
56
68
  sawyer (~> 0.5.2)
69
+ pry (0.9.12.6)
70
+ coderay (~> 1.0)
71
+ method_source (~> 0.8)
72
+ slop (~> 3.4)
73
+ pry-debugger (0.2.2)
74
+ debugger (~> 1.3)
75
+ pry (~> 0.9.10)
76
+ pry-stack_explorer (0.4.9.1)
77
+ binding_of_caller (>= 0.7)
78
+ pry (>= 0.9.11)
57
79
  rack (1.5.2)
58
80
  rake (10.2.2)
59
81
  rdoc (3.12.2)
@@ -70,6 +92,7 @@ GEM
70
92
  sawyer (0.5.4)
71
93
  addressable (~> 2.3.5)
72
94
  faraday (~> 0.8, < 0.10)
95
+ slop (3.5.0)
73
96
  sshkey (1.6.1)
74
97
  thread_safe (0.3.3)
75
98
  timers (1.1.0)
@@ -89,6 +112,9 @@ DEPENDENCIES
89
112
  multi_json (~> 1.7)
90
113
  netrc (~> 0.7)
91
114
  octokit (~> 2.7)
115
+ pry (~> 0.9)
116
+ pry-debugger (~> 0.2)
117
+ pry-stack_explorer (~> 0.4)
92
118
  rdoc (~> 3.12)
93
119
  rspec (~> 2.10)
94
120
  rugged (~> 0.19)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.12
1
+ 0.1.13
@@ -181,7 +181,7 @@ class Config
181
181
 
182
182
  def delete(keys, default = nil)
183
183
  existing = modify(@properties, array(keys).flatten, nil)
184
- return existing[:value] if existing[:value]
184
+ return existing[:value] unless existing[:value].nil?
185
185
  return default
186
186
  end
187
187
 
@@ -6,50 +6,63 @@ class Collection
6
6
  #-----------------------------------------------------------------------------
7
7
  # Property accessor / modifiers
8
8
 
9
+ @@lock = Mutex.new
9
10
  @@properties = {}
10
11
 
11
12
  #---
12
13
 
13
14
  def self.all
14
- return @@properties
15
+ @@properties
15
16
  end
16
17
 
17
18
  #---
18
19
 
19
20
  def self.get(name)
20
- return @@properties[name.to_sym]
21
+ value = nil
22
+ @@lock.synchronize do
23
+ value = @@properties[name.to_sym]
24
+ end
25
+ value
21
26
  end
22
27
 
23
28
  #---
24
29
 
25
30
  def self.set(name, value)
26
- @@properties[name.to_sym] = value
31
+ @@lock.synchronize do
32
+ @@properties[name.to_sym] = value
33
+ end
27
34
  end
28
35
 
29
36
  #---
30
37
 
31
38
  def self.delete(name)
32
- @@properties.delete(name.to_sym)
39
+ @@lock.synchronize do
40
+ @@properties.delete(name.to_sym)
41
+ end
33
42
  end
34
43
 
35
44
  #---
36
45
 
37
46
  def self.clear
38
- @@properties = {}
47
+ @@lock.synchronize do
48
+ @@properties = {}
49
+ end
39
50
  end
40
51
 
41
52
  #---
42
53
 
43
54
  def self.save(options = {})
44
55
  unless Util::Data.empty?(options[:log_dir])
45
- log_dir = options[:log_dir]
56
+ @@lock.synchronize do
57
+ log_dir = options[:log_dir]
46
58
 
47
- if options[:config_store]
48
- unless File.directory?(log_dir)
49
- FileUtils.mkdir_p(log_dir)
59
+ if options[:config_store]
60
+ unless File.directory?(log_dir)
61
+ FileUtils.mkdir_p(log_dir)
62
+ end
63
+ Util::Disk.write(File.join(log_dir, "properties.json"), Util::Data.to_json(@@properties, true))
64
+ Util::Disk.write(File.join(log_dir, "properties.yaml"), Util::Data.to_yaml(Util::Data.string_map(@@properties)))
50
65
  end
51
- Util::Disk.write(File.join(log_dir, "common.json"), Util::Data.to_json(@@properties, true))
52
- Util::Disk.write(File.join(log_dir, "common.yaml"), Util::Data.to_yaml(Util::Data.string_map(@@properties)))
53
66
  end
54
67
  end
55
68
  end
@@ -1,5 +1,33 @@
1
1
 
2
2
  module Nucleon
3
+ #-------------------------------------------------------------------------------
4
+ # Parallel interface (include Parallel)
5
+
6
+ module Parallel
7
+
8
+ def self.included(klass)
9
+ if Nucleon.parallel?
10
+ klass.send :include, Celluloid
11
+ end
12
+ klass.extend ClassMethods
13
+ end
14
+
15
+ #---
16
+
17
+ module ClassMethods
18
+ def external_block_exec(*methods)
19
+ if Nucleon.parallel?
20
+ methods.each do |method|
21
+ execute_block_on_receiver method.to_sym
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ #-------------------------------------------------------------------------------
29
+ # Core Nucleon facade (extend Facade)
30
+
3
31
  module Facade
4
32
 
5
33
  include Mixin::Colors
@@ -34,6 +62,48 @@ module Facade
34
62
 
35
63
  #-----------------------------------------------------------------------------
36
64
 
65
+ def handle(klass)
66
+ if parallel? && klass.respond_to?(:current_actor)
67
+ myself = klass.current_actor
68
+ else
69
+ myself = klass
70
+ end
71
+ myself
72
+ end
73
+
74
+ #---
75
+
76
+ def manager(collection, name, klass)
77
+ name = name.to_sym
78
+
79
+ if collection.has_key?(name)
80
+ manager = collection[name]
81
+ else
82
+ if parallel?
83
+ klass.supervise_as name
84
+ manager = Celluloid::Actor[name]
85
+ else
86
+ manager = klass.new # Managers should not have initialization parameters
87
+ end
88
+ collection[name] = manager
89
+ end
90
+ test_connection(manager)
91
+ manager
92
+ end
93
+
94
+ def test_connection(manager)
95
+ if parallel?
96
+ begin
97
+ # Raise error if no test method found but retry for dead actors
98
+ manager.test_connection
99
+ rescue Celluloid::DeadActorError
100
+ retry
101
+ end
102
+ end
103
+ end
104
+
105
+ #-----------------------------------------------------------------------------
106
+
37
107
  def admin?
38
108
  is_admin = ( ENV['USER'] == 'root' )
39
109
  ext_admin = exec(:check_admin) do |op, results|
@@ -2,8 +2,8 @@
2
2
  module Nucleon
3
3
  class Manager
4
4
 
5
- include Celluloid
6
-
5
+ include Parallel
6
+
7
7
  #-----------------------------------------------------------------------------
8
8
 
9
9
  @@supervisors = {}
@@ -11,26 +11,8 @@ class Manager
11
11
  #-----------------------------------------------------------------------------
12
12
  # Plugin manager interface
13
13
 
14
- def self.init_manager(name)
15
- name = name.to_sym
16
-
17
- Manager.supervise_as name
18
- @@supervisors[name] = Celluloid::Actor[name]
19
- end
20
-
21
- #---
22
-
23
14
  def self.connection(name = :core)
24
- name = name.to_sym
25
-
26
- init_manager(name) unless @@supervisors.has_key?(name)
27
-
28
- #begin
29
- @@supervisors[name].test_connection
30
- #rescue Celluloid::DeadActorError
31
- # retry
32
- #end
33
- @@supervisors[name]
15
+ Nucleon.manager(@@supervisors, name, self)
34
16
  end
35
17
 
36
18
  #---
@@ -52,7 +34,7 @@ class Manager
52
34
  #---
53
35
 
54
36
  def myself
55
- Actor.current
37
+ Nucleon.handle(self)
56
38
  end
57
39
 
58
40
  #---
@@ -132,8 +114,8 @@ class Manager
132
114
  def reload(core = false, &code)
133
115
  logger.info("Loading Nucleon plugins at #{Time.now}")
134
116
 
135
- if core
136
- Celluloid.logger = logger
117
+ if core
118
+ Celluloid.logger = logger if Nucleon.parallel?
137
119
 
138
120
  define_namespace :nucleon
139
121
 
@@ -292,27 +274,26 @@ class Manager
292
274
  def load_base(type, provider, options = {})
293
275
  logger.info("Fetching plugin #{type} provider #{provider} at #{Time.now}")
294
276
 
295
- options = translate_type(type, options)
296
- config = Config.ensure(options)
297
- name = config.get(:name, nil)
298
-
299
- logger.debug("Plugin options: #{config.export.inspect}")
277
+ options = translate_type(type, options)
278
+ config = Config.ensure(options)
279
+ name = config.get(:name, nil)
280
+ ensure_new = config.delete(:new, false)
300
281
 
301
- if name && ! config.delete(:new, false)
282
+ if name
302
283
  logger.debug("Looking up existing instance of #{name}")
303
284
 
304
- existing_instance = get(type, name)
305
-
306
- if existing_instance
307
- config.export.each do |property_name, value|
308
- unless [ :name, :meta ].include?(property_name)
309
- existing_instance[property_name] = value
285
+ if existing_instance = get(type, name)
286
+ unless ensure_new
287
+ config.export.each do |property_name, value|
288
+ unless [ :name, :meta ].include?(property_name)
289
+ existing_instance[property_name] = value
290
+ end
310
291
  end
311
- end
312
- existing_instance.normalize(true)
292
+ existing_instance.normalize(true)
313
293
 
314
- logger.info("Using existing instance of #{type}, #{name}")
315
- return existing_instance
294
+ logger.debug("Using existing instance of #{type}, #{name}")
295
+ return existing_instance
296
+ end
316
297
  end
317
298
  end
318
299
  create(type, provider, options)
@@ -340,8 +321,6 @@ class Manager
340
321
  klass = plugin_class(type)
341
322
  data = klass.build_info(type, data) if klass.respond_to?(:build_info)
342
323
 
343
- logger.debug("Translated plugin data: #{data.inspect}")
344
-
345
324
  data.each do |options|
346
325
  if plugin = load(type, options[:provider], options)
347
326
  if build_hash
@@ -369,7 +348,7 @@ class Manager
369
348
  info = @load_info[type][provider] if Util::Data.exists?(@load_info, [ type, provider ])
370
349
 
371
350
  if info
372
- logger.debug("Plugin information for #{provider} #{type} found. Data: #{info.inspect}")
351
+ logger.debug("Plugin information for #{provider} #{type} found.")
373
352
 
374
353
  instance_name = "#{provider}_" + Nucleon.sha1(options)
375
354
  options = translate(info[:namespace], type, provider, options)
@@ -380,7 +359,7 @@ class Manager
380
359
  info[:instance_name] = instance_name
381
360
  options[:meta] = Config.new(info).import(Util::Data.hash(options[:meta]))
382
361
 
383
- logger.info("Creating new plugin #{provider} #{type} with #{options.inspect}")
362
+ logger.info("Creating new plugin #{provider} #{type}")
384
363
 
385
364
  plugin = info[:class].new(type, provider, options)
386
365
 
@@ -416,7 +395,8 @@ class Manager
416
395
  if plugin && plugin.respond_to?(:plugin_type) && @plugins.has_key?(plugin.plugin_type)
417
396
  logger.debug("Removing #{plugin.plugin_type} #{plugin.plugin_name}")
418
397
  @plugins[plugin.plugin_type].delete(plugin.plugin_instance_name)
419
- plugin.terminate if plugin.respond_to?(:terminate)
398
+ plugin.remove_plugin
399
+ plugin.terminate if plugin.respond_to?(:terminate) # For Celluloid plugins
420
400
  else
421
401
  logger.warn("Cannot remove plugin: #{plugin.inspect}")
422
402
  end
@@ -57,8 +57,8 @@ module PluginInterface
57
57
  code.call(type, provider, name, plugin)
58
58
  end
59
59
  else
60
- logger.debug("Processing plugin: #{plugin.name}")
61
- code.call(type, provider, plugin.name, plugin)
60
+ logger.debug("Processing plugin: #{plugin.plugin_name}")
61
+ code.call(type, provider, plugin.plugin_name, plugin)
62
62
  end
63
63
  end
64
64
  end
@@ -29,6 +29,12 @@ class Base < Core
29
29
  return nil
30
30
  end
31
31
 
32
+ #---
33
+
34
+ def remove_plugin
35
+ # Implement in sub classes if needed for cleanup
36
+ end
37
+
32
38
  #-----------------------------------------------------------------------------
33
39
  # Checks
34
40
 
@@ -40,8 +46,7 @@ class Base < Core
40
46
  # Property accessor / modifiers
41
47
 
42
48
  def myself
43
- return current_actor if respond_to?(:current_actor) # Celluloid enhanced plugin
44
- self
49
+ Nucleon.handle(self)
45
50
  end
46
51
  alias_method :me, :myself
47
52
 
@@ -269,10 +274,12 @@ class Base < Core
269
274
 
270
275
  #---
271
276
 
272
- def self.init_plugin_collection
277
+ def self.init_plugin_collection(*external_block_methods)
273
278
  logger.debug("Initializing plugin collection interface at #{Time.now}")
274
279
 
275
- include Celluloid
280
+ include Parallel
281
+ external_block_exec(*external_block_methods)
282
+
276
283
  include Mixin::Settings
277
284
  include Mixin::SubConfig
278
285
 
@@ -767,12 +767,11 @@ class Project < Base
767
767
  # Remote operations
768
768
 
769
769
  def pull(remote = :edit, options = {})
770
+ config = Config.ensure(options).import({ :remote => remote })
770
771
  success = false
771
772
 
772
773
  if can_persist?
773
- localize do
774
- config = Config.ensure(options).import({ :remote => remote })
775
-
774
+ localize do
776
775
  if extension_check(:pull, { :directory => directory, :config => config })
777
776
  remote = config.delete(:remote)
778
777
 
@@ -806,18 +805,30 @@ class Project < Base
806
805
  #---
807
806
 
808
807
  def push(remote = :edit, options = {})
808
+ config = Config.ensure(options).import({ :remote => remote })
809
809
  success = false
810
810
 
811
+ push_project = lambda do |push_remote|
812
+ logger.info("Pushing to #{push_remote} from #{directory}")
813
+ success = yield(config, push_remote) if block_given? && pull(push_remote, config)
814
+ end
815
+
811
816
  if can_persist?
812
- localize do
813
- config = Config.ensure(options).import({ :remote => remote })
814
-
817
+ localize do
815
818
  if extension_check(:push, { :directory => directory, :config => config })
816
819
  remote = config.delete(:remote)
820
+ tries = config.delete(:tries, 5)
817
821
 
822
+ # TODO: Figure out a better way through specialized exception handling
818
823
  if remote(remote)
819
- logger.info("Pushing to #{remote} from #{directory}")
820
- success = yield(config, remote) if block_given? && pull(remote, options)
824
+ begin
825
+ success = push_project.call(remote)
826
+ raise unless success
827
+
828
+ rescue
829
+ tries -= 1
830
+ retry if tries > 0
831
+ end
821
832
  end
822
833
 
823
834
  if success
@@ -75,6 +75,13 @@ class Template < Base
75
75
  logger.debug("Completed rendering of #{plugin_provider} data: #{output}")
76
76
  return output
77
77
  end
78
+
79
+ #-----------------------------------------------------------------------------
80
+ # Utilities
81
+
82
+ def self.translate(data)
83
+ return data
84
+ end
78
85
  end
79
86
  end
80
87
  end
@@ -60,12 +60,13 @@ class Cache < Core
60
60
  #---
61
61
 
62
62
  def get(keys, default = nil, format = false)
63
- result = super
63
+ result = super(keys, nil)
64
64
 
65
65
  if result.nil?
66
66
  load
67
- result = super
67
+ result = super(keys, nil)
68
68
  end
69
+ result = filter(default, format) if result.nil?
69
70
  result
70
71
  end
71
72
 
@@ -119,6 +120,8 @@ class Cache < Core
119
120
  logger.debug("Cache file contents: #{raw}")
120
121
  parse_properties = Data.hash(parser.parse(raw))
121
122
 
123
+ Nucleon.remove_plugin(parser)
124
+
122
125
  import(parse_properties, { :no_save => true }) unless parse_properties.empty?
123
126
  success = true
124
127
  end
@@ -135,6 +138,8 @@ class Cache < Core
135
138
  @@cache_lock.synchronize do
136
139
  if renderer = CORL.translator({}, translator)
137
140
  rendering = renderer.generate(export)
141
+
142
+ Nucleon.remove_plugin(renderer)
138
143
 
139
144
  if Disk.write(file, rendering)
140
145
  success = true
@@ -3,7 +3,8 @@ module Nucleon
3
3
  module Util
4
4
  class Shell < Core
5
5
 
6
- include Celluloid
6
+ include Parallel
7
+ external_block_exec :exec
7
8
 
8
9
  #-----------------------------------------------------------------------------
9
10
 
@@ -48,21 +49,16 @@ class Shell < Core
48
49
  # Shell interface
49
50
 
50
51
  def self.connection(name = :core)
51
- name = name.to_sym
52
- init_shell(name) unless @@supervisors.has_key?(name)
53
- @@supervisors[name]
52
+ Nucleon.manager(@@supervisors, name, self)
54
53
  end
55
54
 
56
- def self.init_shell(name)
57
- name = name.to_sym
58
-
59
- Shell.supervise_as name
60
- @@supervisors[name] = Celluloid::Actor[name]
55
+ #---
56
+
57
+ def test_connection
58
+ true
61
59
  end
62
60
 
63
61
  #---
64
-
65
- execute_block_on_receiver :exec
66
62
 
67
63
  def exec(command, options = {}, &code)
68
64
  config = Config.ensure(options)
@@ -527,7 +527,7 @@ class Git < Plugin::Project
527
527
  command_provider = get(:command_provider, Nucleon.type_default(:command))
528
528
  quiet = get(:quiet, true)
529
529
 
530
- result = Nucleon.command({
530
+ command = Nucleon.command({
531
531
  :command => :git,
532
532
  :data => { 'git-dir=' => repo.path },
533
533
  :subcommand => {
@@ -536,9 +536,12 @@ class Git < Plugin::Project
536
536
  :data => data,
537
537
  :args => processed_args
538
538
  }
539
- }, command_provider).exec({ :quiet => quiet }) do |op, cli_command, cli_data|
539
+ }, command_provider)
540
+
541
+ result = command.exec({ :quiet => quiet }) do |op, cli_command, cli_data|
540
542
  block_given? ? yield(op, cli_command, cli_data) : true
541
543
  end
544
+ Nucleon.remove_plugin(command)
542
545
  end
543
546
  end
544
547
  result
@@ -1,4 +1,3 @@
1
-
2
1
  #*******************************************************************************
3
2
  # Nucleon
4
3
  #
@@ -71,6 +70,108 @@ macro_dir = File.join(mixin_dir, 'macro')
71
70
  util_dir = File.join(core_dir, 'util')
72
71
  mod_dir = File.join(core_dir, 'mod')
73
72
  plugin_dir = File.join(core_dir, 'plugin')
73
+
74
+ #-------------------------------------------------------------------------------
75
+ # Environment checks and debugging
76
+
77
+ module Nucleon
78
+
79
+ def self.VERSION
80
+ File.read(File.join(File.dirname(__FILE__), '..', 'VERSION'))
81
+ end
82
+
83
+ #-----------------------------------------------------------------------------
84
+
85
+ def self.debugging?
86
+ ENV["NUCLEON_DEBUG"] ? true : false
87
+ end
88
+
89
+ #---
90
+
91
+ def self.debug_break(condition = true)
92
+ if debugging?
93
+ #-------------------------------------------------------------------------------
94
+ # Nucleon Pry powered development console
95
+ #
96
+ # Usage:
97
+ #
98
+ # * Execute nucleon (or derivative executable, ex; corl) with the NUCLEON_DEBUG
99
+ # environment variable set
100
+ #
101
+ # :> [ sudo ] NUCLEON_DEBUG=1 nucleon <args>...
102
+ #
103
+ # * Call the debug_break method anywhere in the code to start a debugging
104
+ # session.
105
+ #
106
+ # :> Nucleon.debug_break or :> Nucleon.debug_break <test?>
107
+ #
108
+ # * Since the debugging tools don't work in parallel, parallel operations are
109
+ # serialized when NUCLEON_DEBUG environment variable is found.
110
+ #
111
+ #-------------------------------------------------------------------------------
112
+ # General information
113
+ #
114
+ # For more information on Pry: http://pryrepl.org
115
+ # ( https://github.com/pry/pry )
116
+ #
117
+ # Loaded plugins: stack explorer ( https://github.com/pry/pry-stack_explorer )
118
+ # debugger ( https://github.com/nixme/pry-debugger )
119
+ #
120
+ # For available commands and help information: [ help ]
121
+ # For command specific help: [ <command> --help ]
122
+ #
123
+ #-------------------------------------------------------------------------------
124
+ # General commands:
125
+ #
126
+ # :> cd <Class> Change to inspect class (class constant)
127
+ # :> show-method <method> Show source for class method
128
+ # :> .<CLI command> <args>... Execute a CLI command (always starts with dot)
129
+ #
130
+ #-------------------------------------------------------------------------------
131
+ # Breakpoints
132
+ #
133
+ # :> breakpoints List all defined breakpoints
134
+ # :> break Same as breakpoints command
135
+ #
136
+ # :> break <Class>#<method> Break at start of `Class#method`.
137
+ # :> break <Class>#<method> if <test?> Break at `Class#method` if `test?`.
138
+ # :> break <path>/<ruby file>:<line> Break at line in ruby file.
139
+ # :> break <line> Break at line in current file.
140
+ #
141
+ # :> break --condition <breakpoint> <test?> Change condition on breakpoint.
142
+ # :> break --condition <breakpoint> Remove condition on breakpoint.
143
+ #
144
+ # :> break --delete <breakpoint> Delete breakpoint.
145
+ # :> break --disable-all Disable all breakpoints.
146
+ #
147
+ # :> break --show <breakpoint> Show details about breakpoint.
148
+ #
149
+ #-------------------------------------------------------------------------------
150
+ # Stack inspection / traversal
151
+ #
152
+ # :> show-stack Show all accessible frames in the call stack.
153
+ # :> frame <number> Move to a specific frame.
154
+ # :> up Move up one frame in the call stack.
155
+ # :> down Move down one frame in the call stack.
156
+ #
157
+ #-------------------------------------------------------------------------------
158
+ # Debugging execution flow:
159
+ #
160
+ # :> s = [ step | step <times> ] Step execution into the next line or method.
161
+ # :> n = [ next | next <times> ] Step over to the next line within same frame.
162
+ # :> f = [ finish ] Execute until current stack frame returns.
163
+ # :> c = [ continue ] Continue program execution (end Pry session).
164
+ #
165
+ binding.pry if condition
166
+ end
167
+ end
168
+
169
+ #-----------------------------------------------------------------------------
170
+
171
+ def self.parallel?
172
+ debugging? || ENV['NUCLEON_NO_PARALLEL'] ? false : true
173
+ end
174
+ end
74
175
 
75
176
  #-------------------------------------------------------------------------------
76
177
  # Coral requirements
@@ -79,13 +180,25 @@ $:.unshift(lib_dir) unless $:.include?(lib_dir) || $:.include?(File.expand_path(
79
180
 
80
181
  #---
81
182
 
183
+ if Nucleon.debugging?
184
+ require 'pry'
185
+ require 'pry-stack_explorer'
186
+ require 'pry-debugger'
187
+
188
+ if defined?(PryDebugger)
189
+ Pry.commands.alias_command 'c', 'continue'
190
+ Pry.commands.alias_command 's', 'step'
191
+ Pry.commands.alias_command 'n', 'next'
192
+ Pry.commands.alias_command 'f', 'finish'
193
+ end
194
+ end
195
+
196
+ #---
197
+
82
198
  # TODO: Reduce the number of dependencies loaded in this load script (for performance).
83
199
  # Decentralize!
84
-
85
- require 'rubygems'
86
200
 
87
201
  require 'optparse'
88
- require 'pp'
89
202
  require 'i18n'
90
203
  require 'log4r'
91
204
  require 'log4r/configurator'
@@ -101,10 +214,12 @@ require 'tmpdir'
101
214
  require 'sshkey'
102
215
 
103
216
  require 'childprocess'
217
+ require 'thread'
104
218
 
105
- require 'thread' # Eventually depreciated?
106
- require 'celluloid'
107
- require 'celluloid/autostart'
219
+ if Nucleon.parallel?
220
+ require 'celluloid'
221
+ require 'celluloid/autostart'
222
+ end
108
223
 
109
224
  #---
110
225
 
@@ -115,13 +230,6 @@ I18n.load_path << File.expand_path(File.join('..', 'locales', 'en.yml'), lib_dir
115
230
 
116
231
  #---
117
232
 
118
- if nucleon_locate('git')
119
- require 'rugged'
120
- nucleon_require(util_dir, :git)
121
- end
122
-
123
- #---
124
-
125
233
  # Make sure logger is at the top of our load order priorities
126
234
  nucleon_require(util_dir, :logger)
127
235
 
@@ -150,6 +258,14 @@ end
150
258
 
151
259
  #---
152
260
 
261
+ nucleon_require(core_dir, :facade)
262
+
263
+ module Nucleon
264
+ extend Facade
265
+ end
266
+
267
+ #---
268
+
153
269
  # Include bootstrap classes
154
270
  nucleon_require(core_dir, :errors)
155
271
  nucleon_require(core_dir, :codes)
@@ -172,23 +288,17 @@ nucleon_require(core_dir, :core)
172
288
  nucleon_require(util_dir, name)
173
289
  end
174
290
 
291
+ #---
292
+
293
+ if nucleon_locate('git')
294
+ require 'rugged'
295
+ nucleon_require(util_dir, :git)
296
+ end
297
+
298
+ #---
299
+
175
300
  # Include plugin system
176
- nucleon_require(core_dir, :facade)
177
301
  nucleon_require(core_dir, :gems)
178
302
  nucleon_require(core_dir, :manager)
179
303
  nucleon_require(plugin_dir, :base)
180
304
  nucleon_require(core_dir, :plugin)
181
-
182
- #-------------------------------------------------------------------------------
183
- # Core interface
184
-
185
- module Nucleon
186
-
187
- def self.VERSION
188
- File.read(File.join(File.dirname(__FILE__), '..', 'VERSION'))
189
- end
190
-
191
- #-----------------------------------------------------------------------------
192
-
193
- extend Facade
194
- end
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: nucleon 0.1.12 ruby lib
5
+ # stub: nucleon 0.1.13 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "nucleon"
9
- s.version = "0.1.12"
9
+ s.version = "0.1.13"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Adrian Webb"]
14
- s.date = "2014-04-08"
14
+ s.date = "2014-04-14"
15
15
  s.description = "\nA framework that provides a simple foundation for building Ruby applications that are:\n\n* Highly configurable (with both distributed and persistent configurations)\n* Extremely pluggable and extendable\n* Easily parallel\n\nNote: This framework is still very early in development!\n"
16
16
  s.email = "adrian.webb@coralnexus.com"
17
17
  s.executables = ["nucleon"]
@@ -118,6 +118,9 @@ Gem::Specification.new do |s|
118
118
  s.add_development_dependency(%q<rspec>, ["~> 2.10"])
119
119
  s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
120
120
  s.add_development_dependency(%q<yard>, ["~> 0.8"])
121
+ s.add_development_dependency(%q<pry>, ["~> 0.9"])
122
+ s.add_development_dependency(%q<pry-stack_explorer>, ["~> 0.4"])
123
+ s.add_development_dependency(%q<pry-debugger>, ["~> 0.2"])
121
124
  else
122
125
  s.add_dependency(%q<log4r>, ["~> 1.1"])
123
126
  s.add_dependency(%q<i18n>, ["~> 0.6"])
@@ -134,6 +137,9 @@ Gem::Specification.new do |s|
134
137
  s.add_dependency(%q<rspec>, ["~> 2.10"])
135
138
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
136
139
  s.add_dependency(%q<yard>, ["~> 0.8"])
140
+ s.add_dependency(%q<pry>, ["~> 0.9"])
141
+ s.add_dependency(%q<pry-stack_explorer>, ["~> 0.4"])
142
+ s.add_dependency(%q<pry-debugger>, ["~> 0.2"])
137
143
  end
138
144
  else
139
145
  s.add_dependency(%q<log4r>, ["~> 1.1"])
@@ -151,6 +157,9 @@ Gem::Specification.new do |s|
151
157
  s.add_dependency(%q<rspec>, ["~> 2.10"])
152
158
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
153
159
  s.add_dependency(%q<yard>, ["~> 0.8"])
160
+ s.add_dependency(%q<pry>, ["~> 0.9"])
161
+ s.add_dependency(%q<pry-stack_explorer>, ["~> 0.4"])
162
+ s.add_dependency(%q<pry-debugger>, ["~> 0.2"])
154
163
  end
155
164
  end
156
165
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nucleon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.12
4
+ version: 0.1.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adrian Webb
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-08 00:00:00.000000000 Z
11
+ date: 2014-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: log4r
@@ -220,6 +220,48 @@ dependencies:
220
220
  - - "~>"
221
221
  - !ruby/object:Gem::Version
222
222
  version: '0.8'
223
+ - !ruby/object:Gem::Dependency
224
+ name: pry
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '0.9'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '0.9'
237
+ - !ruby/object:Gem::Dependency
238
+ name: pry-stack_explorer
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - "~>"
242
+ - !ruby/object:Gem::Version
243
+ version: '0.4'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "~>"
249
+ - !ruby/object:Gem::Version
250
+ version: '0.4'
251
+ - !ruby/object:Gem::Dependency
252
+ name: pry-debugger
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - "~>"
256
+ - !ruby/object:Gem::Version
257
+ version: '0.2'
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - "~>"
263
+ - !ruby/object:Gem::Version
264
+ version: '0.2'
223
265
  description: |2
224
266
 
225
267
  A framework that provides a simple foundation for building Ruby applications that are: