fig 0.1.57 → 0.1.59

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.
Files changed (45) hide show
  1. data/Changes +80 -0
  2. data/VERSION +1 -1
  3. data/bin/fig-debug +12 -0
  4. data/bin/fig.bat +1 -0
  5. data/lib/fig/applicationconfiguration.rb +41 -41
  6. data/lib/fig/backtrace.rb +28 -30
  7. data/lib/fig/command.rb +52 -112
  8. data/lib/fig/command/listing.rb +207 -41
  9. data/lib/fig/command/packageload.rb +137 -0
  10. data/lib/fig/environment.rb +59 -72
  11. data/lib/fig/environmentvariables.rb +44 -0
  12. data/lib/fig/environmentvariables/caseinsensitive.rb +49 -0
  13. data/lib/fig/environmentvariables/casesensitive.rb +30 -0
  14. data/lib/fig/grammar.treetop +60 -35
  15. data/lib/fig/log4r/outputter.rb +96 -0
  16. data/lib/fig/logging.rb +2 -1
  17. data/lib/fig/logging/colorizable.rb +14 -0
  18. data/lib/fig/nosuchpackageconfigerror.rb +15 -0
  19. data/lib/fig/operatingsystem.rb +24 -13
  20. data/lib/fig/options.rb +70 -20
  21. data/lib/fig/package.rb +25 -26
  22. data/lib/fig/packagecache.rb +3 -3
  23. data/lib/fig/packagedescriptor.rb +36 -19
  24. data/lib/fig/packageparseerror.rb +7 -0
  25. data/lib/fig/parser.rb +76 -39
  26. data/lib/fig/repository.rb +131 -93
  27. data/lib/fig/retriever.rb +61 -39
  28. data/lib/fig/statement.rb +24 -2
  29. data/lib/fig/statement/archive.rb +4 -6
  30. data/lib/fig/statement/command.rb +4 -6
  31. data/lib/fig/statement/configuration.rb +7 -9
  32. data/lib/fig/statement/include.rb +49 -32
  33. data/lib/fig/statement/override.rb +7 -8
  34. data/lib/fig/statement/path.rb +4 -6
  35. data/lib/fig/statement/publish.rb +4 -11
  36. data/lib/fig/statement/resource.rb +4 -6
  37. data/lib/fig/statement/retrieve.rb +4 -6
  38. data/lib/fig/statement/set.rb +4 -6
  39. data/lib/fig/urlaccesserror.rb +4 -5
  40. metadata +52 -215
  41. data/LICENSE +0 -27
  42. data/README.md +0 -526
  43. data/TODO +0 -4
  44. data/lib/fig/packageerror.rb +0 -8
  45. data/lib/fig/windows.rb +0 -44
@@ -19,7 +19,7 @@ module Fig
19
19
 
20
20
  def initialize(repository, variables_override, retriever)
21
21
  @repository = repository
22
- @variables = variables_override || get_system_environment_variables
22
+ @variables = variables_override || OperatingSystem.get_environment_variables
23
23
  @retrieve_vars = {}
24
24
  @packages = {}
25
25
  @retriever = retriever
@@ -42,7 +42,7 @@ module Fig
42
42
  end
43
43
 
44
44
  def register_package(package)
45
- name = package.package_name
45
+ name = package.name
46
46
 
47
47
  if get_package(name)
48
48
  Logging.fatal %Q<There is already a package with the name "#{name}".>
@@ -54,8 +54,8 @@ module Fig
54
54
  return
55
55
  end
56
56
 
57
- def get_package(package_name)
58
- return @packages[package_name]
57
+ def get_package(name)
58
+ return @packages[name]
59
59
  end
60
60
 
61
61
  def packages
@@ -76,7 +76,7 @@ module Fig
76
76
  end
77
77
 
78
78
  def execute_shell(command)
79
- with_environment do
79
+ @variables.with_environment do
80
80
  yield command.map{|arg| expand_command_line_argument(arg)}
81
81
  end
82
82
 
@@ -84,7 +84,7 @@ module Fig
84
84
  end
85
85
 
86
86
  def execute_command(command, args, package)
87
- with_environment do
87
+ @variables.with_environment do
88
88
  argument =
89
89
  expand_command_line_argument(
90
90
  "#{command.command} #{args.join(' ')}"
@@ -96,8 +96,8 @@ module Fig
96
96
  return
97
97
  end
98
98
 
99
- def find_config_name_in_package(package_name)
100
- package = get_package(package_name)
99
+ def find_config_name_in_package(name)
100
+ package = get_package(name)
101
101
  if not package
102
102
  return Package::DEFAULT_CONFIG
103
103
  end
@@ -105,12 +105,18 @@ module Fig
105
105
  return package.primary_config_name || Package::DEFAULT_CONFIG
106
106
  end
107
107
 
108
- def execute_config(base_package, package_name, config_name, version_name, args, &block)
109
- config_name ||= find_config_name_in_package(package_name)
108
+ def execute_config(base_package, descriptor, args, &block)
109
+ config_name =
110
+ descriptor.config || find_config_name_in_package(descriptor.name)
111
+
112
+ name = descriptor.name || base_package.name
110
113
  package = lookup_package(
111
- package_name || base_package.package_name,
112
- version_name,
113
- Backtrace.new(nil, package_name, version_name, config_name)
114
+ name,
115
+ descriptor.version,
116
+ Backtrace.new(
117
+ nil,
118
+ PackageDescriptor.new(name, descriptor.version, config_name)
119
+ )
114
120
  )
115
121
 
116
122
  command = package[config_name].command
@@ -126,11 +132,13 @@ module Fig
126
132
  def apply_config_statement(base_package, statement, backtrace)
127
133
  case statement
128
134
  when Statement::Path
129
- append_variable(base_package, statement.name, statement.value)
135
+ prepend_variable(base_package, statement.name, statement.value)
130
136
  when Statement::Set
131
137
  set_variable(base_package, statement.name, statement.value)
132
138
  when Statement::Include
133
- include_config(base_package, statement.package_name, statement.config_name, statement.version_name, statement.overrides, backtrace)
139
+ include_config(
140
+ base_package, statement.descriptor, statement.overrides, backtrace
141
+ )
134
142
  when Statement::Command
135
143
  # ignore
136
144
  else
@@ -140,23 +148,36 @@ module Fig
140
148
  return
141
149
  end
142
150
 
143
- def include_config(base_package, package_name, config_name, version_name, overrides, backtrace)
151
+ def include_config(base_package, descriptor, overrides, backtrace)
152
+ resolved_descriptor = nil
153
+
144
154
  # Check to see if this include has been overridden.
145
155
  if backtrace
146
- override = backtrace.get_override(package_name || base_package.package_name)
156
+ override = backtrace.get_override(
157
+ descriptor.name || base_package.name
158
+ )
147
159
  if override
148
- version_name = override
160
+ resolved_descriptor =
161
+ PackageDescriptor.new(
162
+ descriptor.name, override, descriptor.config
163
+ )
149
164
  end
150
165
  end
151
- new_backtrace = Backtrace.new(backtrace, package_name, version_name, config_name)
166
+ resolved_descriptor ||= descriptor
167
+
168
+ new_backtrace = Backtrace.new(backtrace, resolved_descriptor)
152
169
  overrides.each do |override|
153
- new_backtrace.add_override(override.package_name, override.version_name)
170
+ new_backtrace.add_override(override.package_name, override.version)
154
171
  end
155
172
  package = lookup_package(
156
- package_name || base_package.package_name, version_name, new_backtrace
173
+ resolved_descriptor.name || base_package.name,
174
+ resolved_descriptor.version,
175
+ new_backtrace
157
176
  )
158
177
  apply_config(
159
- package, config_name || Package::DEFAULT_CONFIG, new_backtrace
178
+ package,
179
+ resolved_descriptor.config || Package::DEFAULT_CONFIG,
180
+ new_backtrace
160
181
  )
161
182
 
162
183
  return
@@ -164,70 +185,39 @@ module Fig
164
185
 
165
186
  private
166
187
 
167
- def get_system_environment_variables
168
- vars = {}
169
- ENV.each { |key,value| vars[key]=value }
170
-
171
- return vars
172
- end
173
-
174
188
  def set_variable(base_package, name, value)
175
189
  @variables[name] = expand_and_retrieve_variable_value(base_package, name, value)
176
190
 
177
191
  return
178
192
  end
179
193
 
180
- def append_variable(base_package, name, value)
194
+ def prepend_variable(base_package, name, value)
181
195
  value = expand_and_retrieve_variable_value(base_package, name, value)
182
- # TODO: converting all environment variables to upcase is not a robust
183
- # comparison. It also assumes all env vars will be in upcase
184
- # in package.fig
185
- prev = nil
186
- @variables.each do |key, val|
187
- if key.upcase == name.upcase
188
- name = key
189
- prev = val
190
- end
191
- end
192
- if prev
193
- @variables[name] = value + File::PATH_SEPARATOR + prev
194
- else
195
- @variables[name] = value
196
- end
197
-
198
- return
199
- end
200
-
201
- def with_environment
202
- old_env = {}
203
- begin
204
- @variables.each { |key,value| old_env[key] = ENV[key]; ENV[key] = value }
205
- yield
206
- ensure
207
- old_env.each { |key,value| ENV[key] = value }
208
- end
196
+ @variables.prepend_variable(name, value)
209
197
 
210
198
  return
211
199
  end
212
200
 
213
- def lookup_package(package_name, version_name, backtrace)
214
- package = get_package(package_name)
201
+ def lookup_package(name, version, backtrace)
202
+ package = get_package(name)
215
203
  if package.nil?
216
- if not version_name
217
- Logging.fatal "No version specified for #{package_name}."
204
+ if not version
205
+ Logging.fatal "No version specified for #{name}."
218
206
  raise RepositoryError.new
219
207
  end
220
208
 
221
- package = @repository.get_package(package_name, version_name)
209
+ package = @repository.get_package(
210
+ PackageDescriptor.new(name, version, nil)
211
+ )
222
212
  package.backtrace = backtrace
223
- @packages[package_name] = package
224
- elsif version_name && version_name != package.version_name
213
+ @packages[name] = package
214
+ elsif version && version != package.version
225
215
  string_handle = StringIO.new
226
216
  backtrace.dump(string_handle) if backtrace
227
217
  package.backtrace.dump(string_handle) if package.backtrace
228
218
  stacktrace = string_handle.string
229
219
  Logging.fatal \
230
- "Version mismatch: #{package_name}" \
220
+ "Version mismatch: #{name}" \
231
221
  + ( stacktrace.empty? ? '' : "\n#{stacktrace}" )
232
222
  raise RepositoryError.new
233
223
  end
@@ -238,7 +228,7 @@ module Fig
238
228
  # Replace @ symbol with the package's directory, "[package]" with the
239
229
  # package name.
240
230
  def expand_and_retrieve_variable_value(base_package, name, value)
241
- return value unless base_package && base_package.package_name
231
+ return value unless base_package && base_package.name
242
232
 
243
233
  file = expand_path(value, base_package)
244
234
 
@@ -259,8 +249,8 @@ module Fig
259
249
  target = File.join(target, File.basename(file))
260
250
  end
261
251
  end
262
- @retriever.with_package_config(
263
- base_package.package_name, base_package.version_name
252
+ @retriever.with_package_version(
253
+ base_package.name, base_package.version
264
254
  ) do
265
255
  @retriever.retrieve(file, target)
266
256
  end
@@ -335,10 +325,7 @@ module Fig
335
325
 
336
326
  def translate_retrieve_variables(base_package, name)
337
327
  return \
338
- @retrieve_vars[name].gsub(
339
- / \[package\] /x,
340
- base_package.package_name
341
- )
328
+ @retrieve_vars[name].gsub(/ \[package\] /x, base_package.name)
342
329
  end
343
330
  end
344
331
  end
@@ -0,0 +1,44 @@
1
+ module Fig; end;
2
+
3
+ # Abstract manager of a set of environment variables.
4
+ module Fig::EnvironmentVariables
5
+ def initialize(variables_override = nil)
6
+ @variables = variables_override || get_system_environment_variables
7
+ end
8
+
9
+ def empty?
10
+ return @variables.empty?
11
+ end
12
+
13
+ def keys
14
+ return @variables.keys
15
+ end
16
+
17
+ def with_environment
18
+ original_environment = {}
19
+ original_environment.merge!(ENV.to_hash)
20
+
21
+ begin
22
+ set_system_environment_variables(@variables)
23
+ yield
24
+ ensure
25
+ ENV.clear
26
+ set_system_environment_variables(original_environment)
27
+ end
28
+
29
+ return
30
+ end
31
+
32
+ private
33
+
34
+ def get_system_environment_variables
35
+ vars = {}
36
+ ENV.each { |key,value| vars[key]=value }
37
+
38
+ return vars
39
+ end
40
+
41
+ def set_system_environment_variables(variables)
42
+ variables.each { |key, value| ENV[key] = value }
43
+ end
44
+ end
@@ -0,0 +1,49 @@
1
+ require 'fig/environmentvariables'
2
+
3
+ module Fig; end;
4
+ module EnvironmentVariables; end
5
+
6
+ # Manager of a set of environment variables where the variable names are
7
+ # case-insensitive, e.g. on MS Windows.
8
+ class Fig::EnvironmentVariables::CaseInsensitive
9
+ include Fig::EnvironmentVariables
10
+
11
+ def [](key)
12
+ return @variables[key_to_store_under(key)]
13
+ end
14
+
15
+ def []=(key, new_value)
16
+ @variables[key_to_store_under(key)] = new_value
17
+
18
+ return
19
+ end
20
+
21
+ def prepend_variable(key, new_value)
22
+ existing_key = key_to_store_under(key)
23
+
24
+ if existing_key
25
+ assign_value_to_existing_key(existing_key, new_value)
26
+ else
27
+ @variables[key] = new_value
28
+ end
29
+
30
+ return
31
+ end
32
+
33
+ private
34
+
35
+ def assign_value_to_existing_key(existing_key, new_value)
36
+ current_value = @variables[existing_key]
37
+ if current_value
38
+ @variables[existing_key] = new_value + File::PATH_SEPARATOR + current_value
39
+ else
40
+ @variables[existing_key] = new_value
41
+ end
42
+
43
+ return
44
+ end
45
+
46
+ def key_to_store_under(key)
47
+ return @variables.keys.detect(lambda {key}) {|stored| stored.downcase == key.downcase}
48
+ end
49
+ end
@@ -0,0 +1,30 @@
1
+ require 'fig/environmentvariables'
2
+
3
+ module Fig; end;
4
+ module EnvironmentVariables; end
5
+
6
+ # Manager of a set of environment variables where the variable names are
7
+ # case-insensitive, e.g. on *nix.
8
+ class Fig::EnvironmentVariables::CaseSensitive
9
+ include Fig::EnvironmentVariables
10
+
11
+ def [](key)
12
+ return @variables[key]
13
+ end
14
+
15
+ def []=(new_key, new_value)
16
+ @variables[new_key] = new_value
17
+
18
+ return
19
+ end
20
+
21
+ def prepend_variable(key, new_value)
22
+ if @variables.key?(key)
23
+ @variables[key] = new_value + File::PATH_SEPARATOR + @variables[key]
24
+ else
25
+ @variables[key] = new_value
26
+ end
27
+
28
+ return
29
+ end
30
+ end
@@ -1,5 +1,6 @@
1
1
  require 'fig/package'
2
2
  require 'fig/packagedescriptor'
3
+ require 'fig/parser'
3
4
  require 'fig/statement/archive'
4
5
  require 'fig/statement/command'
5
6
  require 'fig/statement/configuration'
@@ -15,15 +16,15 @@ module Fig
15
16
 
16
17
  grammar Fig
17
18
  rule package
18
- ws statements:(package_statement*) {
19
- def to_package(package_name, version_name, directory)
19
+ optional_ws statements:(package_statement*) optional_ws {
20
+ def to_package(descriptor, directory)
20
21
  Package.new(
21
- package_name,
22
- version_name,
22
+ descriptor.name,
23
+ descriptor.version,
23
24
  directory,
24
25
  statements.elements.map do
25
26
  |statement|
26
- statement.to_package_statement(package_name)
27
+ statement.to_package_statement(descriptor)
27
28
  end
28
29
  )
29
30
  end
@@ -35,25 +36,33 @@ grammar Fig
35
36
  end
36
37
 
37
38
  rule archive
38
- "archive" ws url {
39
- def to_package_statement(package_name)
40
- Statement::Archive.new(url.value.text_value)
39
+ statement_start:"archive" ws url {
40
+ def to_package_statement(descriptor)
41
+ Statement::Archive.new(
42
+ Parser.node_location(statement_start), url.value.text_value
43
+ )
41
44
  end
42
45
  }
43
46
  end
44
47
 
45
48
  rule resource
46
- "resource" ws url {
47
- def to_package_statement(package_name)
48
- Statement::Resource.new(url.value.text_value)
49
+ statement_start:"resource" ws url {
50
+ def to_package_statement(descriptor)
51
+ Statement::Resource.new(
52
+ Parser.node_location(statement_start), url.value.text_value
53
+ )
49
54
  end
50
55
  }
51
56
  end
52
57
 
53
58
  rule retrieve
54
- "retrieve" ws var:retrieve_variable "->" path:retrieve_path ws {
55
- def to_package_statement(package_name)
56
- Statement::Retrieve.new(var.text_value, path.text_value)
59
+ statement_start:"retrieve" ws var:retrieve_variable "->" path:retrieve_path ws {
60
+ def to_package_statement(descriptor)
61
+ Statement::Retrieve.new(
62
+ Parser.node_location(statement_start),
63
+ var.text_value,
64
+ path.text_value
65
+ )
57
66
  end
58
67
  }
59
68
  end
@@ -67,13 +76,14 @@ grammar Fig
67
76
  end
68
77
 
69
78
  rule config
70
- "config" ws config_name ws statements:config_statement* "end" ws {
71
- def to_package_statement(package_name)
79
+ statement_start:"config" ws config_name ws statements:config_statement* "end" ws {
80
+ def to_package_statement(descriptor)
72
81
  Statement::Configuration.new(
82
+ Parser.node_location(statement_start),
73
83
  config_name.text_value,
74
84
  statements.elements.map do
75
85
  |statement|
76
- statement.to_config_statement(package_name)
86
+ statement.to_config_statement(descriptor)
77
87
  end
78
88
  )
79
89
  end
@@ -85,29 +95,38 @@ grammar Fig
85
95
  end
86
96
 
87
97
  rule include
88
- "include" ws descriptor overrides:(override*) {
89
- def to_config_statement(package_name)
98
+ statement_start:"include" ws descriptor overrides:(override*) {
99
+ def to_config_statement(containing_package_descriptor)
90
100
  Statement::Include.new(
101
+ Parser.node_location(statement_start),
91
102
  PackageDescriptor.parse(descriptor.text_value.strip),
92
103
  overrides.elements.map{ |e| e.to_override },
93
- package_name
104
+ containing_package_descriptor
94
105
  )
95
106
  end
96
107
  }
97
108
  end
98
109
 
99
110
  rule override
100
- "override" ws package_name "/" version_name ws {
111
+ statement_start:"override" ws package_name "/" version_name ws {
101
112
  def to_override
102
- return Statement::Override.new(package_name.text_value, version_name.text_value)
113
+ return Statement::Override.new(
114
+ Parser.node_location(statement_start),
115
+ package_name.text_value,
116
+ version_name.text_value
117
+ )
103
118
  end
104
119
  }
105
120
  end
106
121
 
107
122
  rule path
108
- ("append" / "path" / "add") ws name:path_name "=" value:path_value ws {
109
- def to_config_statement(package_name)
110
- Statement::Path.new(name.text_value, value.text_value)
123
+ statement_start:("append" / "path" / "add") ws name:path_name "=" value:path_value ws {
124
+ def to_config_statement(descriptor)
125
+ Statement::Path.new(
126
+ Parser.node_location(statement_start),
127
+ name.text_value,
128
+ value.text_value
129
+ )
111
130
  end
112
131
  }
113
132
  end
@@ -121,9 +140,13 @@ grammar Fig
121
140
  end
122
141
 
123
142
  rule set
124
- "set" ws name:set_name "=" value:set_value ws {
125
- def to_config_statement(package_name)
126
- Statement::Set.new(name.text_value, value.text_value)
143
+ statement_start:"set" ws name:set_name "=" value:set_value ws {
144
+ def to_config_statement(descriptor)
145
+ Statement::Set.new(
146
+ Parser.node_location(statement_start),
147
+ name.text_value,
148
+ value.text_value
149
+ )
127
150
  end
128
151
  }
129
152
  end
@@ -137,9 +160,11 @@ grammar Fig
137
160
  end
138
161
 
139
162
  rule command
140
- "command" ws string {
141
- def to_config_statement(package_name)
142
- Statement::Command.new(string.value.text_value)
163
+ statement_start:"command" ws string {
164
+ def to_config_statement(descriptor)
165
+ Statement::Command.new(
166
+ Parser.node_location(statement_start), string.value.text_value
167
+ )
143
168
  end
144
169
  }
145
170
  end
@@ -183,10 +208,6 @@ grammar Fig
183
208
  [a-zA-Z0-9_.-]+
184
209
  end
185
210
 
186
- rule name
187
- value:[a-zA-Z0-9]+ ws
188
- end
189
-
190
211
  rule url
191
212
  (value:[a-zA-Z0-9:/\\._*-]+ ws) / ('"' value:[a-zA-Z0-9:/\\._-]+ '"' ws)
192
213
  end
@@ -194,6 +215,10 @@ grammar Fig
194
215
  rule ws
195
216
  [ \n\r\t]+
196
217
  end
218
+
219
+ rule optional_ws
220
+ [ \n\r\t]*
221
+ end
197
222
  end
198
223
 
199
224
  end