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
@@ -1,6 +1,8 @@
1
1
  require 'set'
2
2
 
3
+ require 'fig/backtrace'
3
4
  require 'fig/package'
5
+ require 'fig/packagedescriptor'
4
6
  require 'fig/userinputerror'
5
7
 
6
8
  module Fig; end
@@ -48,7 +50,7 @@ module Fig::Command::Listing
48
50
 
49
51
  def display_dependencies()
50
52
  if @options.list_tree?
51
- display_dependencies_in_tree(@package, derive_base_display_config_names())
53
+ display_dependencies_in_tree()
52
54
  else
53
55
  display_dependencies_flat()
54
56
  end
@@ -58,35 +60,60 @@ module Fig::Command::Listing
58
60
 
59
61
  def display_variables()
60
62
  if @options.list_tree?
61
- raise Fig::UserInputError.new('--list-variables --list-tree not yet implemented.')
63
+ display_variables_in_tree()
64
+ elsif @options.list_all_configs?
65
+ display_variables_flat_from_repository()
62
66
  else
63
- display_variables_flat()
67
+ display_variables_flat_from_environment()
64
68
  end
65
69
 
66
70
  return
67
71
  end
68
72
 
69
- def display_dependencies_in_tree(base_package, config_names, indent = 0)
73
+ def display_dependencies_in_tree()
74
+ walk_dependency_tree(@package, derive_base_display_config_names(), nil, 0) do
75
+ |package, config_name, depth|
76
+
77
+ print ' ' * (depth * 4)
78
+ puts package.to_s_with_config(config_name)
79
+ end
80
+
81
+ return
82
+ end
83
+
84
+ def walk_dependency_tree(base_package, config_names, backtrace, depth, &block)
70
85
  config_names.each do
71
86
  |config_name|
72
87
 
73
- print ' ' * (indent * 4)
74
- puts base_package.to_s_with_config(config_name)
88
+ if depth < 1
89
+ @repository.reset_cached_data
90
+ end
91
+
92
+ yield base_package, config_name, depth
93
+
94
+ new_backtrace = Fig::Backtrace.new(
95
+ backtrace,
96
+ Fig::PackageDescriptor.new(
97
+ base_package.name(),
98
+ base_package.version(),
99
+ config_name
100
+ )
101
+ )
75
102
 
76
- base_package.package_dependencies(config_name).each do
103
+ base_package.package_dependencies(config_name, new_backtrace).each do
77
104
  |descriptor|
78
105
 
79
106
  package = nil
80
107
  if descriptor.name
81
108
  package =
82
- @repository.get_package(
83
- descriptor.name, descriptor.version, false, :allow_any_version
84
- )
109
+ @repository.get_package(descriptor, :allow_any_version)
85
110
  else
86
111
  package = base_package
87
112
  end
88
113
 
89
- display_dependencies_in_tree(package, [descriptor.config], indent + 1)
114
+ walk_dependency_tree(
115
+ package, [descriptor.config], new_backtrace, depth + 1, &block
116
+ )
90
117
  end
91
118
  end
92
119
 
@@ -94,25 +121,28 @@ module Fig::Command::Listing
94
121
  end
95
122
 
96
123
  def display_dependencies_flat()
97
- base_config_names = derive_base_display_config_names()
98
- packages = gather_package_depencency_configurations(base_config_names)
124
+ packages = gather_package_dependency_configurations()
99
125
 
100
126
  if packages.empty? and $stdout.tty?
101
127
  puts '<no dependencies>'
102
128
  else
103
- packages.keys.sort.each do
129
+ strings = []
130
+
131
+ packages.keys.each do
104
132
  |package|
105
133
 
106
134
  if @options.list_all_configs?
107
- packages[package].sort.each do
135
+ packages[package].each do
108
136
  |config_name|
109
137
 
110
- puts package.to_s_with_config(config_name)
138
+ strings << package.to_s_with_config(config_name)
111
139
  end
112
140
  else
113
- puts package
141
+ strings << package
114
142
  end
115
143
  end
144
+
145
+ puts strings.uniq.sort.join("\n")
116
146
  end
117
147
 
118
148
  return
@@ -123,40 +153,36 @@ module Fig::Command::Listing
123
153
  return @package.config_names
124
154
  end
125
155
 
126
- return [
127
- @descriptor && @descriptor.config || Fig::Package::DEFAULT_CONFIG
128
- ]
156
+ return [ base_config() ]
129
157
  end
130
158
 
131
- def gather_package_depencency_configurations(starting_config_names)
159
+ def gather_package_dependency_configurations()
132
160
  packages = {}
161
+ starting_config_names = derive_base_display_config_names()
133
162
 
134
- if ! @package.package_name.nil?
163
+ if ! @package.name.nil?
135
164
  packages[@package] = starting_config_names.to_set
136
165
  end
137
166
 
138
- starting_config_names.each do
139
- |config_name|
167
+ walk_dependency_tree(@package, starting_config_names, nil, 0) do
168
+ |package, config_name, depth|
140
169
 
141
- @package[config_name].walk_statements_following_package_dependencies(
142
- @repository, @package
143
- ) do
144
- |package, statement|
145
-
146
- if (
147
- ! package.package_name.nil? \
148
- && statement.is_a?(Fig::Statement::Configuration)
149
- )
150
- packages[package] ||= Set.new
151
- packages[package] << statement.name
152
- end
170
+ if (
171
+ ! package.name.nil? \
172
+ && ! (
173
+ ! @options.list_all_configs? \
174
+ && @descriptor \
175
+ && package.name == @descriptor.name
176
+ )
177
+ )
178
+ packages[package] ||= Set.new
179
+ packages[package] << config_name
153
180
  end
154
181
  end
155
182
 
156
183
  if ! @options.list_all_configs? && @descriptor
157
- packages.reject! do
158
- |package, config_names|
159
- package.package_name == @descriptor.name
184
+ packages.reject! do |package, config_names|
185
+ package.name == @descriptor.name
160
186
  end
161
187
  end
162
188
 
@@ -178,7 +204,148 @@ module Fig::Command::Listing
178
204
  return
179
205
  end
180
206
 
181
- def display_variables_flat()
207
+ VariableTreePackageConfig =
208
+ Struct.new(
209
+ :package, :config_name, :variable_statements, :child_configs, :parent
210
+ )
211
+
212
+ def display_variables_in_tree()
213
+ # We can't just display as we walk the dependency tree because we need to
214
+ # know in advance how many configurations we're going display under
215
+ # another.
216
+ tree = build_variable_tree()
217
+
218
+ tree.child_configs().each do
219
+ |child|
220
+
221
+ display_variable_tree_level(child, '', '')
222
+ end
223
+
224
+ return
225
+ end
226
+
227
+ def build_variable_tree()
228
+ tree = VariableTreePackageConfig.new(nil, nil, nil, [], nil)
229
+ prior_depth = 0
230
+ prior_node = nil
231
+ current_parent = tree
232
+
233
+ walk_dependency_tree(@package, derive_base_display_config_names(), nil, 0) do
234
+ |package, config_name, depth|
235
+
236
+ if depth < prior_depth
237
+ (depth .. (prior_depth - 1)).each do
238
+ current_parent = current_parent.parent
239
+ end
240
+ elsif depth == prior_depth + 1
241
+ current_parent = prior_node
242
+ elsif depth > prior_depth
243
+ raise "Bug in code! Descended more than one level! (#{prior_depth} to #{depth}"
244
+ end
245
+
246
+ variable_statements = gather_variable_statements(package[config_name])
247
+ node = VariableTreePackageConfig.new(
248
+ package, config_name, variable_statements, [], current_parent
249
+ )
250
+ current_parent.child_configs() << node
251
+
252
+ prior_depth = depth
253
+ prior_node = node
254
+ end
255
+
256
+ return tree
257
+ end
258
+
259
+ def gather_variable_statements(config_statement)
260
+ variable_statements = []
261
+ config_statement.walk_statements() do |statement|
262
+ case statement
263
+ when Fig::Statement::Path
264
+ variable_statements << statement
265
+ when Fig::Statement::Set
266
+ variable_statements << statement
267
+ end
268
+ end
269
+
270
+ return variable_statements
271
+ end
272
+
273
+ def display_variable_tree_level(node, base_indent, package_indent)
274
+ print package_indent
275
+ puts node.package().to_s_with_config(node.config_name())
276
+
277
+ display_variable_tree_level_variables(node, base_indent)
278
+
279
+ child_configs = node.child_configs()
280
+ child_count = child_configs.size()
281
+
282
+ new_indent = base_indent + (child_count > 0 ? '|' : ' ') + ' ' * 3
283
+ new_package_indent = base_indent + %q<'--->
284
+
285
+ (0 .. (child_count - 2)).each do
286
+ |child_index|
287
+
288
+ display_variable_tree_level(
289
+ child_configs[child_index], new_indent, new_package_indent
290
+ )
291
+ end
292
+
293
+ if child_count > 0
294
+ display_variable_tree_level(
295
+ child_configs[-1], (base_indent + ' ' * 4), new_package_indent
296
+ )
297
+ end
298
+ end
299
+
300
+ def display_variable_tree_level_variables(node, base_indent)
301
+ if node.child_configs().size() > 0
302
+ variable_indent = base_indent + '|' + ' ' * 3
303
+ else
304
+ variable_indent = base_indent + ' ' * 4
305
+ end
306
+
307
+ variable_statements = node.variable_statements()
308
+
309
+ name_width =
310
+ (variable_statements.map { |statement| statement.name().length() }).max()
311
+
312
+ variable_statements.each do
313
+ |statement|
314
+
315
+ print "#{variable_indent}"
316
+ print "#{statement.name().ljust(name_width)}"
317
+ print " = #{statement.value}"
318
+ if statement.is_a?(Fig::Statement::Path)
319
+ print ":$#{statement.name}"
320
+ end
321
+ print "\n"
322
+ end
323
+
324
+ return
325
+ end
326
+
327
+ def display_variables_flat_from_repository()
328
+ variable_names = Set.new()
329
+
330
+ walk_dependency_tree(@package, derive_base_display_config_names(), nil, 0) do
331
+ |package, config_name, depth|
332
+
333
+ package[config_name].walk_statements() do |statement|
334
+ case statement
335
+ when Fig::Statement::Path
336
+ variable_names << statement.name()
337
+ when Fig::Statement::Set
338
+ variable_names << statement.name()
339
+ end
340
+ end
341
+ end
342
+
343
+ variable_names.sort.each { |name| puts name }
344
+
345
+ return
346
+ end
347
+
348
+ def display_variables_flat_from_environment()
182
349
  register_package_with_environment()
183
350
 
184
351
  variables = @environment.variables()
@@ -193,5 +360,4 @@ module Fig::Command::Listing
193
360
 
194
361
  return
195
362
  end
196
-
197
363
  end
@@ -0,0 +1,137 @@
1
+ require 'fig/package'
2
+ require 'fig/packagedescriptor'
3
+ require 'fig/parser'
4
+
5
+ module Fig; end
6
+ class Fig::Command; end
7
+
8
+ # Parts of the Command class related to loading of the primary Package object,
9
+ # simply to keep the size of command.rb down.
10
+ module Fig::Command::PackageLoad
11
+ DEFAULT_FIG_FILE = 'package.fig'
12
+
13
+ private
14
+
15
+ def read_in_package_config_file(config_file)
16
+ if File.exist?(config_file)
17
+ @package_loaded_from_path = config_file
18
+
19
+ return File.read(config_file)
20
+ else
21
+ raise Fig::UserInputError.new(%Q<File not found: "#{config_file}".>)
22
+ end
23
+ end
24
+
25
+ def load_package_config_file_contents()
26
+ package_config_file = @options.package_config_file()
27
+
28
+ if package_config_file == :none
29
+ return nil
30
+ elsif package_config_file == '-'
31
+ @package_loaded_from_path = '<standard input>'
32
+
33
+ return $stdin.read
34
+ elsif package_config_file.nil?
35
+ if File.exist?(DEFAULT_FIG_FILE)
36
+ @package_loaded_from_path = DEFAULT_FIG_FILE
37
+
38
+ return File.read(DEFAULT_FIG_FILE)
39
+ end
40
+ else
41
+ return read_in_package_config_file(package_config_file)
42
+ end
43
+
44
+ return
45
+ end
46
+
47
+ def register_package_with_environment_if_not_listing_or_publishing()
48
+ return if @options.listing || @options.publishing?
49
+
50
+ register_package_with_environment()
51
+
52
+ return
53
+ end
54
+
55
+ def register_package_with_environment()
56
+ if @options.updating?
57
+ @package.retrieves.each do |var, path|
58
+ @environment.add_retrieve(var, path)
59
+ end
60
+ end
61
+
62
+ @environment.register_package(@package)
63
+
64
+ config = base_config()
65
+ begin
66
+ @environment.apply_config(@package, config, nil)
67
+ rescue Fig::NoSuchPackageConfigError => exception
68
+ raise exception if not @descriptor
69
+
70
+ descriptor = exception.descriptor
71
+
72
+ raise exception if
73
+ descriptor.name && descriptor.name != @descriptor.name
74
+ raise exception if
75
+ descriptor.version && descriptor.version != @descriptor.version
76
+ raise exception if descriptor.config != config
77
+
78
+ source = nil
79
+ if @package_loaded_from_path
80
+ source = @package_loaded_from_path
81
+ else
82
+ source =
83
+ Fig::PackageDescriptor.format(@descriptor.name, @descriptor.version, nil)
84
+ end
85
+ source_component = source ? %Q< in #{source}> : ''
86
+
87
+ message = %Q<There's no "#{config}" configuration#{source_component}.>
88
+ message += %q< Specify one that does like this: ">
89
+ message +=
90
+ Fig::PackageDescriptor.format(@descriptor.name, @descriptor.version, 'some_existing_config')
91
+ message += %q<".>
92
+
93
+ if @options.publishing?
94
+ message += ' (Yes, this does work with --publish.)'
95
+ end
96
+
97
+ raise Fig::UserInputError.new(message)
98
+ end
99
+
100
+ return
101
+ end
102
+
103
+ def parse_package_config_file(config_raw_text)
104
+ if config_raw_text.nil?
105
+ @package = Fig::Package.new(nil, nil, '.', [])
106
+ return
107
+ end
108
+
109
+ @package =
110
+ Fig::Parser.new(@configuration, :check_include_versions).parse_package(
111
+ Fig::PackageDescriptor.new(nil, nil, nil), '.', config_raw_text
112
+ )
113
+
114
+ register_package_with_environment_if_not_listing_or_publishing()
115
+
116
+ return
117
+ end
118
+
119
+ def load_package_file()
120
+ config_raw_text = load_package_config_file_contents()
121
+
122
+ parse_package_config_file(config_raw_text)
123
+ end
124
+
125
+ def load_package_object()
126
+ if @descriptor.nil?
127
+ load_package_file()
128
+ else
129
+ # TODO: complain if config file was specified on the command-line.
130
+ @package = @repository.get_package(@descriptor)
131
+
132
+ register_package_with_environment_if_not_listing_or_publishing()
133
+ end
134
+
135
+ return
136
+ end
137
+ end