fig 1.4.0 → 1.5.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 +140 -68
- data/lib/fig.rb +1 -1
- data/lib/fig/command.rb +8 -8
- data/lib/fig/command/action/dump_package_definition_for_command_line.rb +1 -2
- data/lib/fig/command/action/dump_package_definition_parsed.rb +1 -1
- data/lib/fig/command/package_loader.rb +7 -6
- data/lib/fig/{unparser.rb → deparser.rb} +13 -14
- data/lib/fig/{unparser → deparser}/v0.rb +4 -4
- data/lib/fig/{unparser → deparser}/v1.rb +6 -6
- data/lib/fig/{unparser → deparser}/v1_base.rb +2 -2
- data/lib/fig/{unparser → deparser}/v2.rb +6 -6
- data/lib/fig/not_yet_parsed_package.rb +2 -2
- data/lib/fig/operating_system.rb +1 -1
- data/lib/fig/package.rb +12 -12
- data/lib/fig/package_definition_text_assembler.rb +11 -11
- data/lib/fig/parser_package_build_state.rb +1 -1
- data/lib/fig/repository.rb +57 -41
- data/lib/fig/repository_package_publisher.rb +3 -2
- data/lib/fig/runtime_environment.rb +7 -5
- data/lib/fig/statement.rb +1 -1
- data/lib/fig/statement/archive.rb +2 -2
- data/lib/fig/statement/command.rb +2 -2
- data/lib/fig/statement/configuration.rb +3 -3
- data/lib/fig/statement/grammar_version.rb +2 -2
- data/lib/fig/statement/include.rb +3 -3
- data/lib/fig/statement/include_file.rb +2 -2
- data/lib/fig/statement/override.rb +2 -2
- data/lib/fig/statement/path.rb +2 -2
- data/lib/fig/statement/resource.rb +2 -2
- data/lib/fig/statement/retrieve.rb +2 -2
- data/lib/fig/statement/set.rb +2 -2
- data/lib/fig/statement/synthetic_raw_text.rb +2 -2
- metadata +47 -47
data/lib/fig.rb
CHANGED
data/lib/fig/command.rb
CHANGED
@@ -248,14 +248,14 @@ class Fig::Command
|
|
248
248
|
end
|
249
249
|
|
250
250
|
def prepare_runtime_environment()
|
251
|
-
|
251
|
+
if retrieves_should_happen?
|
252
|
+
@working_directory_maintainer = Fig::WorkingDirectoryMaintainer.new('.')
|
252
253
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
)
|
254
|
+
Fig::AtExit.add do
|
255
|
+
@working_directory_maintainer.prepare_for_shutdown(
|
256
|
+
@base_package && ! @options.suppress_cleanup_of_retrieves
|
257
|
+
)
|
258
|
+
end
|
259
259
|
end
|
260
260
|
|
261
261
|
environment_variables = nil
|
@@ -455,7 +455,7 @@ class Fig::Command
|
|
455
455
|
end
|
456
456
|
|
457
457
|
def should_perform?(actions, failure_description, &predicate)
|
458
|
-
yes_actions, no_actions = actions.partition
|
458
|
+
yes_actions, no_actions = actions.partition(&predicate)
|
459
459
|
# Filter out the "don't care" actions".
|
460
460
|
no_actions = no_actions.select { |action| ! predicate.call(action).nil? }
|
461
461
|
|
@@ -55,7 +55,7 @@ class Fig::Command::Action::DumpPackageDefinitionParsed
|
|
55
55
|
text_assembler = Fig::PackageDefinitionTextAssembler.new :emit_as_input
|
56
56
|
text_assembler.add_output package.statements
|
57
57
|
|
58
|
-
unparsed,
|
58
|
+
unparsed, * = text_assembler.assemble_package_definition
|
59
59
|
print unparsed
|
60
60
|
|
61
61
|
return
|
@@ -80,7 +80,7 @@ class Fig::Command::PackageLoader
|
|
80
80
|
def read_in_package_definition_file(config_file)
|
81
81
|
if File.exist?(config_file)
|
82
82
|
@package_loaded_from_path = config_file
|
83
|
-
@
|
83
|
+
@package_include_file_base_directory = File.dirname config_file
|
84
84
|
|
85
85
|
return File.read(config_file)
|
86
86
|
else
|
@@ -107,11 +107,12 @@ class Fig::Command::PackageLoader
|
|
107
107
|
)
|
108
108
|
|
109
109
|
unparsed_package = Fig::NotYetParsedPackage.new
|
110
|
-
unparsed_package.descriptor
|
111
|
-
unparsed_package.working_directory
|
112
|
-
unparsed_package.
|
113
|
-
|
114
|
-
unparsed_package.
|
110
|
+
unparsed_package.descriptor = descriptor
|
111
|
+
unparsed_package.working_directory = '.'
|
112
|
+
unparsed_package.include_file_base_directory =
|
113
|
+
@package_include_file_base_directory || '.'
|
114
|
+
unparsed_package.source_description = source_description
|
115
|
+
unparsed_package.unparsed_text = definition_text
|
115
116
|
|
116
117
|
set_base_package(
|
117
118
|
Fig::Parser.new(
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# Note: we very specifically do not require the files containing the
|
2
|
-
#
|
2
|
+
# Deparser classes in order to avoid circular dependencies.
|
3
3
|
|
4
4
|
module Fig; end
|
5
5
|
|
6
|
-
module Fig::
|
7
|
-
# Determine the class of
|
6
|
+
module Fig::Deparser
|
7
|
+
# Determine the class of Deparser necessary for a set of Statements; the
|
8
8
|
# parameter can be a single statement or multiple. Returns both the class
|
9
9
|
# and a list of explanations of why the class was picked.
|
10
10
|
def self.class_for_statements(
|
@@ -19,25 +19,25 @@ module Fig::Unparser
|
|
19
19
|
|
20
20
|
case version
|
21
21
|
when 0
|
22
|
-
return Fig::
|
22
|
+
return Fig::Deparser::V0, explanations
|
23
23
|
when 1
|
24
|
-
return Fig::
|
24
|
+
return Fig::Deparser::V1, explanations
|
25
25
|
when 2
|
26
|
-
return Fig::
|
26
|
+
return Fig::Deparser::V2, explanations
|
27
27
|
end
|
28
28
|
|
29
29
|
raise "Unexpected version #{version}."
|
30
30
|
end
|
31
31
|
|
32
|
-
def self.
|
32
|
+
def self.determine_version_and_deparse(
|
33
33
|
statements, emit_as_input_or_to_be_published_values
|
34
34
|
)
|
35
|
-
|
35
|
+
deparser_class, explanations = self.class_for_statements(
|
36
36
|
statements, emit_as_input_or_to_be_published_values
|
37
37
|
)
|
38
|
-
|
38
|
+
deparser = deparser_class.new emit_as_input_or_to_be_published_values
|
39
39
|
|
40
|
-
return (
|
40
|
+
return (deparser.deparse [statements].flatten), explanations
|
41
41
|
end
|
42
42
|
|
43
43
|
private
|
@@ -46,7 +46,6 @@ module Fig::Unparser
|
|
46
46
|
all_statements = gather_all_statements statements
|
47
47
|
|
48
48
|
if emit_as_input_or_to_be_published_values == :emit_as_input
|
49
|
-
versions = []
|
50
49
|
return all_statements.map {
|
51
50
|
|statement|
|
52
51
|
|
@@ -95,13 +94,13 @@ module Fig::Unparser
|
|
95
94
|
|
96
95
|
public
|
97
96
|
|
98
|
-
def
|
97
|
+
def deparse(statements)
|
99
98
|
# It's double dispatch time!
|
100
99
|
|
101
100
|
@text = ''
|
102
101
|
@indent_level = @initial_indent_level
|
103
102
|
|
104
|
-
statements.each { |statement| statement.
|
103
|
+
statements.each { |statement| statement.deparse_as_version(self) }
|
105
104
|
|
106
105
|
text = @text
|
107
106
|
@text = nil
|
@@ -135,7 +134,7 @@ module Fig::Unparser
|
|
135
134
|
configuration_statement.statements.each do
|
136
135
|
|statement|
|
137
136
|
|
138
|
-
statement.
|
137
|
+
statement.deparse_as_version(self)
|
139
138
|
end
|
140
139
|
ensure
|
141
140
|
@indent_level -= 1
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require 'fig/
|
1
|
+
require 'fig/deparser'
|
2
2
|
|
3
3
|
module Fig; end
|
4
|
-
module Fig::
|
4
|
+
module Fig::Deparser; end
|
5
5
|
|
6
6
|
# Handles serializing of statements in the v0 grammar.
|
7
|
-
class Fig::
|
8
|
-
include Fig::
|
7
|
+
class Fig::Deparser::V0
|
8
|
+
include Fig::Deparser
|
9
9
|
|
10
10
|
def initialize(
|
11
11
|
emit_as_input_or_to_be_published_values,
|
@@ -1,13 +1,13 @@
|
|
1
|
-
require 'fig/
|
2
|
-
require 'fig/
|
1
|
+
require 'fig/deparser'
|
2
|
+
require 'fig/deparser/v1_base'
|
3
3
|
|
4
4
|
module Fig; end
|
5
|
-
module Fig::
|
5
|
+
module Fig::Deparser; end
|
6
6
|
|
7
7
|
# Handles serializing of statements in the v1 grammar.
|
8
|
-
class Fig::
|
9
|
-
include Fig::
|
10
|
-
include Fig::
|
8
|
+
class Fig::Deparser::V1
|
9
|
+
include Fig::Deparser
|
10
|
+
include Fig::Deparser::V1Base
|
11
11
|
|
12
12
|
def initialize(
|
13
13
|
emit_as_input_or_to_be_published_values,
|
@@ -1,13 +1,13 @@
|
|
1
|
-
require 'fig/
|
2
|
-
require 'fig/
|
1
|
+
require 'fig/deparser'
|
2
|
+
require 'fig/deparser/v1_base'
|
3
3
|
|
4
4
|
module Fig; end
|
5
|
-
module Fig::
|
5
|
+
module Fig::Deparser; end
|
6
6
|
|
7
7
|
# Handles serializing of statements in the v2 grammar.
|
8
|
-
class Fig::
|
9
|
-
include Fig::
|
10
|
-
include Fig::
|
8
|
+
class Fig::Deparser::V2
|
9
|
+
include Fig::Deparser
|
10
|
+
include Fig::Deparser::V1Base
|
11
11
|
|
12
12
|
def initialize(
|
13
13
|
emit_as_input_or_to_be_published_values,
|
@@ -4,13 +4,13 @@ module Fig; end
|
|
4
4
|
class Fig::NotYetParsedPackage
|
5
5
|
attr_accessor :descriptor
|
6
6
|
attr_accessor :working_directory
|
7
|
-
attr_accessor :
|
7
|
+
attr_accessor :include_file_base_directory
|
8
8
|
attr_accessor :source_description
|
9
9
|
attr_accessor :unparsed_text
|
10
10
|
|
11
11
|
def extended_source_description()
|
12
12
|
if source_description
|
13
|
-
if source_description.
|
13
|
+
if source_description.include? "(#{working_directory})"
|
14
14
|
return source_description
|
15
15
|
end
|
16
16
|
|
data/lib/fig/operating_system.rb
CHANGED
@@ -228,7 +228,7 @@ class Fig::OperatingSystem
|
|
228
228
|
rescue Archive::Error => exception
|
229
229
|
# Nice how the error message doesn't include any information about
|
230
230
|
# what was having the problem.
|
231
|
-
message = exception.message.sub
|
231
|
+
message = exception.message.sub(/^Extract archive failed: /, '')
|
232
232
|
new_exception =
|
233
233
|
Fig::RepositoryError.new(
|
234
234
|
"Could not extract #{entry.pathname} from #{archive_path}: #{message}"
|
data/lib/fig/package.rb
CHANGED
@@ -22,7 +22,7 @@ class Fig::Package
|
|
22
22
|
attr_reader :version
|
23
23
|
attr_reader :description
|
24
24
|
attr_reader :runtime_directory
|
25
|
-
attr_reader :
|
25
|
+
attr_reader :include_file_base_directory
|
26
26
|
attr_reader :statements
|
27
27
|
attr_accessor :backtrace
|
28
28
|
attr_accessor :unparsed_text
|
@@ -32,19 +32,19 @@ class Fig::Package
|
|
32
32
|
version,
|
33
33
|
description,
|
34
34
|
runtime_directory,
|
35
|
-
|
35
|
+
include_file_base_directory,
|
36
36
|
statements,
|
37
37
|
synthetic
|
38
38
|
)
|
39
|
-
@name
|
40
|
-
@version
|
41
|
-
@description
|
42
|
-
@runtime_directory
|
43
|
-
@
|
44
|
-
@statements
|
45
|
-
@synthetic
|
46
|
-
@applied_config_names
|
47
|
-
@backtrace
|
39
|
+
@name = name
|
40
|
+
@version = version
|
41
|
+
@description = description
|
42
|
+
@runtime_directory = runtime_directory
|
43
|
+
@include_file_base_directory = include_file_base_directory
|
44
|
+
@statements = statements
|
45
|
+
@synthetic = synthetic
|
46
|
+
@applied_config_names = []
|
47
|
+
@backtrace = nil
|
48
48
|
end
|
49
49
|
|
50
50
|
# Was this package (supposedly) created from something other than usual
|
@@ -149,7 +149,7 @@ class Fig::Package
|
|
149
149
|
def walk_statements(&block)
|
150
150
|
@statements.each do |statement|
|
151
151
|
yield statement
|
152
|
-
statement.walk_statements
|
152
|
+
statement.walk_statements(&block)
|
153
153
|
end
|
154
154
|
|
155
155
|
return
|
@@ -1,8 +1,8 @@
|
|
1
|
+
require 'fig/deparser'
|
2
|
+
require 'fig/deparser/v0'
|
3
|
+
require 'fig/deparser/v1'
|
4
|
+
require 'fig/deparser/v2'
|
1
5
|
require 'fig/statement/grammar_version'
|
2
|
-
require 'fig/unparser'
|
3
|
-
require 'fig/unparser/v0'
|
4
|
-
require 'fig/unparser/v1'
|
5
|
-
require 'fig/unparser/v2'
|
6
6
|
|
7
7
|
module Fig; end
|
8
8
|
|
@@ -61,7 +61,7 @@ class Fig::PackageDefinitionTextAssembler
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def assemble_package_definition()
|
64
|
-
unparsed_statements, explanations =
|
64
|
+
unparsed_statements, explanations = deparse_statements()
|
65
65
|
definition =
|
66
66
|
[@header_text, unparsed_statements, @footer_text].flatten.join("\n")
|
67
67
|
definition.gsub!(/\n{3,}/, "\n\n")
|
@@ -73,8 +73,8 @@ class Fig::PackageDefinitionTextAssembler
|
|
73
73
|
|
74
74
|
private
|
75
75
|
|
76
|
-
def
|
77
|
-
|
76
|
+
def deparse_statements()
|
77
|
+
deparser_class, explanations = Fig::Deparser.class_for_statements(
|
78
78
|
@output_statements, @emit_as_input_or_to_be_published_values
|
79
79
|
)
|
80
80
|
|
@@ -82,14 +82,14 @@ class Fig::PackageDefinitionTextAssembler
|
|
82
82
|
Fig::Statement::GrammarVersion.new(
|
83
83
|
nil,
|
84
84
|
%Q<[synthetic statement created in #{__FILE__} line #{__LINE__}]>,
|
85
|
-
%q<Fake grammar version that shouldn't be used because the
|
85
|
+
%q<Fake grammar version that shouldn't be used because the Deparser should determine what gets emitted.>
|
86
86
|
)
|
87
87
|
|
88
|
-
|
89
|
-
text =
|
88
|
+
deparser = deparser_class.new @emit_as_input_or_to_be_published_values
|
89
|
+
text = deparser.deparse( [grammar_statement] + @output_statements )
|
90
90
|
|
91
91
|
explanations.unshift(
|
92
|
-
"Publishing using the #{
|
92
|
+
"Publishing using the #{deparser.grammar_description} grammar."
|
93
93
|
)
|
94
94
|
|
95
95
|
return text, explanations
|
data/lib/fig/repository.rb
CHANGED
@@ -329,16 +329,9 @@ class Fig::Repository
|
|
329
329
|
temporary_package = File.join temporary_directory, 'packages'
|
330
330
|
temporary_runtime = File.join temporary_directory, 'runtime'
|
331
331
|
temp_fig_file = fig_file_for_package_download(temporary_package)
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
FileUtils.mkdir_p File.dirname(temporary_package)
|
336
|
-
FileUtils.cp_r(
|
337
|
-
package_directory, temporary_package, :preserve => true
|
338
|
-
)
|
339
|
-
else
|
340
|
-
FileUtils.mkdir_p temporary_package
|
341
|
-
end
|
332
|
+
set_up_package_download_directories(
|
333
|
+
temporary_directory, temporary_package, package_directory
|
334
|
+
)
|
342
335
|
|
343
336
|
@updating_package_definition = true
|
344
337
|
return if ! @operating_system.download(
|
@@ -348,42 +341,14 @@ class Fig::Repository
|
|
348
341
|
package = read_package_from_directory(temporary_package, descriptor)
|
349
342
|
@updating_package_definition = false
|
350
343
|
|
351
|
-
|
352
|
-
package.archive_locations.each do
|
353
|
-
|archive_location|
|
354
|
-
|
355
|
-
if not Fig::URL.is_url?(archive_location)
|
356
|
-
archive_location = Fig::URL.append_path_components(
|
357
|
-
remote_package_directory, [archive_location]
|
358
|
-
)
|
359
|
-
end
|
360
|
-
@operating_system.download_and_unpack_archive(
|
361
|
-
archive_location, temporary_package, temporary_runtime
|
362
|
-
)
|
363
|
-
end
|
364
|
-
package.resource_locations.each do
|
365
|
-
|resource_location|
|
366
|
-
|
367
|
-
if not Fig::URL.is_url?(resource_location)
|
368
|
-
resource_location = Fig::URL.append_path_components(
|
369
|
-
remote_package_directory, [resource_location]
|
370
|
-
)
|
371
|
-
end
|
372
|
-
|
373
|
-
basename, path =
|
374
|
-
@operating_system.download_resource(
|
375
|
-
resource_location, temporary_package
|
376
|
-
)
|
377
|
-
|
378
|
-
@operating_system.copy path, File.join(temporary_runtime, basename)
|
379
|
-
end
|
344
|
+
download_assets(package, descriptor, temporary_package, temporary_runtime)
|
380
345
|
|
381
346
|
nuke_package descriptor
|
382
347
|
|
383
348
|
FileUtils.mkdir_p File.dirname(package_directory)
|
384
349
|
FileUtils.mv temporary_package, package_directory
|
385
350
|
|
386
|
-
runtime_directory =
|
351
|
+
runtime_directory = package.runtime_directory
|
387
352
|
if File.exists? temporary_runtime
|
388
353
|
FileUtils.mkdir_p File.dirname(runtime_directory)
|
389
354
|
FileUtils.mv temporary_runtime, runtime_directory
|
@@ -420,7 +385,8 @@ class Fig::Repository
|
|
420
385
|
|
421
386
|
unparsed_package = Fig::NotYetParsedPackage.new
|
422
387
|
unparsed_package.descriptor = descriptor
|
423
|
-
unparsed_package.working_directory =
|
388
|
+
unparsed_package.working_directory =
|
389
|
+
unparsed_package.include_file_base_directory =
|
424
390
|
runtime_for_package(descriptor)
|
425
391
|
unparsed_package.source_description = descriptor.to_string()
|
426
392
|
unparsed_package.unparsed_text = content
|
@@ -432,6 +398,56 @@ class Fig::Repository
|
|
432
398
|
return package
|
433
399
|
end
|
434
400
|
|
401
|
+
def set_up_package_download_directories(
|
402
|
+
temporary_directory, temporary_package, package_directory
|
403
|
+
)
|
404
|
+
FileUtils.rm_rf temporary_directory
|
405
|
+
if File.exist? package_directory
|
406
|
+
FileUtils.mkdir_p File.dirname(temporary_package)
|
407
|
+
FileUtils.cp_r(
|
408
|
+
package_directory, temporary_package, :preserve => true
|
409
|
+
)
|
410
|
+
else
|
411
|
+
FileUtils.mkdir_p temporary_package
|
412
|
+
end
|
413
|
+
|
414
|
+
return
|
415
|
+
end
|
416
|
+
|
417
|
+
def download_assets(package, descriptor, temporary_package, temporary_runtime)
|
418
|
+
remote_package_directory = remote_directory_for_package(descriptor)
|
419
|
+
package.archive_locations.each do
|
420
|
+
|archive_location|
|
421
|
+
|
422
|
+
if not Fig::URL.is_url?(archive_location)
|
423
|
+
archive_location = Fig::URL.append_path_components(
|
424
|
+
remote_package_directory, [archive_location]
|
425
|
+
)
|
426
|
+
end
|
427
|
+
@operating_system.download_and_unpack_archive(
|
428
|
+
archive_location, temporary_package, temporary_runtime
|
429
|
+
)
|
430
|
+
end
|
431
|
+
package.resource_locations.each do
|
432
|
+
|resource_location|
|
433
|
+
|
434
|
+
if not Fig::URL.is_url?(resource_location)
|
435
|
+
resource_location = Fig::URL.append_path_components(
|
436
|
+
remote_package_directory, [resource_location]
|
437
|
+
)
|
438
|
+
end
|
439
|
+
|
440
|
+
basename, path =
|
441
|
+
@operating_system.download_resource(
|
442
|
+
resource_location, temporary_package
|
443
|
+
)
|
444
|
+
|
445
|
+
@operating_system.copy path, File.join(temporary_runtime, basename)
|
446
|
+
end
|
447
|
+
|
448
|
+
return
|
449
|
+
end
|
450
|
+
|
435
451
|
def remote_fig_file_for_package(descriptor)
|
436
452
|
return Fig::URL.append_path_components(
|
437
453
|
remote_directory_for_package(descriptor), [PACKAGE_FILE_IN_REPO]
|