fig 0.1.57 → 0.1.59

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