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