dao 8.0.0 → 8.0.1

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