fig 1.4.0 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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]
|