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
@@ -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