bee 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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
+