nucleon 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.4
1
+ 0.1.5
@@ -5,8 +5,9 @@ class Core < Config
5
5
  #-----------------------------------------------------------------------------
6
6
  # Properties
7
7
 
8
- @@logger = Util::Logger.new('core')
9
- @@ui = Util::Console.new('core')
8
+ @@logger = Util::Logger.new('core')
9
+ @@ui = Util::Console.new('core')
10
+ @@ui_lock = Mutex.new
10
11
 
11
12
  #-----------------------------------------------------------------------------
12
13
  # Constructor / Destructor
@@ -60,10 +61,25 @@ class Core < Config
60
61
  #-----------------------------------------------------------------------------
61
62
  # General utilities
62
63
 
64
+ def self.ui_group(resource)
65
+ @@ui_lock.synchronize do
66
+ begin
67
+ ui_resource = ui.resource
68
+ ui.resource = resource
69
+ yield(ui)
70
+
71
+ ensure
72
+ ui.resource = ui_resource
73
+ end
74
+ end
75
+ end
76
+
77
+ #---
78
+
63
79
  def ui_group(resource)
64
80
  ui_resource = ui.resource
65
81
  ui.resource = resource
66
- yield
82
+ yield(ui)
67
83
 
68
84
  ensure
69
85
  ui.resource = ui_resource
@@ -6,6 +6,10 @@ module Facade
6
6
  Core.ui
7
7
  end
8
8
 
9
+ def ui_group(resource, &code)
10
+ Core.ui_group(resource, &code)
11
+ end
12
+
9
13
  def quiet=quiet
10
14
  Util::Console.quiet = quiet
11
15
  end
@@ -40,9 +44,43 @@ module Facade
40
44
 
41
45
  #---
42
46
 
43
- def ip_address
44
- result = cli_run(value(:ip_address_command, 'curl --silent ifconfig.me'), { :quiet => true })
45
- result.output
47
+ @@ip_cache = nil
48
+
49
+ def ip_address(reset = false)
50
+ external_ip = nil
51
+ cached_ip_file = File.join(Dir.tmpdir(), 'nucleon_ip.json')
52
+
53
+ unless @@ip_cache
54
+ json_text = Util::Data.ensure_value(Util::Disk.read(cached_ip_file), '')
55
+ @@ip_cache = Util::Data.parse_json(json_text) unless json_text.empty?
56
+ end
57
+
58
+ fetch_ip = lambda do
59
+ result = cli_run(value(:external_address_command, 'curl --silent ifconfig.me'), { :quiet => true })
60
+ ip_address = result.output
61
+
62
+ unless ip_address.empty?
63
+ @@ip_cache = {
64
+ 'ip' => ip_address,
65
+ 'updated' => Time.new.to_s
66
+ }
67
+ Util::Disk.write(cached_ip_file, Util::Data.to_json(@@ip_cache))
68
+ end
69
+ ip_address
70
+ end
71
+
72
+ if reset || (! @@ip_cache || @@ip_cache.empty? || ! @@ip_cache.has_key?('ip'))
73
+ external_ip = fetch_ip.call
74
+ else
75
+ external_ip = @@ip_cache['ip']
76
+ updated_time = Time.parse(@@ip_cache['updated'])
77
+ cache_duration = (Time.new - updated_time) / 60 # Seconds to minutes
78
+
79
+ if cache_duration >= value(:external_address_lifetime, 60)
80
+ external_ip = fetch_ip.call
81
+ end
82
+ end
83
+ external_ip
46
84
  end
47
85
 
48
86
  #-----------------------------------------------------------------------------
@@ -315,7 +353,13 @@ module Facade
315
353
  main_command = arg_components.shift
316
354
  sub_command = arg_components.shift
317
355
  sub_args = arg_components
318
-
356
+
357
+ lib_dir = File.join(Dir.pwd, 'lib')
358
+ if File.directory?(lib_dir)
359
+ logger.debug("Registering plugins at #{lib_dir}")
360
+ Nucleon.register(lib_dir)
361
+ end
362
+
319
363
  if main_command.processed && sub_command
320
364
  exit_status = action_cli(sub_command, sub_args, false, name)
321
365
  else
@@ -379,6 +423,30 @@ module Facade
379
423
 
380
424
  def sha1(data)
381
425
  Digest::SHA1.hexdigest(Util::Data.to_json(data, false))
426
+ end
427
+
428
+ #---
429
+
430
+ def silence
431
+ result = nil
432
+
433
+ begin
434
+ orig_stderr = $stderr.clone
435
+ orig_stdout = $stdout.clone
436
+ $stderr.reopen File.new('/dev/null', 'w')
437
+ $stdout.reopen File.new('/dev/null', 'w')
438
+
439
+ result = yield
440
+
441
+ rescue Exception => error
442
+ $stdout.reopen orig_stdout
443
+ $stderr.reopen orig_stderr
444
+ raise error
445
+ ensure
446
+ $stdout.reopen orig_stdout
447
+ $stderr.reopen orig_stderr
448
+ end
449
+ result
382
450
  end
383
451
  end
384
452
  end
@@ -100,7 +100,7 @@ module PluginInterface
100
100
  logger.debug("Providers: #{providers.inspect}")
101
101
 
102
102
  symbol_map(data).each do |provider, instance_settings|
103
- if ! providers || providers.include?(provider)
103
+ if ! providers || providers.include?(provider.to_s)
104
104
  if _single_instance
105
105
  logger.debug("Initializing single instance plugin: #{instance_settings.inspect}")
106
106
 
@@ -44,7 +44,7 @@ class Project < Base
44
44
 
45
45
  set_url(get(:url)) if get(:url, false)
46
46
 
47
- myself.plugin_name = path if myself.plugin_name == plugin_provider
47
+ myself.plugin_name = path
48
48
 
49
49
  ui.resource = plugin_name
50
50
  logger = plugin_name
@@ -67,8 +67,8 @@ class Project < Base
67
67
  def init_project
68
68
  init_auth
69
69
  init_parent
70
- init_remotes
71
- load_revision
70
+ init_remotes
71
+ load_revision
72
72
  end
73
73
 
74
74
  #-----------------------------------------------------------------------------
@@ -79,7 +79,7 @@ class Project < Base
79
79
  if directory
80
80
  lib_path = File.join(directory, 'lib')
81
81
  if File.directory?(lib_path)
82
- CORL.register(lib_path)
82
+ Nucleon.register(lib_path)
83
83
  end
84
84
  end
85
85
  end
@@ -374,6 +374,8 @@ class Project < Base
374
374
  #---
375
375
 
376
376
  def checkout(revision)
377
+ success = false
378
+
377
379
  if can_persist?
378
380
  localize do
379
381
  if extension_check(:checkout, { :revision => revision })
@@ -393,6 +395,7 @@ class Project < Base
393
395
  else
394
396
  logger.warn("Project #{name} does not meet the criteria for persistence and can not checkout a revision")
395
397
  end
398
+ success
396
399
  end
397
400
 
398
401
  #---
@@ -711,7 +714,7 @@ class Project < Base
711
714
  #-----------------------------------------------------------------------------
712
715
  # Remote operations
713
716
 
714
- def pull(remote = :origin, options = {})
717
+ def pull(remote = :edit, options = {})
715
718
  success = false
716
719
 
717
720
  if can_persist?
@@ -728,7 +731,7 @@ class Project < Base
728
731
  if success
729
732
  load_revision
730
733
  update_subprojects
731
-
734
+
732
735
  extension(:pull_success, { :directory => directory, :remote => remote, :config => config })
733
736
 
734
737
  if ! parent.nil? && config.get(:propogate, true)
@@ -772,7 +775,7 @@ class Project < Base
772
775
  if config.get(:propogate, true)
773
776
  logger.debug("Pushing sub projects as propogate option was given")
774
777
 
775
- foreach! do |path, project|
778
+ each do |path, project|
776
779
  project.push(remote, config)
777
780
  end
778
781
  end
@@ -53,7 +53,7 @@ class Template < Base
53
53
  logger.debug("Rendering data: normalize: #{normalize.inspect}; interpolate: #{interpolate.inspect}: #{data.inspect}")
54
54
 
55
55
  if normalize
56
- data = Config.normalize(data, nil, config)
56
+ data = Config.normalize(data, nil, export)
57
57
  logger.debug("Pre-rendering data normalization: #{data.inspect}")
58
58
  end
59
59
 
@@ -385,30 +385,65 @@ class Git < Plugin::Project
385
385
 
386
386
  #-----------------------------------------------------------------------------
387
387
  # SSH operations
388
+
389
+ def git_fetch(remote = :edit, options = {})
390
+ config = Config.ensure(options)
391
+ local_revision = config.get(:revision, get(:revision, :master))
392
+
393
+ result = Nucleon.command({
394
+ :command => :git,
395
+ :data => { 'git-dir=' => git.git_dir },
396
+ :subcommand => {
397
+ :command => :fetch,
398
+ :args => [ remote ]
399
+ }
400
+ }, config.get(:provider, Nucleon.type_default(:command))).exec(config.import({ :quiet => true })) do |op, command, data|
401
+ block_given? ? yield(op, command, data) : true
402
+ end
403
+
404
+ if result.status == code.success
405
+ new?(true)
406
+ checkout(local_revision)
407
+ else
408
+ false
409
+ end
410
+ end
411
+ protected :git_fetch
412
+
413
+ #---
388
414
 
389
- def pull(remote = :origin, options = {})
415
+ def pull(remote = :edit, options = {})
390
416
  return super do |config, processed_remote|
391
- flags = []
392
- flags << :tags if config.get(:tags, true)
393
-
394
- result = Nucleon.command({
395
- :command => :git,
396
- :data => { 'git-dir=' => git.git_dir },
397
- :subcommand => {
398
- :command => :pull,
399
- :flags => flags,
400
- :args => [ processed_remote, config.get(:revision, get(:revision, :master)) ]
401
- }
402
- }, config.get(:provider, :bash)).exec(config.import({ :quiet => true })) do |op, command, data|
403
- block_given? ? yield(op, command, data) : true
404
- end
417
+ success = false
405
418
 
406
- if result.status == code.success
407
- new?(true)
408
- true
419
+ if new? || get(:create, false)
420
+ success = git_fetch(processed_remote, config)
409
421
  else
410
- false
411
- end
422
+ flags = []
423
+ flags << :tags if config.get(:tags, true)
424
+
425
+ local_revision = config.get(:revision, get(:revision, :master))
426
+
427
+ if checkout(local_revision)
428
+ result = Nucleon.command({
429
+ :command => :git,
430
+ :data => { 'git-dir=' => git.git_dir },
431
+ :subcommand => {
432
+ :command => :pull,
433
+ :flags => flags,
434
+ :args => [ processed_remote, local_revision ]
435
+ }
436
+ }, config.get(:provider, Nucleon.type_default(:command))).exec(config.import({ :quiet => true })) do |op, command, data|
437
+ block_given? ? yield(op, command, data) : true
438
+ end
439
+
440
+ if result.status == code.success
441
+ new?(true)
442
+ success = true
443
+ end
444
+ end
445
+ end
446
+ success
412
447
  end
413
448
  end
414
449
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "nucleon"
8
- s.version = "0.1.4"
8
+ s.version = "0.1.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Adrian Webb"]
12
- s.date = "2014-03-05"
12
+ s.date = "2014-03-16"
13
13
  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"
14
14
  s.email = "adrian.webb@coralnexus.com"
15
15
  s.executables = ["nucleon"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nucleon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-05 00:00:00.000000000 Z
12
+ date: 2014-03-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: log4r
16
- requirement: &17443440 !ruby/object:Gem::Requirement
16
+ requirement: &21624320 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '1.1'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *17443440
24
+ version_requirements: *21624320
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: i18n
27
- requirement: &17442440 !ruby/object:Gem::Requirement
27
+ requirement: &21623400 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0.6'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *17442440
35
+ version_requirements: *21623400
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: netrc
38
- requirement: &17441440 !ruby/object:Gem::Requirement
38
+ requirement: &21180980 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0.7'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *17441440
46
+ version_requirements: *21180980
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: deep_merge
49
- requirement: &17440400 !ruby/object:Gem::Requirement
49
+ requirement: &20893780 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '1.0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *17440400
57
+ version_requirements: *20893780
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: multi_json
60
- requirement: &17439420 !ruby/object:Gem::Requirement
60
+ requirement: &20891780 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '1.7'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *17439420
68
+ version_requirements: *20891780
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: sshkey
71
- requirement: &17438100 !ruby/object:Gem::Requirement
71
+ requirement: &20890120 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '1.6'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *17438100
79
+ version_requirements: *20890120
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: childprocess
82
- requirement: &17435380 !ruby/object:Gem::Requirement
82
+ requirement: &20875100 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 0.5.0
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *17435380
90
+ version_requirements: *20875100
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: celluloid
93
- requirement: &17432340 !ruby/object:Gem::Requirement
93
+ requirement: &20868900 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0.15'
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *17432340
101
+ version_requirements: *20868900
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: grit
104
- requirement: &17431060 !ruby/object:Gem::Requirement
104
+ requirement: &20863720 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '2.5'
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *17431060
112
+ version_requirements: *20863720
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: octokit
115
- requirement: &17429200 !ruby/object:Gem::Requirement
115
+ requirement: &20862300 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ~>
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '2.7'
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *17429200
123
+ version_requirements: *20862300
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: bundler
126
- requirement: &17426380 !ruby/object:Gem::Requirement
126
+ requirement: &20860560 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ~>
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '1.2'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *17426380
134
+ version_requirements: *20860560
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: jeweler
137
- requirement: &17424440 !ruby/object:Gem::Requirement
137
+ requirement: &20859660 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ~>
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: '2.0'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *17424440
145
+ version_requirements: *20859660
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: rspec
148
- requirement: &17423620 !ruby/object:Gem::Requirement
148
+ requirement: &20858540 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ~>
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: '2.10'
154
154
  type: :development
155
155
  prerelease: false
156
- version_requirements: *17423620
156
+ version_requirements: *20858540
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: rdoc
159
- requirement: &17422640 !ruby/object:Gem::Requirement
159
+ requirement: &20853600 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ~>
@@ -164,10 +164,10 @@ dependencies:
164
164
  version: '3.12'
165
165
  type: :development
166
166
  prerelease: false
167
- version_requirements: *17422640
167
+ version_requirements: *20853600
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: yard
170
- requirement: &17420960 !ruby/object:Gem::Requirement
170
+ requirement: &20851920 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ~>
@@ -175,7 +175,7 @@ dependencies:
175
175
  version: '0.8'
176
176
  type: :development
177
177
  prerelease: false
178
- version_requirements: *17420960
178
+ version_requirements: *20851920
179
179
  description: ! '
180
180
 
181
181
  A framework that provides a simple foundation for building Ruby applications that