dao 8.0.0 → 8.0.1

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.
@@ -1,31 +0,0 @@
1
- ## coerce.gemspec
2
- #
3
-
4
- Gem::Specification::new do |spec|
5
- spec.name = "coerce"
6
- spec.version = "0.0.8"
7
- spec.platform = Gem::Platform::RUBY
8
- spec.summary = "coerce"
9
- spec.description = "description: coerce kicks the ass"
10
- spec.license = "same as ruby's"
11
-
12
- spec.files =
13
- ["README", "Rakefile", "coerce.gemspec", "lib", "lib/coerce.rb"]
14
-
15
- spec.executables = []
16
-
17
- spec.require_path = "lib"
18
-
19
- spec.test_files = nil
20
-
21
-
22
- spec.add_dependency(*["chronic", ">= 0.6.2"])
23
-
24
-
25
- spec.extensions.push(*[])
26
-
27
- spec.rubyforge_project = "codeforpeople"
28
- spec.author = "Ara T. Howard"
29
- spec.email = "ara.t.howard@gmail.com"
30
- spec.homepage = "https://github.com/ahoward/coerce"
31
- end
@@ -1,210 +0,0 @@
1
- module Coerce
2
- ## built-in
3
- #
4
- require 'uri'
5
- require 'time'
6
- require 'date'
7
- require 'pathname'
8
- require 'chronic'
9
-
10
- ## version
11
- #
12
- Coerce::Version = '0.0.8'
13
-
14
- def self.version
15
- Coerce::Version
16
- end
17
-
18
- ## dependencies
19
- #
20
- def self.dependencies
21
- {
22
- 'chronic' => [ 'chronic' , '>= 0.6.2' ]
23
- }
24
- end
25
-
26
- begin
27
- require 'rubygems'
28
- rescue LoadError
29
- nil
30
- end
31
-
32
- if defined?(gem)
33
- self.dependencies.each do |lib, dependency|
34
- gem(*dependency)
35
- require(lib)
36
- end
37
- end
38
-
39
- ##
40
- #
41
- def self.export m
42
- module_function m
43
- public m
44
- end
45
-
46
- List = []
47
-
48
- def self.coerce m, &b
49
- define_method m, &b
50
- export m
51
- List << m.to_s
52
- end
53
-
54
- coerce :boolean do |obj|
55
- case obj.to_s
56
- when %r/^(true|t|1|yes|y|on)$/i
57
- true
58
- when %r/^(false|f|0|no|n|off)$/i
59
- false
60
- else
61
- !!obj
62
- end
63
- end
64
-
65
- coerce :integer do |obj|
66
- Float(obj).to_i
67
- end
68
-
69
- coerce :float do |obj|
70
- Float obj
71
- end
72
-
73
- coerce :number do |obj|
74
- Float obj rescue Integer obj
75
- end
76
-
77
- coerce :string do |obj|
78
- String obj
79
- end
80
-
81
- coerce :symbol do |obj|
82
- String(obj).to_sym
83
- end
84
-
85
- coerce :uri do |obj|
86
- ::URI.parse obj.to_s
87
- end
88
-
89
- coerce :url do |obj|
90
- ::URI.parse(obj.to_s).to_s
91
- end
92
-
93
- coerce :time do |obj|
94
- ::Chronic.parse(obj.to_s)
95
- end
96
-
97
- coerce :date do |obj|
98
- begin
99
- ::Date.parse(::Chronic.parse(obj.to_s).to_s)
100
- rescue
101
- ::Date.parse(obj.to_s)
102
- end
103
- end
104
-
105
- coerce :pathname do |obj|
106
- Pathname.new(obj.to_s)
107
- end
108
-
109
- coerce :path do |obj|
110
- File.expand_path(obj.to_s)
111
- end
112
-
113
- coerce :input do |obj|
114
- case obj.to_s
115
- when '-'
116
- io = STDIN.dup
117
- io.fattr(:path){ '/dev/stdin' }
118
- io
119
- else
120
- io = open(obj.to_s, 'r+')
121
- at_exit{ io.close }
122
- io
123
- end
124
- end
125
-
126
- coerce :output do |obj|
127
- case obj.to_s
128
- when '-'
129
- io = STDOUT.dup
130
- io.fattr(:path){ '/dev/stdout' }
131
- io
132
- else
133
- io = open(obj.to_s, 'w+')
134
- at_exit{ io.close }
135
- io
136
- end
137
- end
138
-
139
- coerce :slug do |obj|
140
- string = [obj].flatten.compact.join('-')
141
- words = string.to_s.scan(%r/\w+/)
142
- words.map!{|word| word.gsub %r/[^0-9a-zA-Z_-]/, ''}
143
- words.delete_if{|word| word.nil? or word.strip.empty?}
144
- String(words.join('-').downcase)
145
- end
146
-
147
- coerce :list do |*objs|
148
- [*objs].flatten.join(',').split(/[\n,]/).map{|item| item.strip}.delete_if{|item| item.strip.empty?}
149
- end
150
-
151
- coerce :array do |*objs|
152
- [*objs].flatten.join(',').split(/[\n,]/).map{|item| item.strip}.delete_if{|item| item.strip.empty?}
153
- end
154
-
155
- coerce :hash do |*objs|
156
- list = Coerce.list(*objs)
157
- hash = Hash.new
158
- list.each do |pair|
159
- k, v = pair.split(/[=:]+/, 2)
160
- key = k.to_s.strip
161
- val = v.to_s.strip
162
- hash[key] = val
163
- end
164
- hash
165
- end
166
-
167
- # add list_of_xxx methods
168
- #
169
- List.dup.each do |type|
170
- next if type.to_s =~ %r/list/
171
- %W" list_of_#{ type } list_of_#{ type }s ".each do |m|
172
- define_method m do |*objs|
173
- list(*objs).map{|obj| send type, obj}
174
- end
175
- export m
176
- List << m
177
- end
178
- end
179
-
180
- # add list_of_xxx_from_file
181
- #
182
- List.dup.each do |type|
183
- next if type.to_s =~ %r/list/
184
- %W" list_of_#{ type }_from_file list_of_#{ type }s_from_file ".each do |m|
185
- define_method m do |*args|
186
- buf = nil
187
- if args.size == 1 and args.first.respond_to?(:read)
188
- buf = args.first.read
189
- else
190
- open(*args){|io| buf = io.read}
191
- end
192
- send(m.sub(/_from_file/, ''), buf)
193
- end
194
- export m
195
- List << m
196
- end
197
- end
198
-
199
- def self.[] sym
200
- prefix = sym.to_s.downcase.to_sym
201
- candidates = List.select{|m| m =~ %r/^#{ prefix }/i}
202
- m = candidates.shift
203
- raise ArgumentError, "unsupported coercion: #{ sym.inspect } (#{ List.join ',' })" unless
204
- m
205
- raise ArgumentError, "ambiguous coercion: #{ sym.inspect } (#{ List.join ',' })" unless
206
- candidates.empty? or m.to_s == sym.to_s
207
- this = self
208
- lambda{|obj| method(m).call obj}
209
- end
210
- end
@@ -1,57 +0,0 @@
1
- NAME
2
- wrap
3
-
4
- SYNOPSIS
5
- non-sucking :before and :after filters for any ruby class
6
-
7
- DESCRIPTION
8
- yes yes, active_support does this. but crapily. with active_support you'll
9
- need to do this
10
-
11
-
12
- class Record
13
- include ActiveSupport::Callbacks
14
- define_callbacks :save
15
-
16
- def save
17
- run_callbacks :save do
18
- puts "- save"
19
- end
20
- end
21
- end
22
-
23
- but hey, if a subclass forgets to call 'super' or doesn't manually run
24
- 'run_callbacks' the codez are *screwed*. that sux. why not this?
25
-
26
-
27
- class Record
28
- include Wrap
29
-
30
- wrap :save
31
- end
32
-
33
-
34
- yes, it's that simple. you can now do
35
-
36
- class SubRecord < Record
37
- before :save do
38
- special_sauce
39
- end
40
-
41
- def save
42
- no_special_sauce
43
- end
44
- end
45
-
46
- did you get that? the :before and :after hooks will be called no matter
47
- what the subclass does. the method will be wrapped, period. no special
48
- work required. of course, if the sublcass messes with 'method_added' their
49
- will be hell to pay. that's the price for simplicity.
50
-
51
- the callbacks are very close, but not identical to active_supports. you can
52
- return 'false' to halt the chain, but you can also simply call 'halt!'.
53
- another neat trick is that :before callbacks will be called with the
54
- arguments to the wrapped method itself iff possible and :after callbacks
55
- will be called with the result of the wrapped method, iff possible.
56
-
57
- the test suite reads pretty damn clean. have a go.
@@ -1,394 +0,0 @@
1
- This.rubyforge_project = 'codeforpeople'
2
- This.author = "Ara T. Howard"
3
- This.email = "ara.t.howard@gmail.com"
4
- This.homepage = "https://github.com/ahoward/#{ This.lib }"
5
-
6
- task :license do
7
- open('LICENSE', 'w'){|fd| fd.puts "same as ruby's"}
8
- end
9
-
10
- task :default do
11
- puts((Rake::Task.tasks.map{|task| task.name.gsub(/::/,':')} - ['default']).sort)
12
- end
13
-
14
- task :test do
15
- run_tests!
16
- end
17
-
18
- namespace :test do
19
- task(:unit){ run_tests!(:unit) }
20
- task(:functional){ run_tests!(:functional) }
21
- task(:integration){ run_tests!(:integration) }
22
- end
23
-
24
- def run_tests!(which = nil)
25
- which ||= '**'
26
- test_dir = File.join(This.dir, "test")
27
- test_glob ||= File.join(test_dir, "#{ which }/**_test.rb")
28
- test_rbs = Dir.glob(test_glob).sort
29
-
30
- div = ('=' * 119)
31
- line = ('-' * 119)
32
-
33
- test_rbs.each_with_index do |test_rb, index|
34
- testno = index + 1
35
- command = "#{ This.ruby } -w -I ./lib -I ./test/lib #{ test_rb }"
36
-
37
- puts
38
- say(div, :color => :cyan, :bold => true)
39
- say("@#{ testno } => ", :bold => true, :method => :print)
40
- say(command, :color => :cyan, :bold => true)
41
- say(line, :color => :cyan, :bold => true)
42
-
43
- system(command)
44
-
45
- say(line, :color => :cyan, :bold => true)
46
-
47
- status = $?.exitstatus
48
-
49
- if status.zero?
50
- say("@#{ testno } <= ", :bold => true, :color => :white, :method => :print)
51
- say("SUCCESS", :color => :green, :bold => true)
52
- else
53
- say("@#{ testno } <= ", :bold => true, :color => :white, :method => :print)
54
- say("FAILURE", :color => :red, :bold => true)
55
- end
56
- say(line, :color => :cyan, :bold => true)
57
-
58
- exit(status) unless status.zero?
59
- end
60
- end
61
-
62
-
63
- task :gemspec do
64
- ignore_extensions = ['git', 'svn', 'tmp', /sw./, 'bak', 'gem']
65
- ignore_directories = ['pkg']
66
- ignore_files = ['test/log']
67
-
68
- shiteless =
69
- lambda do |list|
70
- list.delete_if do |entry|
71
- next unless test(?e, entry)
72
- extension = File.basename(entry).split(%r/[.]/).last
73
- ignore_extensions.any?{|ext| ext === extension}
74
- end
75
- list.delete_if do |entry|
76
- next unless test(?d, entry)
77
- dirname = File.expand_path(entry)
78
- ignore_directories.any?{|dir| File.expand_path(dir) == dirname}
79
- end
80
- list.delete_if do |entry|
81
- next unless test(?f, entry)
82
- filename = File.expand_path(entry)
83
- ignore_files.any?{|file| File.expand_path(file) == filename}
84
- end
85
- end
86
-
87
- lib = This.lib
88
- object = This.object
89
- version = This.version
90
- files = shiteless[Dir::glob("**/**")]
91
- executables = shiteless[Dir::glob("bin/*")].map{|exe| File.basename(exe)}
92
- #has_rdoc = true #File.exist?('doc')
93
- test_files = "test/#{ lib }.rb" if File.file?("test/#{ lib }.rb")
94
- summary = object.respond_to?(:summary) ? object.summary : "summary: #{ lib } kicks the ass"
95
- description = object.respond_to?(:description) ? object.description : "description: #{ lib } kicks the ass"
96
- license = object.respond_to?(:license) ? object.license : "same as ruby's"
97
-
98
- if This.extensions.nil?
99
- This.extensions = []
100
- extensions = This.extensions
101
- %w( Makefile configure extconf.rb ).each do |ext|
102
- extensions << ext if File.exists?(ext)
103
- end
104
- end
105
- extensions = [extensions].flatten.compact
106
-
107
- if This.dependencies.nil?
108
- dependencies = []
109
- else
110
- case This.dependencies
111
- when Hash
112
- dependencies = This.dependencies.values
113
- when Array
114
- dependencies = This.dependencies
115
- end
116
- end
117
-
118
- template =
119
- if test(?e, 'gemspec.erb')
120
- Template{ IO.read('gemspec.erb') }
121
- else
122
- Template {
123
- <<-__
124
- ## <%= lib %>.gemspec
125
- #
126
-
127
- Gem::Specification::new do |spec|
128
- spec.name = <%= lib.inspect %>
129
- spec.version = <%= version.inspect %>
130
- spec.platform = Gem::Platform::RUBY
131
- spec.summary = <%= lib.inspect %>
132
- spec.description = <%= description.inspect %>
133
- spec.license = <%= license.inspect %>
134
-
135
- spec.files =\n<%= files.sort.pretty_inspect %>
136
- spec.executables = <%= executables.inspect %>
137
-
138
- spec.require_path = "lib"
139
-
140
- spec.test_files = <%= test_files.inspect %>
141
-
142
- <% dependencies.each do |lib_version| %>
143
- spec.add_dependency(*<%= Array(lib_version).flatten.inspect %>)
144
- <% end %>
145
-
146
- spec.extensions.push(*<%= extensions.inspect %>)
147
-
148
- spec.rubyforge_project = <%= This.rubyforge_project.inspect %>
149
- spec.author = <%= This.author.inspect %>
150
- spec.email = <%= This.email.inspect %>
151
- spec.homepage = <%= This.homepage.inspect %>
152
- end
153
- __
154
- }
155
- end
156
-
157
- Fu.mkdir_p(This.pkgdir)
158
- gemspec = "#{ lib }.gemspec"
159
- open(gemspec, "w"){|fd| fd.puts(template)}
160
- This.gemspec = gemspec
161
- end
162
-
163
- task :gem => [:clean, :gemspec] do
164
- Fu.mkdir_p(This.pkgdir)
165
- before = Dir['*.gem']
166
- cmd = "gem build #{ This.gemspec }"
167
- `#{ cmd }`
168
- after = Dir['*.gem']
169
- gem = ((after - before).first || after.first) or abort('no gem!')
170
- Fu.mv(gem, This.pkgdir)
171
- This.gem = File.join(This.pkgdir, File.basename(gem))
172
- end
173
-
174
- task :readme do
175
- samples = ''
176
- prompt = '~ > '
177
- lib = This.lib
178
- version = This.version
179
-
180
- Dir['sample*/*'].sort.each do |sample|
181
- samples << "\n" << " <========< #{ sample } >========>" << "\n\n"
182
-
183
- cmd = "cat #{ sample }"
184
- samples << Util.indent(prompt + cmd, 2) << "\n\n"
185
- samples << Util.indent(`#{ cmd }`, 4) << "\n"
186
-
187
- cmd = "ruby #{ sample }"
188
- samples << Util.indent(prompt + cmd, 2) << "\n\n"
189
-
190
- cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -I ./lib #{ sample })'"
191
- samples << Util.indent(`#{ cmd } 2>&1`, 4) << "\n"
192
- end
193
-
194
- template =
195
- if test(?e, 'README.erb')
196
- Template{ IO.read('README.erb') }
197
- else
198
- Template {
199
- <<-__
200
- NAME
201
- #{ lib }
202
-
203
- DESCRIPTION
204
-
205
- INSTALL
206
- gem install #{ lib }
207
-
208
- SAMPLES
209
- #{ samples }
210
- __
211
- }
212
- end
213
-
214
- open("README", "w"){|fd| fd.puts template}
215
- end
216
-
217
-
218
- task :clean do
219
- Dir[File.join(This.pkgdir, '**/**')].each{|entry| Fu.rm_rf(entry)}
220
- end
221
-
222
-
223
- task :release => [:clean, :gemspec, :gem] do
224
- gems = Dir[File.join(This.pkgdir, '*.gem')].flatten
225
- raise "which one? : #{ gems.inspect }" if gems.size > 1
226
- raise "no gems?" if gems.size < 1
227
-
228
- cmd = "gem push #{ This.gem }"
229
- puts cmd
230
- puts
231
- system(cmd)
232
- abort("cmd(#{ cmd }) failed with (#{ $?.inspect })") unless $?.exitstatus.zero?
233
-
234
- cmd = "rubyforge login && rubyforge add_release #{ This.rubyforge_project } #{ This.lib } #{ This.version } #{ This.gem }"
235
- puts cmd
236
- puts
237
- system(cmd)
238
- abort("cmd(#{ cmd }) failed with (#{ $?.inspect })") unless $?.exitstatus.zero?
239
- end
240
-
241
-
242
-
243
-
244
-
245
- BEGIN {
246
- # support for this rakefile
247
- #
248
- $VERBOSE = nil
249
-
250
- require 'ostruct'
251
- require 'erb'
252
- require 'fileutils'
253
- require 'rbconfig'
254
- require 'pp'
255
-
256
- # fu shortcut
257
- #
258
- Fu = FileUtils
259
-
260
- # cache a bunch of stuff about this rakefile/environment
261
- #
262
- This = OpenStruct.new
263
-
264
- This.file = File.expand_path(__FILE__)
265
- This.dir = File.dirname(This.file)
266
- This.pkgdir = File.join(This.dir, 'pkg')
267
-
268
- # grok lib
269
- #
270
- lib = ENV['LIB']
271
- unless lib
272
- lib = File.basename(Dir.pwd).sub(/[-].*$/, '')
273
- end
274
- This.lib = lib
275
-
276
- # grok version
277
- #
278
- version = ENV['VERSION']
279
- unless version
280
- require "./lib/#{ This.lib }"
281
- This.name = lib.capitalize
282
- This.object = eval(This.name)
283
- version = This.object.send(:version)
284
- end
285
- This.version = version
286
-
287
- # see if dependencies are export by the module
288
- #
289
- if This.object.respond_to?(:dependencies)
290
- This.dependencies = This.object.dependencies
291
- end
292
-
293
- # we need to know the name of the lib an it's version
294
- #
295
- abort('no lib') unless This.lib
296
- abort('no version') unless This.version
297
-
298
- # discover full path to this ruby executable
299
- #
300
- c = Config::CONFIG
301
- bindir = c["bindir"] || c['BINDIR']
302
- ruby_install_name = c['ruby_install_name'] || c['RUBY_INSTALL_NAME'] || 'ruby'
303
- ruby_ext = c['EXEEXT'] || ''
304
- ruby = File.join(bindir, (ruby_install_name + ruby_ext))
305
- This.ruby = ruby
306
-
307
- # some utils
308
- #
309
- module Util
310
- def indent(s, n = 2)
311
- s = unindent(s)
312
- ws = ' ' * n
313
- s.gsub(%r/^/, ws)
314
- end
315
-
316
- def unindent(s)
317
- indent = nil
318
- s.each_line do |line|
319
- next if line =~ %r/^\s*$/
320
- indent = line[%r/^\s*/] and break
321
- end
322
- indent ? s.gsub(%r/^#{ indent }/, "") : s
323
- end
324
- extend self
325
- end
326
-
327
- # template support
328
- #
329
- class Template
330
- def initialize(&block)
331
- @block = block
332
- @template = block.call.to_s
333
- end
334
- def expand(b=nil)
335
- ERB.new(Util.unindent(@template)).result((b||@block).binding)
336
- end
337
- alias_method 'to_s', 'expand'
338
- end
339
- def Template(*args, &block) Template.new(*args, &block) end
340
-
341
- # colored console output support
342
- #
343
- This.ansi = {
344
- :clear => "\e[0m",
345
- :reset => "\e[0m",
346
- :erase_line => "\e[K",
347
- :erase_char => "\e[P",
348
- :bold => "\e[1m",
349
- :dark => "\e[2m",
350
- :underline => "\e[4m",
351
- :underscore => "\e[4m",
352
- :blink => "\e[5m",
353
- :reverse => "\e[7m",
354
- :concealed => "\e[8m",
355
- :black => "\e[30m",
356
- :red => "\e[31m",
357
- :green => "\e[32m",
358
- :yellow => "\e[33m",
359
- :blue => "\e[34m",
360
- :magenta => "\e[35m",
361
- :cyan => "\e[36m",
362
- :white => "\e[37m",
363
- :on_black => "\e[40m",
364
- :on_red => "\e[41m",
365
- :on_green => "\e[42m",
366
- :on_yellow => "\e[43m",
367
- :on_blue => "\e[44m",
368
- :on_magenta => "\e[45m",
369
- :on_cyan => "\e[46m",
370
- :on_white => "\e[47m"
371
- }
372
- def say(phrase, *args)
373
- options = args.last.is_a?(Hash) ? args.pop : {}
374
- options[:color] = args.shift.to_s.to_sym unless args.empty?
375
- keys = options.keys
376
- keys.each{|key| options[key.to_s.to_sym] = options.delete(key)}
377
-
378
- color = options[:color]
379
- bold = options.has_key?(:bold)
380
-
381
- parts = [phrase]
382
- parts.unshift(This.ansi[color]) if color
383
- parts.unshift(This.ansi[:bold]) if bold
384
- parts.push(This.ansi[:clear]) if parts.size > 1
385
-
386
- method = options[:method] || :puts
387
-
388
- Kernel.send(method, parts.join)
389
- end
390
-
391
- # always run out of the project dir
392
- #
393
- Dir.chdir(This.dir)
394
- }