fig 0.2.5 → 1.0.0

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/Changes CHANGED
@@ -1,3 +1,49 @@
1
+ v1.0.0
2
+
3
+ New features:
4
+
5
+ - New --suppress-all-includes and --suppress-cross-package-includes options
6
+ prevent package traversal. The driving use case is retrieving individual
7
+ components of path statements. Say you have a package definition that
8
+ looked like:
9
+
10
+ config default
11
+ include something/some-version
12
+ include other/whatever
13
+ add CLASSPATH=@/foo.jar
14
+ end
15
+
16
+ You could then get the portion of CLASSPATH from the package definition
17
+ only and not any dependencies via
18
+
19
+ fig --suppress-all-includes --get CLASSPATH
20
+
21
+ If you've got multiple config blocks, you can still have intra-package
22
+ dependencies take effect:
23
+
24
+ config default
25
+ include something/some-version
26
+ include other/whatever
27
+ include :base-environment
28
+ end
29
+
30
+ config base-environment
31
+ add CLASSPATH=@/foo.jar
32
+ end
33
+
34
+ You just allow those includes to work:
35
+
36
+ fig --suppress-cross-package-includes --get CLASSPATH
37
+
38
+ - New --suppress-cleanup-of-retrieves option that stops Fig from deleting
39
+ files previously downloaded as a result of a retrieve statement. Useful if
40
+ you wish to toggle between multiple configurations rapidly without waiting
41
+ for file shuffling.
42
+
43
+ v0.2.6.beta.1
44
+
45
+ - Test release
46
+
1
47
  v0.2.5
2
48
 
3
49
  Backwards incompatibilities:
data/lib/fig.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Fig
2
- VERSION = '0.2.5'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -243,7 +243,9 @@ class Fig::Command
243
243
 
244
244
  Fig::AtExit.add do
245
245
  working_directory_maintainer.prepare_for_shutdown(
246
- @base_package && retrieves_should_happen?
246
+ @base_package &&
247
+ retrieves_should_happen? &&
248
+ ! @options.suppress_cleanup_of_retrieves
247
249
  )
248
250
  end
249
251
 
@@ -253,7 +255,10 @@ class Fig::Command
253
255
  end
254
256
 
255
257
  @environment = Fig::RuntimeEnvironment.new(
256
- @repository, environment_variables, working_directory_maintainer
258
+ @repository,
259
+ @options.suppress_includes,
260
+ environment_variables,
261
+ working_directory_maintainer,
257
262
  )
258
263
 
259
264
  Fig::AtExit.add { @environment.check_unused_retrieves() }
@@ -82,6 +82,21 @@ module Fig::Command::Action
82
82
  return false
83
83
  end
84
84
 
85
+ # Is this --list-dependencies?
86
+ def list_dependencies?()
87
+ return false
88
+ end
89
+
90
+ # Is this --list-variables?
91
+ def list_variables?()
92
+ return false
93
+ end
94
+
95
+ # Is this a publish action?
96
+ def publish?()
97
+ return false
98
+ end
99
+
85
100
  # Answers whether we should reset the environment to nothing, sort of like
86
101
  # the standardized environment that cron(1) creates. At present, we're only
87
102
  # setting this when we're listing variables. One could imagine allowing this
@@ -16,4 +16,9 @@ class Fig::Command::Action::ListDependencies
16
16
 
17
17
  return %w<--list-dependencies>
18
18
  end
19
+
20
+ # Is this --list-dependencies?
21
+ def list_dependencies?()
22
+ return true
23
+ end
19
24
  end
@@ -20,4 +20,9 @@ class Fig::Command::Action::ListVariables
20
20
  def reset_environment?()
21
21
  return true
22
22
  end
23
+
24
+ # Is this --list-variables?
25
+ def list_variables?()
26
+ return true
27
+ end
23
28
  end
@@ -47,6 +47,11 @@ module Fig::Command::Action::Role::Publish
47
47
  return nil # don't care
48
48
  end
49
49
 
50
+ # Is this a publish action?
51
+ def publish?()
52
+ return true
53
+ end
54
+
50
55
  def configure(options)
51
56
  @descriptor = options.descriptor
52
57
  @environment_statements = options.environment_statements
@@ -42,6 +42,7 @@ class Fig::Command; end
42
42
 
43
43
  # Command-line processing.
44
44
  class Fig::Command::Options
45
+ attr_reader :asset_statements
45
46
  attr_reader :command_extra_argv
46
47
  attr_reader :config
47
48
  attr_reader :descriptor
@@ -51,10 +52,11 @@ class Fig::Command::Options
51
52
  attr_reader :home
52
53
  attr_reader :log_config
53
54
  attr_reader :log_level
54
- attr_reader :asset_statements
55
55
  attr_reader :package_definition_file
56
56
  attr_reader :parser
57
57
  attr_reader :shell_command
58
+ attr_reader :suppress_cleanup_of_retrieves
59
+ attr_reader :suppress_includes
58
60
  attr_reader :update_lock_response
59
61
  attr_reader :variable_to_get
60
62
  attr_accessor :version_message
@@ -89,6 +91,8 @@ class Fig::Command::Options
89
91
  end
90
92
  set_up_sub_actions()
91
93
 
94
+ validate
95
+
92
96
  actions().each {|action| action.configure(self)}
93
97
 
94
98
  return
@@ -187,7 +191,7 @@ class Fig::Command::Options
187
191
  end
188
192
 
189
193
  def set_up_parser()
190
- set_up_package_configuration_source()
194
+ set_up_package_definition()
191
195
  set_up_remote_repository_access()
192
196
  set_up_commands()
193
197
  set_up_environment_statements()
@@ -359,7 +363,7 @@ class Fig::Command::Options
359
363
  \z
360
364
  >x
361
365
 
362
- def set_up_package_configuration_source()
366
+ def set_up_package_definition()
363
367
  @parser.on(
364
368
  '-c',
365
369
  '--config CONFIG',
@@ -369,19 +373,31 @@ class Fig::Command::Options
369
373
  @config = config
370
374
  end
371
375
 
372
- @package_definition_file = nil
373
376
  @parser.on(
374
377
  '--file FILE',
375
378
  FILE_OPTION_VALUE_PATTERN,
376
379
  %q<read package definition FILE. Use '-' for stdin. See also --no-file>
377
380
  ) do |path|
378
- @package_definition_file = path
381
+ set_package_definition_file(path)
379
382
  end
380
383
 
381
384
  @parser.on(
382
385
  '--no-file', 'ignore package.fig file in current directory'
383
- ) do |path|
384
- @package_definition_file = :none
386
+ ) do
387
+ set_package_definition_file(:none)
388
+ end
389
+
390
+ @parser.on(
391
+ '--suppress-all-includes', %q<don't process include statements>,
392
+ ) do
393
+ set_suppress_includes(:all)
394
+ end
395
+
396
+ @parser.on(
397
+ '--suppress-cross-package-includes',
398
+ %q<don't process includes of configs from other packages>,
399
+ ) do
400
+ set_suppress_includes(:cross_package)
385
401
  end
386
402
 
387
403
  return
@@ -486,7 +502,7 @@ class Fig::Command::Options
486
502
  @parser.on(
487
503
  '-u',
488
504
  '--update',
489
- 'check remote repo for updates and download to $FIG_HOME as necessary'
505
+ 'check remote repo for updates, download to $FIG_HOME and process retrieves'
490
506
  ) do
491
507
  set_update_action(Fig::Command::Action::Update)
492
508
  end
@@ -499,6 +515,13 @@ class Fig::Command::Options
499
515
  set_update_action(Fig::Command::Action::UpdateIfMissing)
500
516
  end
501
517
 
518
+ @parser.on(
519
+ '--suppress-cleanup-of-retrieves',
520
+ %q<don't delete files from unreferenced retrieves>,
521
+ ) do
522
+ @suppress_cleanup_of_retrieves = true
523
+ end
524
+
502
525
  @parser.on(
503
526
  '-l', '--login', 'login to remote repo as a non-anonymous user'
504
527
  ) do
@@ -587,6 +610,30 @@ class Fig::Command::Options
587
610
  return
588
611
  end
589
612
 
613
+ def set_package_definition_file(value)
614
+ if @package_definition_file
615
+ raise Fig::Command::OptionError.new(
616
+ 'Can only specify one --file/--no-file option.'
617
+ )
618
+ end
619
+
620
+ @package_definition_file = value
621
+
622
+ return
623
+ end
624
+
625
+ def set_suppress_includes(value)
626
+ if @suppress_includes
627
+ raise Fig::Command::OptionError.new(
628
+ 'Can only specify one --suppress-all-includes/--suppress-cross-package-includes option.'
629
+ )
630
+ end
631
+
632
+ @suppress_includes = value
633
+
634
+ return
635
+ end
636
+
590
637
  def set_update_action(update_action_class)
591
638
  update_action = update_action_class.new
592
639
  if @update_action
@@ -596,6 +643,8 @@ class Fig::Command::Options
596
643
  end
597
644
 
598
645
  @update_action = update_action
646
+
647
+ return
599
648
  end
600
649
 
601
650
  def new_variable_statement(option, name_value, statement_class)
@@ -621,6 +670,48 @@ class Fig::Command::Options
621
670
  return statement_class.new(nil, "#{option} option", path, need_to_glob)
622
671
  end
623
672
 
673
+ def validate()
674
+ if suppress_includes
675
+ if list_tree?
676
+ # Not conceptually incompatible, just not implemented (would need to
677
+ # handle in command/action/role/list_*)
678
+ raise Fig::Command::OptionError.new(
679
+ 'Cannot use --suppress-all-includes/--suppress-cross-package-includes with --list-tree.'
680
+ )
681
+ elsif list_all_configs?
682
+ # Not conceptually incompatible, just not implemented (would need to
683
+ # handle in command/action/role/list_*)
684
+ raise Fig::Command::OptionError.new(
685
+ 'Cannot use --suppress-all-includes/--suppress-cross-package-includes with --list-all-configs.'
686
+ )
687
+ elsif @base_action.list_dependencies?
688
+ raise Fig::Command::OptionError.new(
689
+ %q<It doesn't make much sense to suppress dependencies when attempting to list them.>
690
+ )
691
+ elsif @base_action.publish?
692
+ # Don't want to support broken publishes (though versionless includes
693
+ # are pretty broken).
694
+ raise Fig::Command::OptionError.new(
695
+ 'Cannot use --suppress-all-includes/--suppress-cross-package-includes when publishing.'
696
+ )
697
+ end
698
+ elsif list_tree?
699
+ if ! @base_action.list_dependencies? && ! @base_action.list_variables?
700
+ raise Fig::Command::OptionError.new(
701
+ %q<The --list-tree option isn't useful without --list-dependencies/--list-variables.>
702
+ )
703
+ end
704
+ elsif list_all_configs?
705
+ if ! @base_action.list_dependencies? && ! @base_action.list_variables?
706
+ raise Fig::Command::OptionError.new(
707
+ %q<The --list-all-configs option isn't useful without --list-dependencies/--list-variables.>
708
+ )
709
+ end
710
+ end
711
+
712
+ return
713
+ end
714
+
624
715
  def set_up_sub_actions()
625
716
  if @base_action and @base_action.sub_action?
626
717
  # This is a cheat because the only things with sub-actions at present are
@@ -4,6 +4,7 @@ require 'fig/parser'
4
4
  module Fig; end
5
5
  class Fig::Command; end
6
6
 
7
+ # Loads the base package.
7
8
  class Fig::Command::PackageLoader
8
9
  attr_reader :package_loaded_from_path
9
10
 
@@ -35,7 +36,7 @@ class Fig::Command::PackageLoader
35
36
  if @descriptor.nil?
36
37
  load_package_object_from_file()
37
38
  else
38
- @base_package = @repository.get_package(@descriptor)
39
+ set_base_package @repository.get_package(@descriptor)
39
40
  end
40
41
 
41
42
  return @base_package
@@ -103,30 +104,42 @@ class Fig::Command::PackageLoader
103
104
  :source_description => source_description
104
105
  )
105
106
 
106
- @base_package =
107
- Fig::Parser.new(@application_configuration, :check_include_versions).parse_package(
107
+ set_base_package(
108
+ Fig::Parser.new(
109
+ @application_configuration, :check_include_versions
110
+ ).parse_package(
108
111
  descriptor, '.', source_description, definition_text
109
112
  )
113
+ )
110
114
 
111
115
  return
112
116
  end
113
117
 
114
118
  def set_base_package_to_empty_synthetic_one()
115
- @base_package = Fig::Package.new(
116
- nil,
117
- nil,
118
- 'synthetic',
119
- '.',
120
- [
121
- Fig::Statement::Configuration.new(
122
- nil,
123
- %Q<[synthetic statement created in #{__FILE__} line #{__LINE__}]>,
124
- @base_config,
125
- []
126
- )
127
- ]
119
+ set_base_package(
120
+ Fig::Package.new(
121
+ nil,
122
+ nil,
123
+ 'synthetic',
124
+ '.',
125
+ [
126
+ Fig::Statement::Configuration.new(
127
+ nil,
128
+ %Q<[synthetic statement created in #{__FILE__} line #{__LINE__}]>,
129
+ @base_config,
130
+ []
131
+ )
132
+ ]
133
+ )
128
134
  )
129
135
 
130
136
  return
131
137
  end
138
+
139
+ def set_base_package(package)
140
+ @base_package = package
141
+ package.set_base true
142
+
143
+ return
144
+ end
132
145
  end
@@ -32,11 +32,11 @@ class Fig::OperatingSystem
32
32
  UNIX_FILE_NAME_ILLEGAL_CHARACTERS = %w[ / ]
33
33
 
34
34
  def self.windows?
35
- RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
35
+ return !! (RbConfig::CONFIG['host_os'] =~ /mswin|mingw/)
36
36
  end
37
37
 
38
38
  def self.unix?
39
- !windows?
39
+ ! Fig::OperatingSystem.windows?
40
40
  end
41
41
 
42
42
  def self.file_name_illegal_characters()
@@ -94,7 +94,7 @@ class Fig::OperatingSystem
94
94
  end
95
95
 
96
96
  def list(dir)
97
- Dir.entries(dir) - ['.','..']
97
+ Dir.entries(dir) - ['.', '..']
98
98
  end
99
99
 
100
100
  def mtime(path)
@@ -442,15 +442,20 @@ class Fig::OperatingSystem
442
442
  # .tar.gz
443
443
  # .tgz
444
444
  # .zip
445
- def unpack_archive(directory, file)
445
+ def unpack_archive(directory, archive_path)
446
446
  FileUtils.mkdir_p directory
447
447
  Dir.chdir(directory) do
448
- if ! File.exists? file
449
- raise Fig::RepositoryError.new "#{file} does not exist."
448
+ if ! File.exists? archive_path
449
+ raise Fig::RepositoryError.new "#{archive_path} does not exist."
450
450
  end
451
451
 
452
- ::Archive.read_open_filename(file) do |reader|
452
+ running_on_windows = Fig::OperatingSystem.windows?
453
+ ::Archive.read_open_filename(archive_path) do |reader|
453
454
  while entry = reader.next_header
455
+ if running_on_windows
456
+ check_archive_entry_for_windows entry, archive_path
457
+ end
458
+
454
459
  begin
455
460
  reader.extract(entry)
456
461
  rescue Archive::Error => exception
@@ -459,7 +464,7 @@ class Fig::OperatingSystem
459
464
  message = exception.message.sub /^Extract archive failed: /, ''
460
465
  new_exception =
461
466
  Fig::RepositoryError.new(
462
- "Could not extract #{entry.pathname} from #{file}: #{message}"
467
+ "Could not extract #{entry.pathname} from #{archive_path}: #{message}"
463
468
  )
464
469
 
465
470
  new_exception.set_backtrace exception.backtrace
@@ -508,6 +513,29 @@ class Fig::OperatingSystem
508
513
  NOT_MODIFIED = 3
509
514
  NOT_FOUND = 4
510
515
 
516
+ def check_archive_entry_for_windows(entry, archive_path)
517
+ bad_type = nil
518
+ if entry.symbolic_link?
519
+ bad_type = 'symbolic link'
520
+ elsif entry.block_special?
521
+ bad_type = 'block device'
522
+ elsif entry.character_special?
523
+ bad_type = 'character device'
524
+ elsif entry.fifo?
525
+ bad_type = 'pipe'
526
+ elsif entry.socket?
527
+ bad_type = 'socket'
528
+ end
529
+
530
+ if bad_type
531
+ raise Fig::RepositoryError.new(
532
+ "Could not extract #{entry.pathname} from #{archive_path} because it is a #{bad_type}."
533
+ )
534
+ end
535
+
536
+ return
537
+ end
538
+
511
539
  # path = The local path the file should be downloaded to.
512
540
  # command = The command to be run on the remote host.
513
541
  def ssh_download(user, host, path, command)
@@ -36,6 +36,17 @@ class Fig::Package
36
36
  @backtrace = nil
37
37
  end
38
38
 
39
+ # Is this the base package?
40
+ def base?()
41
+ return @base
42
+ end
43
+
44
+ def set_base(yea_or_nay)
45
+ @base = yea_or_nay
46
+
47
+ return
48
+ end
49
+
39
50
  def [](config_name)
40
51
  @statements.each do |stmt|
41
52
  return stmt if stmt.is_a?(Fig::Statement::Configuration) && stmt.name == config_name
@@ -133,23 +144,17 @@ class Fig::Package
133
144
  end
134
145
 
135
146
  def to_s_with_config(config_name)
136
- string = nil
137
-
138
- if name.nil?
139
- string = UNPUBLISHED
140
- else
141
- string = to_s
142
- end
143
-
144
- if not config_name.nil? and config_name != DEFAULT_CONFIG
145
- string += ":#{config_name}"
146
- end
147
-
148
- return string
147
+ displayed_config = config_name == DEFAULT_CONFIG ? nil : config_name
148
+ return Fig::PackageDescriptor.format(
149
+ name || UNPUBLISHED, version, displayed_config
150
+ )
149
151
  end
150
152
 
151
- def to_s_with_primary_config()
152
- return to_s_with_config(primary_config_name)
153
+ # Useful for debugging; should not be used for regular output.
154
+ def to_descriptive_string_with_config(config_name)
155
+ return Fig::PackageDescriptor.format(
156
+ name, version, config_name, :use_default_config, description
157
+ )
153
158
  end
154
159
 
155
160
  private
@@ -31,12 +31,12 @@ class Fig::PackageDefinitionTextAssembler
31
31
  end
32
32
 
33
33
  # Argument can either be a single Statement or an array of them.
34
- def add_output(statements)
35
- @output_statements << statements
36
- @output_statements.flatten!
37
-
34
+ def add_output(*statements)
38
35
  # Version gets determined by other statements, not by existing grammar.
39
- @output_statements.reject! { |s| s.is_a? Fig::Statement::GrammarVersion }
36
+ @output_statements <<
37
+ statements.reject { |s| s.is_a? Fig::Statement::GrammarVersion }
38
+
39
+ @output_statements.flatten!
40
40
 
41
41
  return
42
42
  end
@@ -4,6 +4,7 @@ require 'socket'
4
4
  require 'sys/admin'
5
5
  require 'tmpdir'
6
6
 
7
+ require 'fig/statement/synthetic_raw_text'
7
8
  require 'fig'
8
9
  require 'fig/at_exit'
9
10
  require 'fig/file_not_found_error'
@@ -221,6 +222,7 @@ class Fig::RepositoryPackagePublisher
221
222
  Fig::AtExit.add { FileUtils.rm_f(file) }
222
223
 
223
224
  @text_assembler.add_output(
225
+ Fig::Statement::SyntheticRawText.new(nil, nil, "\n"),
224
226
  Fig::Statement::Archive.new(
225
227
  nil,
226
228
  %Q<[synthetic statement created in #{__FILE__} line #{__LINE__}]>,
@@ -3,6 +3,7 @@ require 'stringio'
3
3
  require 'fig/include_backtrace'
4
4
  require 'fig/logging'
5
5
  require 'fig/package'
6
+ require 'fig/package_descriptor'
6
7
  require 'fig/repository_error'
7
8
  require 'fig/statement/include'
8
9
  require 'fig/statement/override'
@@ -21,16 +22,22 @@ class Fig::RuntimeEnvironment
21
22
  # noun and not a verb, e.g. "retrieve path" means the value of a retrieve
22
23
  # statement and not the action of retrieving a path.
23
24
 
24
- def initialize(repository, variables_override, working_directory_maintainer)
25
- @repository = repository
26
- @variables =
25
+ def initialize(
26
+ repository,
27
+ suppress_includes,
28
+ variables_override,
29
+ working_directory_maintainer
30
+ )
31
+ @repository = repository
32
+ @suppress_includes = suppress_includes
33
+ @variables =
27
34
  variables_override || Fig::OperatingSystem.get_environment_variables()
28
- @retrieves = {}
29
- @packages = {}
35
+ @retrieves = {}
36
+ @packages = {}
30
37
  @working_directory_maintainer = working_directory_maintainer
31
38
  end
32
39
 
33
- # Returns the value of an envirionment variable
40
+ # Returns the value of an environment variable
34
41
  def [](name)
35
42
  return @variables[name]
36
43
  end
@@ -94,12 +101,14 @@ class Fig::RuntimeEnvironment
94
101
 
95
102
  config = package[config_name]
96
103
 
97
- Fig::Logging.debug("Applying #{package}:#{config_name}.")
104
+ Fig::Logging.debug(
105
+ "Applying #{package.to_descriptive_string_with_config config_name}."
106
+ )
107
+ package.add_applied_config_name(config_name)
98
108
  config.statements.each do
99
109
  |statement|
100
110
  apply_config_statement(package, statement, new_backtrace)
101
111
  end
102
- package.add_applied_config_name(config_name)
103
112
 
104
113
  return
105
114
  end
@@ -154,7 +163,32 @@ class Fig::RuntimeEnvironment
154
163
  return
155
164
  end
156
165
 
166
+ def check_unused_retrieves()
167
+ @retrieves.keys().sort().each do
168
+ |name|
169
+
170
+ statement = @retrieves[name]
171
+ if statement.loaded_but_not_referenced?
172
+ text, * = Fig::Unparser.determine_version_and_unparse(
173
+ [statement], :emit_as_input
174
+ )
175
+ Fig::Logging.warn \
176
+ %Q<The #{name} variable was never referenced or didn't need expansion, so "#{text.strip}"#{statement.position_string} was ignored.>
177
+ end
178
+ end
179
+ end
180
+
181
+ private
182
+
157
183
  def include_config(starting_package, descriptor, backtrace)
184
+ # Because package application starts with the synthetic package for the
185
+ # command-line, we can't really disable includes, full stop. Instead, we
186
+ # use the flag on the base package to break the chain of includes.
187
+ #
188
+ # Alternative approach: We could put a flag on synthetic include statements
189
+ # that says to always apply them.
190
+ return if starting_package.base? && @suppress_includes == :all
191
+
158
192
  resolved_descriptor = nil
159
193
 
160
194
  # Check to see if this include has been overridden.
@@ -176,6 +210,12 @@ class Fig::RuntimeEnvironment
176
210
  resolved_descriptor.version,
177
211
  new_backtrace
178
212
  )
213
+
214
+ return if \
215
+ starting_package.base? \
216
+ && @suppress_includes == :cross_package \
217
+ && package != starting_package
218
+
179
219
  apply_config(
180
220
  package,
181
221
  resolved_descriptor.config || Fig::Package::DEFAULT_CONFIG,
@@ -185,23 +225,6 @@ class Fig::RuntimeEnvironment
185
225
  return
186
226
  end
187
227
 
188
- def check_unused_retrieves()
189
- @retrieves.keys().sort().each do
190
- |name|
191
-
192
- statement = @retrieves[name]
193
- if statement.loaded_but_not_referenced?
194
- text, * = Fig::Unparser.determine_version_and_unparse(
195
- [statement], :emit_as_input
196
- )
197
- Fig::Logging.warn \
198
- %Q<The #{name} variable was never referenced or didn't need expansion, so "#{text.strip}"#{statement.position_string} was ignored.>
199
- end
200
- end
201
- end
202
-
203
- private
204
-
205
228
  def set_variable(package, statement, backtrace)
206
229
  expanded_value = expand_variable_as_path_and_process_retrieves(
207
230
  statement, package, backtrace
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fig
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 1.0.0
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: 2012-12-13 00:00:00.000000000 Z
12
+ date: 2013-01-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: colorize
16
- requirement: &17770220 !ruby/object:Gem::Requirement
16
+ requirement: &19793840 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.5.8
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *17770220
24
+ version_requirements: *19793840
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: highline
27
- requirement: &17769520 !ruby/object:Gem::Requirement
27
+ requirement: &19793360 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.6.2
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *17769520
35
+ version_requirements: *19793360
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: json
38
- requirement: &17768840 !ruby/object:Gem::Requirement
38
+ requirement: &19792900 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.6.5
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *17768840
46
+ version_requirements: *19792900
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: libarchive-static
49
- requirement: &17768160 !ruby/object:Gem::Requirement
49
+ requirement: &19792420 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.0.0
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *17768160
57
+ version_requirements: *19792420
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: log4r
60
- requirement: &17831440 !ruby/object:Gem::Requirement
60
+ requirement: &19791920 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.1.5
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *17831440
68
+ version_requirements: *19791920
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: net-netrc
71
- requirement: &17830680 !ruby/object:Gem::Requirement
71
+ requirement: &19791440 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.2.2
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *17830680
79
+ version_requirements: *19791440
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: net-sftp
82
- requirement: &17829940 !ruby/object:Gem::Requirement
82
+ requirement: &19809640 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 2.0.4
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *17829940
90
+ version_requirements: *19809640
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: net-ssh
93
- requirement: &17829240 !ruby/object:Gem::Requirement
93
+ requirement: &19809160 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 2.0.15
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *17829240
101
+ version_requirements: *19809160
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rdoc
104
- requirement: &17828260 !ruby/object:Gem::Requirement
104
+ requirement: &19808580 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '3.12'
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *17828260
112
+ version_requirements: *19808580
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: sys-admin
115
- requirement: &17826460 !ruby/object:Gem::Requirement
115
+ requirement: &19808100 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 1.5.6
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *17826460
123
+ version_requirements: *19808100
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: treetop
126
- requirement: &17825240 !ruby/object:Gem::Requirement
126
+ requirement: &19807540 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: 1.4.2
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *17825240
134
+ version_requirements: *19807540
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: open4
137
- requirement: &17824080 !ruby/object:Gem::Requirement
137
+ requirement: &19806720 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: 1.0.1
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *17824080
145
+ version_requirements: *19806720
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: bundler
148
- requirement: &17823440 !ruby/object:Gem::Requirement
148
+ requirement: &19806240 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ! '>='
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: 1.0.15
154
154
  type: :development
155
155
  prerelease: false
156
- version_requirements: *17823440
156
+ version_requirements: *19806240
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: rake
159
- requirement: &17839540 !ruby/object:Gem::Requirement
159
+ requirement: &19805740 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ! '>='
@@ -164,10 +164,10 @@ dependencies:
164
164
  version: 0.8.7
165
165
  type: :development
166
166
  prerelease: false
167
- version_requirements: *17839540
167
+ version_requirements: *19805740
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: rspec
170
- requirement: &17838580 !ruby/object:Gem::Requirement
170
+ requirement: &19805280 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ~>
@@ -175,10 +175,10 @@ dependencies:
175
175
  version: '2'
176
176
  type: :development
177
177
  prerelease: false
178
- version_requirements: *17838580
178
+ version_requirements: *19805280
179
179
  - !ruby/object:Gem::Dependency
180
180
  name: rspec-core
181
- requirement: &17835700 !ruby/object:Gem::Requirement
181
+ requirement: &19804800 !ruby/object:Gem::Requirement
182
182
  none: false
183
183
  requirements:
184
184
  - - ! '>='
@@ -186,10 +186,10 @@ dependencies:
186
186
  version: 2.7.1
187
187
  type: :development
188
188
  prerelease: false
189
- version_requirements: *17835700
189
+ version_requirements: *19804800
190
190
  - !ruby/object:Gem::Dependency
191
191
  name: rspec-expectations
192
- requirement: &17833380 !ruby/object:Gem::Requirement
192
+ requirement: &19804340 !ruby/object:Gem::Requirement
193
193
  none: false
194
194
  requirements:
195
195
  - - ! '>='
@@ -197,10 +197,10 @@ dependencies:
197
197
  version: 2.7.0
198
198
  type: :development
199
199
  prerelease: false
200
- version_requirements: *17833380
200
+ version_requirements: *19804340
201
201
  - !ruby/object:Gem::Dependency
202
202
  name: rspec-mocks
203
- requirement: &17852720 !ruby/object:Gem::Requirement
203
+ requirement: &19803860 !ruby/object:Gem::Requirement
204
204
  none: false
205
205
  requirements:
206
206
  - - ! '>='
@@ -208,10 +208,10 @@ dependencies:
208
208
  version: 2.7.0
209
209
  type: :development
210
210
  prerelease: false
211
- version_requirements: *17852720
211
+ version_requirements: *19803860
212
212
  - !ruby/object:Gem::Dependency
213
213
  name: simplecov
214
- requirement: &17851120 !ruby/object:Gem::Requirement
214
+ requirement: &19803380 !ruby/object:Gem::Requirement
215
215
  none: false
216
216
  requirements:
217
217
  - - ! '>='
@@ -219,10 +219,10 @@ dependencies:
219
219
  version: 0.6.2
220
220
  type: :development
221
221
  prerelease: false
222
- version_requirements: *17851120
222
+ version_requirements: *19803380
223
223
  - !ruby/object:Gem::Dependency
224
224
  name: simplecov-html
225
- requirement: &17849340 !ruby/object:Gem::Requirement
225
+ requirement: &19802920 !ruby/object:Gem::Requirement
226
226
  none: false
227
227
  requirements:
228
228
  - - ! '>='
@@ -230,7 +230,7 @@ dependencies:
230
230
  version: 0.5.3
231
231
  type: :development
232
232
  prerelease: false
233
- version_requirements: *17849340
233
+ version_requirements: *19802920
234
234
  description: Fig is a utility for configuring environments and managing dependencies
235
235
  across a team of developers. Given a list of packages and a command to run, Fig
236
236
  builds environment variables named in those packages (e.g., CLASSPATH), then executes