fattr 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1 @@
1
+ same as Ruby's
data/Rakefile CHANGED
@@ -1,23 +1,67 @@
1
+ This.rubyforge_project = 'codeforpeople'
1
2
  This.author = "Ara T. Howard"
2
3
  This.email = "ara.t.howard@gmail.com"
3
4
  This.homepage = "http://github.com/ahoward/#{ This.lib }/tree/master"
4
- This.rubyforge_project = 'codeforpeople'
5
+
5
6
 
6
7
  task :default do
7
- puts(Rake::Task.tasks.map{|task| task.name} - ['default'])
8
+ puts((Rake::Task.tasks.map{|task| task.name.gsub(/::/,':')} - ['default']).sort)
9
+ end
10
+
11
+ task :test do
12
+ run_tests!
13
+ end
14
+
15
+ namespace :test do
16
+ task(:unit){ run_tests!(:unit) }
17
+ task(:functional){ run_tests!(:functional) }
18
+ task(:integration){ run_tests!(:integration) }
8
19
  end
9
20
 
10
- task :spec do
11
- require 'spec/rake/spectask'
12
- Spec::Rake::SpecTask.new do |t|
13
- t.spec_files = FileList['spec/*_spec.rb']
21
+ def run_tests!(which = nil)
22
+ which ||= '**'
23
+ test_dir = File.join(This.dir, "test")
24
+ test_glob ||= File.join(test_dir, "#{ which }/**_test.rb")
25
+ test_rbs = Dir.glob(test_glob).sort
26
+
27
+ div = ('=' * 119)
28
+ line = ('-' * 119)
29
+ helper = "-r ./test/helper.rb" if test(?e, "./test/helper.rb")
30
+
31
+ test_rbs.each_with_index do |test_rb, index|
32
+ testno = index + 1
33
+ command = "#{ This.ruby } -I ./lib -I ./test/lib #{ helper } #{ test_rb }"
34
+
35
+ puts
36
+ say(div, :color => :cyan, :bold => true)
37
+ say("@#{ testno } => ", :bold => true, :method => :print)
38
+ say(command, :color => :cyan, :bold => true)
39
+ say(line, :color => :cyan, :bold => true)
40
+
41
+ system(command)
42
+
43
+ say(line, :color => :cyan, :bold => true)
44
+
45
+ status = $?.exitstatus
46
+
47
+ if status.zero?
48
+ say("@#{ testno } <= ", :bold => true, :color => :white, :method => :print)
49
+ say("SUCCESS", :color => :green, :bold => true)
50
+ else
51
+ say("@#{ testno } <= ", :bold => true, :color => :white, :method => :print)
52
+ say("FAILURE", :color => :red, :bold => true)
53
+ end
54
+ say(line, :color => :cyan, :bold => true)
55
+
56
+ exit(status) unless status.zero?
14
57
  end
15
58
  end
16
59
 
60
+
17
61
  task :gemspec do
18
62
  ignore_extensions = 'git', 'svn', 'tmp', /sw./, 'bak', 'gem'
19
- ignore_directories = 'pkg'
20
- ignore_files = 'test/log'
63
+ ignore_directories = %w[ pkg ]
64
+ ignore_files = %w[ test/log ]
21
65
 
22
66
  shiteless =
23
67
  lambda do |list|
@@ -39,14 +83,18 @@ task :gemspec do
39
83
  end
40
84
 
41
85
  lib = This.lib
86
+ object = This.object
42
87
  version = This.version
43
88
  files = shiteless[Dir::glob("**/**")]
44
89
  executables = shiteless[Dir::glob("bin/*")].map{|exe| File.basename(exe)}
45
90
  has_rdoc = true #File.exist?('doc')
46
91
  test_files = "test/#{ lib }.rb" if File.file?("test/#{ lib }.rb")
92
+ summary = object.respond_to?(:summary) ? object.summary : "summary: #{ lib } kicks the ass"
93
+ description = object.respond_to?(:description) ? object.description : "description: #{ lib } kicks the ass"
47
94
 
48
- extensions = This.extensions
49
- if extensions.nil?
95
+ if This.extensions.nil?
96
+ This.extensions = []
97
+ extensions = This.extensions
50
98
  %w( Makefile configure extconf.rb ).each do |ext|
51
99
  extensions << ext if File.exists?(ext)
52
100
  end
@@ -64,22 +112,20 @@ task :gemspec do
64
112
 
65
113
  Gem::Specification::new do |spec|
66
114
  spec.name = #{ lib.inspect }
67
- spec.description = 'fattr.rb is a "fatter attr" for ruby'
68
115
  spec.version = #{ version.inspect }
69
116
  spec.platform = Gem::Platform::RUBY
70
117
  spec.summary = #{ lib.inspect }
118
+ spec.description = #{ description.inspect }
71
119
 
72
120
  spec.files = #{ files.inspect }
73
121
  spec.executables = #{ executables.inspect }
74
122
 
75
- <% if test(?d, 'lib') %>
76
123
  spec.require_path = "lib"
77
- <% end %>
78
124
 
79
125
  spec.has_rdoc = #{ has_rdoc.inspect }
80
126
  spec.test_files = #{ test_files.inspect }
81
- #spec.add_dependency 'lib', '>= version'
82
- #spec.add_dependency 'fattr'
127
+
128
+ # spec.add_dependency 'lib', '>= version'
83
129
 
84
130
  spec.extensions.push(*#{ extensions.inspect })
85
131
 
@@ -92,12 +138,13 @@ task :gemspec do
92
138
  }
93
139
  end
94
140
 
95
- open("#{ lib }.gemspec", "w"){|fd| fd.puts template}
96
- This.gemspec = "#{ lib }.gemspec"
141
+ Fu.mkdir_p(This.pkgdir)
142
+ This.gemspec = File.join(This.pkgdir, "gemspec.rb")
143
+ open("#{ This.gemspec }", "w"){|fd| fd.puts(template)}
97
144
  end
98
145
 
99
146
  task :gem => [:clean, :gemspec] do
100
- Fu.mkdir_p This.pkgdir
147
+ Fu.mkdir_p(This.pkgdir)
101
148
  before = Dir['*.gem']
102
149
  cmd = "gem build #{ This.gemspec }"
103
150
  `#{ cmd }`
@@ -123,7 +170,7 @@ task :readme do
123
170
  cmd = "ruby #{ sample }"
124
171
  samples << Util.indent(prompt + cmd, 2) << "\n\n"
125
172
 
126
- cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -Ilib #{ sample })'"
173
+ cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -I ./lib #{ sample })'"
127
174
  samples << Util.indent(`#{ cmd } 2>&1`, 4) << "\n"
128
175
  end
129
176
 
@@ -170,44 +217,62 @@ end
170
217
 
171
218
 
172
219
  BEGIN {
220
+ # support for this rakefile
221
+ #
173
222
  $VERBOSE = nil
174
223
 
175
224
  require 'ostruct'
176
225
  require 'erb'
177
226
  require 'fileutils'
227
+ require 'rbconfig'
178
228
 
229
+ # fu shortcut
230
+ #
179
231
  Fu = FileUtils
180
232
 
233
+ # cache a bunch of stuff about this rakefile/environment
234
+ #
181
235
  This = OpenStruct.new
182
236
 
183
237
  This.file = File.expand_path(__FILE__)
184
238
  This.dir = File.dirname(This.file)
185
239
  This.pkgdir = File.join(This.dir, 'pkg')
186
240
 
241
+ # grok lib
242
+ #
187
243
  lib = ENV['LIB']
188
244
  unless lib
189
- lib = File.basename(Dir.pwd)
245
+ lib = File.basename(Dir.pwd).sub(/[-].*$/, '')
190
246
  end
191
247
  This.lib = lib
192
248
 
249
+ # grok version
250
+ #
193
251
  version = ENV['VERSION']
194
252
  unless version
195
- name = lib.capitalize
196
- library = "./lib/#{ lib }.rb"
197
- program = "./bin/#{ lib }"
198
- if test(?e, library)
199
- require library
200
- version = eval(name).send(:version)
201
- elsif test(?e, program)
202
- version = `#{ program } --version`.strip
203
- end
204
- abort('no version') if(version.nil? or version.empty?)
253
+ require "./lib/#{ This.lib }"
254
+ This.name = lib.capitalize
255
+ This.object = eval(This.name)
256
+ version = This.object.send(:version)
205
257
  end
206
258
  This.version = version
207
259
 
260
+ # we need to know the name of the lib an it's version
261
+ #
208
262
  abort('no lib') unless This.lib
209
263
  abort('no version') unless This.version
210
264
 
265
+ # discover full path to this ruby executable
266
+ #
267
+ c = Config::CONFIG
268
+ bindir = c["bindir"] || c['BINDIR']
269
+ ruby_install_name = c['ruby_install_name'] || c['RUBY_INSTALL_NAME'] || 'ruby'
270
+ ruby_ext = c['EXEEXT'] || ''
271
+ ruby = File.join(bindir, (ruby_install_name + ruby_ext))
272
+ This.ruby = ruby
273
+
274
+ # some utils
275
+ #
211
276
  module Util
212
277
  def indent(s, n = 2)
213
278
  s = unindent(s)
@@ -217,18 +282,20 @@ BEGIN {
217
282
 
218
283
  def unindent(s)
219
284
  indent = nil
220
- s.each do |line|
221
- next if line =~ %r/^\s*$/
222
- indent = line[%r/^\s*/] and break
285
+ s.each_line do |line|
286
+ next if line =~ %r/^\s*$/
287
+ indent = line[%r/^\s*/] and break
288
+ end
289
+ indent ? s.gsub(%r/^#{ indent }/, "") : s
223
290
  end
224
- indent ? s.gsub(%r/^#{ indent }/, "") : s
225
- end
226
291
  extend self
227
292
  end
228
293
 
294
+ # template support
295
+ #
229
296
  class Template
230
297
  def initialize(&block)
231
- @block = block
298
+ @block = block.binding
232
299
  @template = block.call.to_s
233
300
  end
234
301
  def expand(b=nil)
@@ -238,5 +305,57 @@ BEGIN {
238
305
  end
239
306
  def Template(*args, &block) Template.new(*args, &block) end
240
307
 
308
+ # colored console output support
309
+ #
310
+ This.ansi = {
311
+ :clear => "\e[0m",
312
+ :reset => "\e[0m",
313
+ :erase_line => "\e[K",
314
+ :erase_char => "\e[P",
315
+ :bold => "\e[1m",
316
+ :dark => "\e[2m",
317
+ :underline => "\e[4m",
318
+ :underscore => "\e[4m",
319
+ :blink => "\e[5m",
320
+ :reverse => "\e[7m",
321
+ :concealed => "\e[8m",
322
+ :black => "\e[30m",
323
+ :red => "\e[31m",
324
+ :green => "\e[32m",
325
+ :yellow => "\e[33m",
326
+ :blue => "\e[34m",
327
+ :magenta => "\e[35m",
328
+ :cyan => "\e[36m",
329
+ :white => "\e[37m",
330
+ :on_black => "\e[40m",
331
+ :on_red => "\e[41m",
332
+ :on_green => "\e[42m",
333
+ :on_yellow => "\e[43m",
334
+ :on_blue => "\e[44m",
335
+ :on_magenta => "\e[45m",
336
+ :on_cyan => "\e[46m",
337
+ :on_white => "\e[47m"
338
+ }
339
+ def say(phrase, *args)
340
+ options = args.last.is_a?(Hash) ? args.pop : {}
341
+ options[:color] = args.shift.to_s.to_sym unless args.empty?
342
+ keys = options.keys
343
+ keys.each{|key| options[key.to_s.to_sym] = options.delete(key)}
344
+
345
+ color = options[:color]
346
+ bold = options.has_key?(:bold)
347
+
348
+ parts = [phrase]
349
+ parts.unshift(This.ansi[color]) if color
350
+ parts.unshift(This.ansi[:bold]) if bold
351
+ parts.push(This.ansi[:clear]) if parts.size > 1
352
+
353
+ method = options[:method] || :puts
354
+
355
+ Kernel.send(method, parts.join)
356
+ end
357
+
358
+ # always run out of the project dir
359
+ #
241
360
  Dir.chdir(This.dir)
242
361
  }
data/lib/fattr.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Fattr
2
- Fattr::Version = '2.1.0' unless Fattr.const_defined?(:Version)
2
+ Fattr::Version = '2.2.0' unless Fattr.const_defined?(:Version)
3
3
  def self.version() Fattr::Version end
4
4
 
5
5
  class List < ::Array
@@ -72,7 +72,7 @@ module Fattr
72
72
 
73
73
  initialize = (
74
74
  if inheritable
75
- lambda do
75
+ lambda do |*ignored|
76
76
  parents = ancestors[1..-1]
77
77
  catch(:value) do
78
78
  parents.each do |parent|
@@ -82,7 +82,7 @@ module Fattr
82
82
  end
83
83
  end
84
84
  else
85
- block || lambda{ default }
85
+ block || lambda{|*ignored| default }
86
86
  end
87
87
  )
88
88
 
@@ -123,6 +123,7 @@ module Fattr
123
123
  compile[code]
124
124
 
125
125
  # bang method re-calls any initializer given at declaration time
126
+ =begin
126
127
  code = <<-code
127
128
  def #{ name }!
128
129
  initializer = ObjectSpace._id2ref #{ initializer_id }
@@ -131,6 +132,14 @@ module Fattr
131
132
  end
132
133
  code
133
134
  compile[code]
135
+ =end
136
+
137
+ module_eval do
138
+ define_method :"#{ name }!" do
139
+ self.send :"#{ name }=", initializer.call(self)
140
+ self.instance_variable_get :"@#{name}"
141
+ end
142
+ end
134
143
 
135
144
  # query simply defers to getter - cast to bool
136
145
  code = <<-code
@@ -10,6 +10,7 @@ Testing Fattr do
10
10
 
11
11
  testing 'that the basic usage works' do
12
12
  o = Class.new{ fattr :a }.new
13
+ p o.a
13
14
  assert{ o.a==nil }
14
15
  assert{ o.a=42 }
15
16
  assert{ o.a(42.0) }
@@ -123,10 +124,16 @@ BEGIN {
123
124
  words.join('-').downcase
124
125
  end
125
126
 
126
- @@testing_subclass_count = 0 unless defined?(@@testing_subclass_count)
127
- @@testing_subclass_count += 1
127
+ def self.testing_subclass_count
128
+ @testing_subclass_count ||= 0
129
+ end
130
+ def self.testing_subclass_count=(value)
131
+ @testing_subclass_count = value
132
+ end
133
+
134
+ self.testing_subclass_count += 1
128
135
  slug = slug_for(*args).gsub(%r/-/,'_')
129
- name = ['TESTING', '%03d' % @@testing_subclass_count, slug].delete_if{|part| part.empty?}.join('_')
136
+ name = ['TESTING', '%03d' % self.testing_subclass_count, slug].delete_if{|part| part.empty?}.join('_')
130
137
  name = name.upcase!
131
138
  const_set(:Name, name)
132
139
  def self.name() const_get(:Name) end
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fattr
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ prerelease: false
5
+ segments:
6
+ - 2
7
+ - 2
8
+ - 0
9
+ version: 2.2.0
5
10
  platform: ruby
6
11
  authors:
7
12
  - Ara T. Howard
@@ -9,11 +14,11 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2009-10-12 00:00:00 -06:00
17
+ date: 2010-11-08 00:00:00 -07:00
13
18
  default_executable:
14
19
  dependencies: []
15
20
 
16
- description: fattr.rb is a "fatter attr" for ruby
21
+ description: "description: fattr kicks the ass"
17
22
  email: ara.t.howard@gmail.com
18
23
  executables: []
19
24
 
@@ -22,9 +27,8 @@ extensions: []
22
27
  extra_rdoc_files: []
23
28
 
24
29
  files:
25
- - a.rb
26
- - fattr.gemspec
27
30
  - lib/fattr.rb
31
+ - LICENSE
28
32
  - Rakefile
29
33
  - README
30
34
  - README.erb
@@ -36,7 +40,7 @@ files:
36
40
  - samples/f.rb
37
41
  - samples/g.rb
38
42
  - samples/h.rb
39
- - test/fattr.rb
43
+ - test/fattr_test.rb
40
44
  has_rdoc: true
41
45
  homepage: http://github.com/ahoward/fattr/tree/master
42
46
  licenses: []
@@ -47,23 +51,27 @@ rdoc_options: []
47
51
  require_paths:
48
52
  - lib
49
53
  required_ruby_version: !ruby/object:Gem::Requirement
54
+ none: false
50
55
  requirements:
51
56
  - - ">="
52
57
  - !ruby/object:Gem::Version
58
+ segments:
59
+ - 0
53
60
  version: "0"
54
- version:
55
61
  required_rubygems_version: !ruby/object:Gem::Requirement
62
+ none: false
56
63
  requirements:
57
64
  - - ">="
58
65
  - !ruby/object:Gem::Version
66
+ segments:
67
+ - 0
59
68
  version: "0"
60
- version:
61
69
  requirements: []
62
70
 
63
71
  rubyforge_project: codeforpeople
64
- rubygems_version: 1.3.5
72
+ rubygems_version: 1.3.7
65
73
  signing_key:
66
74
  specification_version: 3
67
75
  summary: fattr
68
- test_files:
69
- - test/fattr.rb
76
+ test_files: []
77
+
data/a.rb DELETED
@@ -1,42 +0,0 @@
1
- require 'rubygems'
2
- require 'fattr'
3
-
4
- class A
5
- class << A
6
- fattr(:x, :inheritable => true){ 42 }
7
- end
8
- end
9
-
10
- class B < A; end
11
-
12
- class C < B; end
13
-
14
-
15
- p C.x
16
- p B.x
17
- p A.x
18
- puts
19
-
20
- B.x = 42.0
21
-
22
- p C.x
23
- p B.x
24
- p A.x
25
- puts
26
-
27
- C.x! # force re-initialization from parent(s)
28
-
29
- p C.x
30
- p B.x
31
- p A.x
32
- puts
33
-
34
-
35
- class K
36
- end
37
- module M
38
- fattr(:x, :inheritable => true){ 42 }
39
- end
40
- K.extend(M)
41
-
42
- p K.x
data/fattr.gemspec DELETED
@@ -1,29 +0,0 @@
1
- ## fattr.gemspec
2
- #
3
-
4
- Gem::Specification::new do |spec|
5
- spec.name = "fattr"
6
- spec.description = 'fattr.rb is a "fatter attr" for ruby'
7
- spec.version = "2.1.0"
8
- spec.platform = Gem::Platform::RUBY
9
- spec.summary = "fattr"
10
-
11
- spec.files = ["a.rb", "fattr.gemspec", "lib", "lib/fattr.rb", "Rakefile", "README", "README.erb", "samples", "samples/a.rb", "samples/b.rb", "samples/c.rb", "samples/d.rb", "samples/e.rb", "samples/f.rb", "samples/g.rb", "samples/h.rb", "test", "test/fattr.rb"]
12
- spec.executables = []
13
-
14
-
15
- spec.require_path = "lib"
16
-
17
-
18
- spec.has_rdoc = true
19
- spec.test_files = "test/fattr.rb"
20
- #spec.add_dependency 'lib', '>= version'
21
- #spec.add_dependency 'fattr'
22
-
23
- spec.extensions.push(*[])
24
-
25
- spec.rubyforge_project = "codeforpeople"
26
- spec.author = "Ara T. Howard"
27
- spec.email = "ara.t.howard@gmail.com"
28
- spec.homepage = "http://github.com/ahoward/fattr/tree/master"
29
- end