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
@@ -2,6 +2,8 @@ require 'ostruct'
2
2
  require 'set'
3
3
 
4
4
  require 'fig/logging'
5
+ require 'fig/logging/colorizable'
6
+ require 'fig/packagedescriptor'
5
7
 
6
8
  module Fig; end
7
9
 
@@ -13,31 +15,37 @@ module Fig; end
13
15
  class Fig::Retriever
14
16
  def initialize(base_dir)
15
17
  @base_dir = base_dir
16
- @configs = {}
17
- @fig_dir = File.join(@base_dir, '.fig')
18
+ @package_metadata_by_name = {}
19
+ @local_fig_data_directory = File.join(@base_dir, '.fig')
18
20
 
19
- file = File.join(@fig_dir, 'retrieve')
21
+ file = File.join(@local_fig_data_directory, 'retrieve')
20
22
  if File.exist?(file)
21
- load(file)
23
+ load_metadata(file)
22
24
  end
23
25
  end
24
26
 
25
- def with_package_config(name, version)
27
+ def with_package_version(name, version)
26
28
  if name and version
27
- @config = @configs[name]
28
- if @config && @config.version != version
29
- @config.files.each do |relpath|
30
- Fig::Logging.info "- [#{@config.name}/#{@config.version}] #{relpath}"
29
+ @package_meta = @package_metadata_by_name[name]
30
+ if @package_meta && @package_meta.version != version
31
+ @package_meta.files.each do |relpath|
32
+ Fig::Logging.info(
33
+ Fig::Logging::Colorizable.new(
34
+ "- [#{formatted_meta()}] #{relpath}",
35
+ :magenta,
36
+ nil
37
+ )
38
+ )
31
39
  FileUtils.rm_f(File.join(@base_dir, relpath))
32
40
  end
33
- @config = nil
41
+ @package_meta = nil
34
42
  end
35
- if not @config
36
- @config = new_package_config(name, version)
37
- @configs[name] = @config
43
+ if not @package_meta
44
+ @package_meta = new_package_metadata(name, version)
45
+ @package_metadata_by_name[name] = @package_meta
38
46
  end
39
47
  else
40
- @config = nil
48
+ @package_meta = nil
41
49
  end
42
50
  yield
43
51
  end
@@ -46,12 +54,12 @@ class Fig::Retriever
46
54
  copy(source, relpath)
47
55
  end
48
56
 
49
- def save
50
- FileUtils.mkdir_p(@fig_dir)
51
- File.open(File.join(@fig_dir, 'retrieve'), 'w') do |f|
52
- @configs.each do |name,config|
53
- config.files.each do |target|
54
- f << target << '=' << config.name << '/' << config.version << "\n"
57
+ def save_metadata
58
+ FileUtils.mkdir_p(@local_fig_data_directory)
59
+ File.open(File.join(@local_fig_data_directory, 'retrieve'), 'w') do |f|
60
+ @package_metadata_by_name.each do |name, package_meta|
61
+ package_meta.files.each do |target|
62
+ f << target << '=' << formatted_meta(package_meta) << "\n"
55
63
  end
56
64
  end
57
65
  end
@@ -59,35 +67,36 @@ class Fig::Retriever
59
67
 
60
68
  private
61
69
 
62
- def load(file)
70
+ def load_metadata(file)
63
71
  File.open(file).each_line do |line|
64
72
  line = line.strip()
65
73
  if line =~ /^(.+)=(.+)\/(.+)$/
66
74
  target = $1
67
- config_name = $2
68
- config_version = $3
69
- config = @configs[config_name]
70
- if config
71
- if config.version != config_version
75
+ package_name = $2
76
+ package_version = $3
77
+ package_meta = @package_metadata_by_name[package_name]
78
+ if package_meta
79
+ if package_meta.version != package_version
72
80
  raise 'version mismatch in .figretrieve'
73
81
  end
74
82
  else
75
- config = new_package_config(config_name, config_version)
76
- @configs[config_name] = config
83
+ package_meta = new_package_metadata(package_name, package_version)
84
+ @package_metadata_by_name[package_name] = package_meta
77
85
  end
78
- config.files << target
86
+ package_meta.files << target
79
87
  else
80
88
  raise "parse error in #{file}: #{line}"
81
89
  end
82
90
  end
83
91
  end
84
92
 
85
- def new_package_config(name, version)
86
- config = OpenStruct.new
87
- config.name = name
88
- config.version = version
89
- config.files = Set.new()
90
- return config
93
+ def new_package_metadata(name, version)
94
+ package_meta = OpenStruct.new
95
+ package_meta.name = name
96
+ package_meta.version = version
97
+ package_meta.files = Set.new()
98
+
99
+ return package_meta
91
100
  end
92
101
 
93
102
  def copy(source, relpath)
@@ -103,17 +112,30 @@ class Fig::Retriever
103
112
  end
104
113
  end
105
114
  else
106
- if !File.exist?(target) || File.mtime(source) > File.mtime(target)
115
+ if ! File.exist?(target) || File.mtime(source) > File.mtime(target)
107
116
  if Fig::Logging.debug?
108
- Fig::Logging.debug "Copying package [#{@config.name}/#{@config.version}] from #{source} to #{target}."
117
+ Fig::Logging.debug \
118
+ "Copying package [#{formatted_meta()}] from #{source} to #{target}."
109
119
  else
110
- Fig::Logging.info "+ [#{@config.name}/#{@config.version}] #{relpath}"
120
+ Fig::Logging.info(
121
+ Fig::Logging::Colorizable.new(
122
+ "+ [#{formatted_meta()}] #{relpath}",
123
+ :green,
124
+ nil
125
+ )
126
+ )
111
127
  end
112
128
  FileUtils.mkdir_p(File.dirname(target))
113
129
 
114
130
  FileUtils.cp(source, target, :preserve => true)
115
131
  end
116
- @config.files << relpath if @config
132
+ @package_meta.files << relpath if @package_meta
117
133
  end
118
134
  end
135
+
136
+ def formatted_meta(package_meta = @package_meta)
137
+ return Fig::PackageDescriptor.format(
138
+ package_meta.name, package_meta.version, nil
139
+ )
140
+ end
119
141
  end
@@ -1,18 +1,40 @@
1
1
  module Fig; end
2
2
 
3
3
  # A statement within a package configuration file (package.fig).
4
- module Fig::Statement
4
+ class Fig::Statement
5
+ attr_reader :line, :column
6
+
7
+ # This mess of getting these as a single array necessary is due to
8
+ # limitations of the "*" array splat operator in ruby v1.8.
9
+ def initialize(line_column)
10
+ if line_column
11
+ @line, @column = *line_column
12
+ end
13
+ end
14
+
5
15
  # Block will receive a Statement.
6
16
  def walk_statements(&block)
7
17
  return
8
18
  end
9
19
 
10
20
  # Block will receive a Package and a Statement.
11
- def walk_statements_following_package_dependencies(repository, package, &block)
21
+ def walk_statements_following_package_dependencies(repository, package, configuration, &block)
12
22
  return
13
23
  end
14
24
 
15
25
  def urls
16
26
  return []
17
27
  end
28
+
29
+ # Returns a representation of the position of this statement, if the position
30
+ # is known, empty string otherwise. This is written with the idea that you
31
+ # can do something like "puts %Q<Found a
32
+ # statement%{statement.position_string()}.>" and get nice looking output
33
+ # regardless of whether the position is actually known or not.
34
+ def position_string
35
+ return '' if not @line
36
+ return '' if not @column
37
+
38
+ return " (line #{@line}, column #{@column})"
39
+ end
18
40
  end
@@ -1,5 +1,3 @@
1
- require 'fig/logging'
2
- require 'fig/packageerror'
3
1
  require 'fig/statement'
4
2
 
5
3
  module Fig; end
@@ -7,12 +5,12 @@ module Fig; end
7
5
  # Specifies an archive file (possibly via a URL) that is part of the current package.
8
6
  #
9
7
  # Differs from a Resource in that the contents will be extracted.
10
- class Fig::Statement::Archive
11
- include Fig::Statement
12
-
8
+ class Fig::Statement::Archive < Fig::Statement
13
9
  attr_reader :url
14
10
 
15
- def initialize(url)
11
+ def initialize(line_column, url)
12
+ super(line_column)
13
+
16
14
  @url = url
17
15
  end
18
16
 
@@ -1,17 +1,15 @@
1
- require 'fig/logging'
2
- require 'fig/packageerror'
3
1
  require 'fig/statement'
4
2
 
5
3
  module Fig; end
6
4
 
7
5
  # Specifies a default command that will be executed for a given Configuration
8
6
  # if no command is specified on the command-line.
9
- class Fig::Statement::Command
10
- include Fig::Statement
11
-
7
+ class Fig::Statement::Command < Fig::Statement
12
8
  attr_reader :command
13
9
 
14
- def initialize(command)
10
+ def initialize(line_column, command)
11
+ super(line_column)
12
+
15
13
  @command = command
16
14
  end
17
15
 
@@ -1,17 +1,15 @@
1
- require 'fig/logging'
2
- require 'fig/packageerror'
3
1
  require 'fig/statement'
4
2
  require 'fig/statement/command'
5
3
 
6
4
  module Fig; end
7
5
 
8
6
  # A grouping of statements within a configuration. May not be nested.
9
- class Fig::Statement::Configuration
10
- include Fig::Statement
11
-
7
+ class Fig::Statement::Configuration < Fig::Statement
12
8
  attr_reader :name, :statements
13
9
 
14
- def initialize(name, statements)
10
+ def initialize(line_column, name, statements)
11
+ super(line_column)
12
+
15
13
  @name = name
16
14
  @statements = statements
17
15
  end
@@ -35,11 +33,11 @@ class Fig::Statement::Configuration
35
33
  end
36
34
 
37
35
  # Block will receive a Package and a Statement.
38
- def walk_statements_following_package_dependencies(repository, package, &block)
36
+ def walk_statements_following_package_dependencies(repository, package, configuration, &block)
39
37
  @statements.each do |statement|
40
- yield package, statement
38
+ yield package, self, statement
41
39
  statement.walk_statements_following_package_dependencies(
42
- repository, package, &block
40
+ repository, package, self, &block
43
41
  )
44
42
  end
45
43
 
@@ -1,4 +1,3 @@
1
- require 'fig/logging'
2
1
  require 'fig/packagedescriptor'
3
2
  require 'fig/statement'
4
3
 
@@ -6,32 +5,22 @@ module Fig; end
6
5
 
7
6
  # Dual role: "include :configname" incorporates one configuration into another;
8
7
  # "include package[/version]" declares a dependency upon another package.
9
- class Fig::Statement::Include
10
- include Fig::Statement
8
+ class Fig::Statement::Include < Fig::Statement
9
+ attr_reader :descriptor, :overrides, :containing_package_descriptor
11
10
 
12
- attr_reader :descriptor, :overrides
11
+ def initialize(line_column, descriptor, overrides, containing_package_descriptor)
12
+ super(line_column)
13
13
 
14
- def initialize(descriptor, overrides, containing_package_name)
15
- if descriptor.name && ! descriptor.version
16
- message =
17
- %Q<No version in the package descriptor of "#{descriptor.name}" in an include statement>
18
- if containing_package_name
19
- message += %Q< in the .fig file for "#{containing_package_name}">
20
- end
21
- message += '. Whether or not the include statement will work is dependent upon the recursive dependency load order.'
22
-
23
- Fig::Logging.warn(message)
24
- end
25
-
26
- @descriptor = descriptor
27
- @overrides = overrides
14
+ @descriptor = descriptor
15
+ @overrides = overrides
16
+ @containing_package_descriptor = containing_package_descriptor
28
17
  end
29
18
 
30
19
  def package_name
31
20
  return @descriptor.name
32
21
  end
33
22
 
34
- def version_name
23
+ def version
35
24
  return @descriptor.version
36
25
  end
37
26
 
@@ -39,23 +28,40 @@ class Fig::Statement::Include
39
28
  return @descriptor.config
40
29
  end
41
30
 
31
+ def complain_if_version_missing()
32
+ if @descriptor.name && ! @descriptor.version
33
+ message =
34
+ %Q<No version in the package descriptor of "#{@descriptor.name}" in an include statement>
35
+ if @containing_package_descriptor
36
+ package_string = @containing_package_descriptor.to_string()
37
+ if package_string && package_string != ''
38
+ message += %Q< in the .fig file for "#{package_string}">
39
+ end
40
+ end
41
+ message += %Q<#{position_string()}. Whether or not the include statement will work is dependent upon the recursive dependency load order.>
42
+
43
+ Fig::Logging.warn(message)
44
+ end
45
+ end
46
+
42
47
  # Assume that this statement is part of the parameter and return a descriptor
43
- # that represents the fully resolved dependency.
44
- def resolved_dependency_descriptor(package)
48
+ # that represents the fully resolved dependency, taking into account that the
49
+ # version might have been overridden.
50
+ def resolved_dependency_descriptor(containing_package, backtrace)
45
51
  return Fig::PackageDescriptor.new(
46
- referenced_package_name(package),
47
- referenced_version_name(package),
52
+ referenced_package_name(containing_package),
53
+ referenced_version(containing_package, backtrace),
48
54
  referenced_config_name()
49
55
  )
50
56
  end
51
57
 
52
58
  # Block will receive a Package and a Statement.
53
59
  def walk_statements_following_package_dependencies(
54
- repository, package, &block
60
+ repository, package, configuration, &block
55
61
  )
56
62
  referenced_package = nil
57
63
  if package_name()
58
- referenced_package = repository.get_package(package_name, version_name)
64
+ referenced_package = repository.get_package(descriptor())
59
65
  else
60
66
  referenced_package = package
61
67
  end
@@ -64,7 +70,7 @@ class Fig::Statement::Include
64
70
 
65
71
  yield referenced_package, configuration
66
72
  configuration.walk_statements_following_package_dependencies(
67
- repository, referenced_package, &block
73
+ repository, referenced_package, nil, &block
68
74
  )
69
75
 
70
76
  return
@@ -73,7 +79,7 @@ class Fig::Statement::Include
73
79
  def unparse(indent)
74
80
  text = ''
75
81
  text += package_name() if package_name()
76
- text += "/#{version_name()}" if version_name()
82
+ text += "/#{version()}" if version()
77
83
  text += ":#{config_name()}" if config_name()
78
84
  @overrides.each do |override|
79
85
  text += override.unparse
@@ -83,16 +89,27 @@ class Fig::Statement::Include
83
89
 
84
90
  private
85
91
 
86
- def referenced_package_name(package)
87
- return package_name() || package.package_name()
92
+ def referenced_package_name(containing_package)
93
+ return package_name() || containing_package.name()
88
94
  end
89
95
 
90
- def referenced_version_name(package)
96
+ def referenced_version(containing_package, backtrace)
97
+ overrides().each do
98
+ |override|
99
+ backtrace.add_override(override.package_name(), override.version())
100
+ end
101
+
102
+ package_name = nil
103
+ original_version = nil
91
104
  if package_name()
92
- return version_name()
105
+ package_name = package_name()
106
+ original_version = version()
107
+ else
108
+ package_name = containing_package.name()
109
+ original_version = containing_package.version()
93
110
  end
94
111
 
95
- return version_name() || package.version_name()
112
+ return backtrace.get_override(package_name, original_version)
96
113
  end
97
114
 
98
115
  def referenced_config_name()
@@ -1,5 +1,4 @@
1
- require 'fig/logging'
2
- require 'fig/packageerror'
1
+ require 'fig/packagedescriptor'
3
2
  require 'fig/statement'
4
3
 
5
4
  module Fig; end
@@ -11,17 +10,17 @@ module Fig; end
11
10
  #
12
11
  # indicates that, regardless of which version of somedependency the blah
13
12
  # package says it needs, the blah package will actually use v3.2.6.
14
- class Fig::Statement::Override
15
- include Fig::Statement
13
+ class Fig::Statement::Override < Fig::Statement
14
+ attr_reader :package_name, :version
16
15
 
17
- attr_reader :package_name, :version_name
16
+ def initialize(line_column, package_name, version)
17
+ super(line_column)
18
18
 
19
- def initialize(package_name, version_name)
20
19
  @package_name = package_name
21
- @version_name = version_name
20
+ @version = version
22
21
  end
23
22
 
24
23
  def unparse()
25
- return ' override ' + @package_name + '/' + @version_name
24
+ return ' override ' + Fig::PackageDescriptor.format(@package_name, @version, nil)
26
25
  end
27
26
  end