bee 0.4.0 → 0.5.0

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.
data/lib/bee_util.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2006-2007 Michel Casabianca <michel.casabianca@gmail.com>
1
+ # Copyright 2006-2008 Michel Casabianca <michel.casabianca@gmail.com>
2
2
  # 2006 Avi Bryant
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,38 +13,53 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ require 'net/http'
16
17
 
17
18
  module Bee
18
19
 
19
20
  module Util
20
-
21
- # Get line length calling IOCTL. Return nil if call failed.
22
- # FIXME: doesn't work on MacOSX.
21
+
22
+ # Limit of number of HTTP redirections to follow.
23
+ HTTP_REDIRECTIONS_LIMIT = 10
24
+ # README file where copyright is extracted.
25
+ README_FILE = 'README'
26
+ # Default package name.
27
+ DEFAULT_PACKAGE = 'default'
28
+ # Compact pattern for resource
29
+ COMPACT_PATTERN = /^:(.*?)\.(.*?)(\[(.*)\])?$/
30
+ # Expanded pattern for resource
31
+ EXPANDED_PATTERN = /^ruby:\/\/(.*?)(:(.*?))?\/(.*)$/
32
+ # Default terminal width
33
+ DEFAULT_TERM_WIDTH = 80
34
+
35
+ # Get line length calling IOCTL. Return DEFAULT_TERM_WIDTH if call failed.
23
36
  def self.term_width
24
37
  begin
25
- tiocgwinsz = 0x5413
38
+ tiocgwinsz = RUBY_PLATFORM =~ /darwin/ ? 0x40087468 : 0x5413
26
39
  string = [0, 0, 0, 0].pack('SSSS')
27
40
  if $stdin.ioctl(tiocgwinsz, string) >= 0 then
28
41
  rows, cols, xpixels, ypixels = string.unpack('SSSS')
42
+ cols = DEFAULT_TERM_WIDTH if cols <= 0
29
43
  return cols
44
+ else
45
+ return DEFAULT_TERM_WIDTH
30
46
  end
31
47
  rescue
32
- return nil
48
+ return DEFAULT_TERM_WIDTH
33
49
  end
34
50
  end
35
51
 
36
- # Looks recursively up in file system for a file.
37
- # - file: file name to look for.
38
- # Return: found file or raises an exception if file was not found.
39
- def self.find(file)
40
- return file if File.exists?(file)
41
- raise "File not found" if File.identical?(File.dirname(file), '/')
42
- file = File.join('..', file)
43
- find(file)
52
+ # Return copyright parsing README file. Returns nil if COPYRIGHT file
53
+ # was not found.
54
+ def self.copyright
55
+ readme = File.join(File.dirname(__FILE__), '..', README_FILE)
56
+ begin
57
+ copyright = File.read(readme).strip!.split("\n")[-1]
58
+ rescue
59
+ copyright = nil
60
+ end
61
+ return copyright
44
62
  end
45
-
46
- # Default package name.
47
- DEFAULT_PACKAGE = 'default'
48
63
 
49
64
  # Parse packaged name and return package and name.
50
65
  # - packaged: packaged name (such as 'foo.bar').
@@ -57,12 +72,186 @@ module Bee
57
72
  end
58
73
  return package, name
59
74
  end
60
-
75
+
76
+ # Get a given file or URL. Manages HTTP redirections.
77
+ # - location: file path, resource or URL of the file to get.
78
+ # - base: base for relative files (defaults to nil).
79
+ def self.get_file(location, base=nil)
80
+ base = base || Dir.pwd
81
+ abs = absolute_path(location, base)
82
+ if abs =~ /^http:/
83
+ # this is HTTP
84
+ return fetch(abs)
85
+ else
86
+ # this is a file
87
+ return File.read(abs)
88
+ end
89
+ end
90
+
91
+ private
92
+
93
+ # Looks recursively up in file system for a file.
94
+ # - file: file name to look for.
95
+ # Return: found file or raises an exception if file was not found.
96
+ def self.find(file)
97
+ return file if File.exists?(file)
98
+ raise "File not found" if File.identical?(File.dirname(file), '/')
99
+ file = File.join('..', file)
100
+ find(file)
101
+ end
102
+
103
+ # Function to tell if a file name is a URL.
104
+ # - file: file name to consider.
105
+ def self.url?(file)
106
+ return file =~ /^http:/
107
+ end
108
+
109
+ # Tells if a given path is absolute.
110
+ # - location: file to consider.
111
+ def self.absolute_path?(location)
112
+ if url?(location) or resource?(location)
113
+ return true
114
+ else
115
+ case RUBY_PLATFORM
116
+ when /mswin/
117
+ return location =~ /^(([a-z]|[A-Z]):)?\//
118
+ else
119
+ return location =~ /^\//
120
+ end
121
+ end
122
+ end
123
+
124
+ # Utility method that returns absolute path for a given file relative
125
+ # to base.
126
+ # - location: location to get absolute path for.
127
+ # - base: base for relative paths (may be an URL).
128
+ def self.absolute_path(location, base)
129
+ if absolute_path?(location)
130
+ if resource?(location)
131
+ location = resource_path(location)
132
+ end
133
+ return location
134
+ else
135
+ return File.join(base, location)
136
+ end
137
+ end
138
+
139
+ # Get a given URL.
140
+ # - url: URL to get.
141
+ # - limit: redirectrion limit (defaults to HTTP_REDIRECTIONS_LIMIT).
142
+ def self.fetch(url, limit = HTTP_REDIRECTIONS_LIMIT)
143
+ raise 'HTTP redirect too deep' if limit == 0
144
+ response = Net::HTTP.get_response(URI.parse(url))
145
+ case response
146
+ when Net::HTTPSuccess
147
+ response.body
148
+ when Net::HTTPRedirection
149
+ fetch(response['location'], limit - 1)
150
+ else
151
+ response.error!
152
+ end
153
+ end
154
+
155
+ # Tells is a given location is a resource.
156
+ # - location: location to examine.
157
+ def self.resource?(location)
158
+ return location.to_s =~ /^ruby:\/\// || location.to_s =~ /^:/
159
+ end
160
+
161
+ # Return the path to a given resoure and test that file exists.
162
+ # - resource: the resource (expanded or compact pattern).
163
+ def self.resource_path(resource)
164
+ # get gem, version and path from resource
165
+ case resource
166
+ when COMPACT_PATTERN
167
+ gem, version, path = $1, $4, $2
168
+ when EXPANDED_PATTERN
169
+ gem, version, path = $1, $3, $4
170
+ else
171
+ raise "'#{resource}' is not a valid resource"
172
+ end
173
+ # get gem descriptor
174
+ if version
175
+ gem_descriptor = Gem.source_index.find_name(gem, version)[0]
176
+ raise "Gem '#{gem}' was not found in version '#{version}'" if
177
+ not gem_descriptor
178
+ else
179
+ gem_descriptor = Gem.source_index.find_name(gem)[0]
180
+ raise "Gem '#{gem}' was not found" if
181
+ not gem_descriptor
182
+ end
183
+ # get resource path
184
+ gem_path = gem_descriptor.full_gem_path
185
+ file_path = File.join(gem_path, path)
186
+ return file_path
187
+ end
188
+
189
+ # Find a given template and return associated file.
190
+ # - template: template to look for.
191
+ # return: found associated file.
192
+ def self.find_template(template)
193
+ raise Bee::Util::BuildError.
194
+ new("Invalid template name '#{template}'") if
195
+ not template =~ /^([^.]+\.)?[^.]+$/
196
+ package, egg = template.split('.')
197
+ if not egg
198
+ egg = package
199
+ package = 'bee'
200
+ end
201
+ prefix = (package == 'bee' ? '':'bee_')
202
+ resource = ":#{prefix}#{package}.egg/#{egg}.yml"
203
+ begin
204
+ file = absolute_path(resource, Dir.pwd)
205
+ rescue
206
+ raise BuildError.new("Template '#{template}' not found")
207
+ end
208
+ raise BuildError.new("Template '#{template}' not found") if
209
+ not File.exists?(file)
210
+ return file
211
+ end
212
+
213
+ # Search files for a given templates that might contain a joker (*).
214
+ # - template: template to look for.
215
+ # return: a hash associating template and corresponding file.
216
+ def self.search_templates(template)
217
+ raise Bee::Util::BuildError.
218
+ new("Invalid template name '#{template}'") if
219
+ not template =~ /^([^.]+\.)?[^.]+$/
220
+ package, egg = template.split('.')
221
+ if not egg
222
+ egg = package
223
+ package = 'bee'
224
+ end
225
+ prefix = (package == 'bee' ? '':'bee_')
226
+ egg = '*' if egg == '?'
227
+ resource = ":#{prefix}#{package}.egg/#{egg}.yml"
228
+ begin
229
+ glob = absolute_path(resource, Dir.pwd)
230
+ rescue
231
+ if egg == '*'
232
+ raise BuildError.new("Template package '#{package}' not found")
233
+ else
234
+ raise BuildError.new("Template '#{template}' not found")
235
+ end
236
+ end
237
+ files = Dir.glob(glob)
238
+ hash = {}
239
+ for file in files
240
+ egg = file.match(/.*?([^\/]+)\.yml/)[1]
241
+ name = "#{package}.#{egg}"
242
+ hash[name] = file
243
+ end
244
+ return hash
245
+ end
246
+
61
247
  # Class that holds information about a given method.
62
248
  class MethodInfo
63
249
 
64
250
  attr_accessor :source, :comment, :defn, :params
65
-
251
+
252
+ # Constructor taking file name and line number.
253
+ # - file: file name of the method.
254
+ # - lineno: line number of the method.
66
255
  def initialize(file, lineno)
67
256
  lines = file_cache(file)
68
257
  @source = match_tabs(lines, lineno, "def")
@@ -72,7 +261,7 @@ module Bee
72
261
  end
73
262
 
74
263
  private
75
-
264
+
76
265
  @@file_cache = {}
77
266
 
78
267
  def file_cache(file)
@@ -118,18 +307,21 @@ module Bee
118
307
  class MethodInfoBase
119
308
 
120
309
  @@minfo = {}
121
-
310
+
311
+ # Return comment for a given method.
312
+ # - method: the method name to get info for.
122
313
  def self.method_info(method)
123
314
  @@minfo[method.to_s]
124
315
  end
125
316
 
126
317
  private
127
-
318
+
319
+ # Called when a method is added.
320
+ # - method: added method.
128
321
  def self.method_added(method)
129
322
  super if defined? super
130
323
  last = caller[0]
131
- file = last[0, last.rindex(':')]
132
- lineno = last[last.rindex(':')+1, last.length]
324
+ file, lineno = last.match(/(.+?):(\d+)/)[1, 2]
133
325
  @@minfo[method.to_s] = MethodInfo.new(file, lineno.to_i - 1)
134
326
  end
135
327
 
@@ -172,7 +364,7 @@ module Bee
172
364
  for key in description.keys
173
365
  case description[key]
174
366
  when :mandatory
175
- error "Missing mandatory key '#{key}'" if not hash[key]
367
+ error "Missing mandatory key '#{key}'" if not hash.has_key?(key)
176
368
  when :optional
177
369
  else
178
370
  error "Unknown symbol '#{description[key]}'"
@@ -185,45 +377,6 @@ module Bee
185
377
  end
186
378
 
187
379
  end
188
-
189
- # Module that includes a mixin that provides file selection using include
190
- # and exclude globs.
191
- module FileSelector
192
-
193
- include BuildErrorMixin
194
-
195
- # Select files with globs to include and exclude.
196
- # - include: glob (or list of globs) for files to include.
197
- # - exclude: glob (or list of globs) for files to exclude.
198
- # Return: a list of files as strings.
199
- def select_files(includes, excludes)
200
- return [] if !includes
201
- error "includes can't be nil" if not includes
202
- error "includes must be a glob or a list of globs" unless
203
- includes.kind_of?(String) or includes.kind_of?(Array)
204
- error "excludes must be a glob or a list of globs" unless
205
- !excludes or excludes.kind_of?(String) or excludes.kind_of?(Array)
206
- included = []
207
- for include in includes
208
- error "includes must be a glob or a list of globs" unless
209
- include.kind_of?(String)
210
- included += Dir.glob(include)
211
- end
212
- if excludes
213
- excluded = []
214
- for exclude in excludes
215
- error "excludes must be a glob or a list of globs" unless
216
- exclude.kind_of?(String)
217
- excluded += Dir.glob(exclude)
218
- end
219
- included = included.select do |file|
220
- !excluded.member?(file)
221
- end
222
- end
223
- return included
224
- end
225
-
226
- end
227
380
 
228
381
  end
229
382
 
metadata CHANGED
@@ -1,71 +1,22 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
3
- specification_version: 1
4
2
  name: bee
5
3
  version: !ruby/object:Gem::Version
6
- version: 0.4.0
7
- date: 2007-06-25 00:00:00 +02:00
8
- summary: bee is a build tool
9
- require_paths:
10
- - lib
11
- email: michel.casabianca@gmail.com
12
- homepage: http://bee.rubyforge.org
13
- rubyforge_project:
14
- description:
15
- autorequire: bee
16
- default_executable: bee
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: 0.5.0
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message: Enjoy bee!
29
6
  authors:
30
7
  - Michel Casabianca & Contributors
31
- files:
32
- - bin/bee
33
- - bin/bee.bat
34
- - lib/bee.rb
35
- - lib/bee_console.rb
36
- - lib/bee_task.rb
37
- - lib/bee_task_default.rb
38
- - lib/bee_util.rb
39
- - test/tc_bee_build.rb
40
- - test/tc_bee_console.rb
41
- - test/tc_bee_console_formatter.rb
42
- - test/tc_bee_context.rb
43
- - test/tc_bee_task_default.rb
44
- - test/tc_bee_util.rb
45
- - test/test_build.rb
46
- - test/test_build_listener.rb
47
- - test/tmp_test_case.rb
48
- - test/ts_bee.rb
49
- - README
50
- - LICENSE
51
- test_files:
52
- - test/ts_bee.rb
53
- rdoc_options: []
54
-
55
- extra_rdoc_files:
56
- - README
57
- - LICENSE
58
- executables:
59
- - bee
60
- extensions: []
61
-
62
- requirements: []
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
63
11
 
12
+ date: 2008-12-31 00:00:00 +01:00
13
+ default_executable: bee
64
14
  dependencies:
65
15
  - !ruby/object:Gem::Dependency
66
16
  name: archive-tar-minitar
17
+ type: :runtime
67
18
  version_requirement:
68
- version_requirements: !ruby/object:Gem::Version::Requirement
19
+ version_requirements: !ruby/object:Gem::Requirement
69
20
  requirements:
70
21
  - - ">="
71
22
  - !ruby/object:Gem::Version
@@ -73,10 +24,74 @@ dependencies:
73
24
  version:
74
25
  - !ruby/object:Gem::Dependency
75
26
  name: rubyzip
27
+ type: :runtime
76
28
  version_requirement:
77
- version_requirements: !ruby/object:Gem::Version::Requirement
29
+ version_requirements: !ruby/object:Gem::Requirement
78
30
  requirements:
79
31
  - - ">="
80
32
  - !ruby/object:Gem::Version
81
33
  version: 0.9.1
82
34
  version:
35
+ description:
36
+ email: michel.casabianca@gmail.com
37
+ executables:
38
+ - bee
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - README
43
+ - LICENSE
44
+ files:
45
+ - bin/bee
46
+ - bin/bee.bat
47
+ - lib/bee.rb
48
+ - lib/bee_console.rb
49
+ - lib/bee_task.rb
50
+ - lib/bee_task_default.rb
51
+ - lib/bee_util.rb
52
+ - egg/package
53
+ - egg/package/bee_task.erb
54
+ - egg/package/build.erb
55
+ - egg/package/egg.yml
56
+ - egg/package/egg_build.erb
57
+ - egg/package/egg_launcher.erb
58
+ - egg/package/egg_script.rb
59
+ - egg/package/gem_spec.erb
60
+ - egg/package/license
61
+ - egg/package/readme.erb
62
+ - egg/package/test.erb
63
+ - egg/package/test_build.erb
64
+ - egg/package/test_build.rb
65
+ - egg/package/test_build_listener.rb
66
+ - egg/package/test_suite.rb
67
+ - egg/package.yml
68
+ - README
69
+ - LICENSE
70
+ has_rdoc: true
71
+ homepage: http://bee.rubyforge.org
72
+ post_install_message: Enjoy bee!
73
+ rdoc_options: []
74
+
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: "0"
82
+ version:
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: "0"
88
+ version:
89
+ requirements: []
90
+
91
+ rubyforge_project: bee
92
+ rubygems_version: 1.3.0
93
+ signing_key:
94
+ specification_version: 2
95
+ summary: bee is a build tool
96
+ test_files: []
97
+