dm-is-reflective 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. data/.gita/COMMIT_EDITMSG +9 -0
  2. data/.gita/HEAD +1 -0
  3. data/.gita/ORIG_HEAD +1 -0
  4. data/.gita/RENAMED-REF +1 -0
  5. data/.gita/config +9 -0
  6. data/.gita/description +1 -0
  7. data/.gita/gitk.cache +6 -0
  8. data/.gita/hooks/applypatch-msg +15 -0
  9. data/.gita/hooks/commit-msg +24 -0
  10. data/.gita/hooks/post-commit +8 -0
  11. data/.gita/hooks/post-receive +16 -0
  12. data/.gita/hooks/post-update +8 -0
  13. data/.gita/hooks/pre-applypatch +14 -0
  14. data/.gita/hooks/pre-commit +70 -0
  15. data/.gita/hooks/pre-rebase +150 -0
  16. data/.gita/hooks/prepare-commit-msg +36 -0
  17. data/.gita/hooks/update +107 -0
  18. data/.gita/index +0 -0
  19. data/.gita/info/exclude +6 -0
  20. data/.gita/info/refs +26 -0
  21. data/.gita/logs/HEAD +40 -0
  22. data/.gita/logs/refs/heads/dm-mapping +1 -0
  23. data/.gita/logs/refs/heads/master +40 -0
  24. data/.gita/logs/refs/heads/return-symbol +0 -0
  25. data/.gita/logs/refs/remotes/origin/dm-mapping +1 -0
  26. data/.gita/logs/refs/remotes/origin/master +6 -0
  27. data/.gita/logs/refs/remotes/origin/return-symbol +0 -0
  28. data/.gita/objects/5c/91380a1616b7c2d23e14eeb49d9edde58e1f47 +2 -0
  29. data/.gita/objects/63/71947bcb9c0dd1d3b3d6f449b2d4b4c6c81e63 +0 -0
  30. data/.gita/objects/73/23ae22118cc54fb0bbb0d6f51cc99191019b96 +0 -0
  31. data/.gita/objects/81/a0ab6e4dbd148faa0644307b313799027d3344 +2 -0
  32. data/.gita/objects/b2/9571a21e3bccb60079dfca630dac981f623489 +5 -0
  33. data/.gita/objects/cb/138acf9efc0f5b3ff91c644cae4dec868442e4 +5 -0
  34. data/.gita/objects/d5/66699fc7ba5237311cc44648d0cd2abbaa895e +0 -0
  35. data/.gita/objects/info/packs +2 -0
  36. data/.gita/objects/pack/pack-c9156ef3406b98f5f12875b13643df7a5f41e42c.idx +0 -0
  37. data/.gita/objects/pack/pack-c9156ef3406b98f5f12875b13643df7a5f41e42c.pack +0 -0
  38. data/.gita/packed-refs +27 -0
  39. data/.gita/refs/heads/master +1 -0
  40. data/.gita/refs/tags/dm-is-reflective-0.8.0 +1 -0
  41. data/CHANGES +189 -0
  42. data/LICENSE +201 -0
  43. data/NOTICE +30 -0
  44. data/README +122 -0
  45. data/Rakefile +45 -0
  46. data/TODO +7 -0
  47. data/dm-is-reflective.gemspec +41 -0
  48. data/lib/dm-is-reflective.rb +10 -0
  49. data/lib/dm-is-reflective/is/adapters/abstract_adapter.rb +144 -0
  50. data/lib/dm-is-reflective/is/adapters/mysql_adapter.rb +62 -0
  51. data/lib/dm-is-reflective/is/adapters/postgres_adapter.rb +84 -0
  52. data/lib/dm-is-reflective/is/adapters/sqlite3_adapter.rb +61 -0
  53. data/lib/dm-is-reflective/is/reflective.rb +78 -0
  54. data/lib/dm-is-reflective/is/version.rb +7 -0
  55. data/lib/dm-is-reflective/version.rb +7 -0
  56. data/tasks/ann.rake +80 -0
  57. data/tasks/bones.rake +20 -0
  58. data/tasks/gem.rake +201 -0
  59. data/tasks/git.rake +40 -0
  60. data/tasks/notes.rake +27 -0
  61. data/tasks/post_load.rake +34 -0
  62. data/tasks/rdoc.rake +51 -0
  63. data/tasks/rubyforge.rake +55 -0
  64. data/tasks/setup.rb +294 -0
  65. data/tasks/spec.rake +54 -0
  66. data/tasks/svn.rake +47 -0
  67. data/tasks/test.rake +40 -0
  68. data/tasks/zentest.rake +36 -0
  69. data/test/abstract.rb +250 -0
  70. data/test/test_dm-is-reflexible.rb +48 -0
  71. metadata +203 -0
data/tasks/git.rake ADDED
@@ -0,0 +1,40 @@
1
+
2
+ if HAVE_GIT
3
+
4
+ namespace :git do
5
+
6
+ # A prerequisites task that all other tasks depend upon
7
+ task :prereqs
8
+
9
+ desc 'Show tags from the Git repository'
10
+ task :show_tags => 'git:prereqs' do |t|
11
+ puts %x/git tag/
12
+ end
13
+
14
+ desc 'Create a new tag in the Git repository'
15
+ task :create_tag => 'git:prereqs' do |t|
16
+ v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
17
+ abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
18
+
19
+ tag = "%s-%s" % [PROJ.name, PROJ.version]
20
+ msg = "Creating tag for #{PROJ.name} version #{PROJ.version}"
21
+
22
+ puts "Creating Git tag '#{tag}'"
23
+ unless system "git tag -a -m '#{msg}' #{tag}"
24
+ abort "Tag creation failed"
25
+ end
26
+
27
+ if %x/git remote/ =~ %r/^origin\s*$/
28
+ unless system "git push origin #{tag}"
29
+ abort "Could not push tag to remote Git repository"
30
+ end
31
+ end
32
+ end
33
+
34
+ end # namespace :git
35
+
36
+ task 'gem:release' => 'git:create_tag'
37
+
38
+ end # if HAVE_GIT
39
+
40
+ # EOF
data/tasks/notes.rake ADDED
@@ -0,0 +1,27 @@
1
+
2
+ if HAVE_BONES
3
+
4
+ desc "Enumerate all annotations"
5
+ task :notes do |t|
6
+ id = if t.application.top_level_tasks.length > 1
7
+ t.application.top_level_tasks.slice!(1..-1).join(' ')
8
+ end
9
+ Bones::AnnotationExtractor.enumerate(
10
+ PROJ, PROJ.notes.tags.join('|'), id, :tag => true)
11
+ end
12
+
13
+ namespace :notes do
14
+ PROJ.notes.tags.each do |tag|
15
+ desc "Enumerate all #{tag} annotations"
16
+ task tag.downcase.to_sym do |t|
17
+ id = if t.application.top_level_tasks.length > 1
18
+ t.application.top_level_tasks.slice!(1..-1).join(' ')
19
+ end
20
+ Bones::AnnotationExtractor.enumerate(PROJ, tag, id)
21
+ end
22
+ end
23
+ end
24
+
25
+ end # if HAVE_BONES
26
+
27
+ # EOF
@@ -0,0 +1,34 @@
1
+
2
+ # This file does not define any rake tasks. It is used to load some project
3
+ # settings if they are not defined by the user.
4
+
5
+ PROJ.exclude << ["^#{Regexp.escape(PROJ.ann.file)}$",
6
+ "^#{Regexp.escape(PROJ.ignore_file)}$",
7
+ "^#{Regexp.escape(PROJ.rdoc.dir)}/",
8
+ "^#{Regexp.escape(PROJ.rcov.dir)}/"]
9
+
10
+ flatten_arrays = lambda do |this,os|
11
+ os.instance_variable_get(:@table).each do |key,val|
12
+ next if key == :dependencies \
13
+ or key == :development_dependencies
14
+ case val
15
+ when Array; val.flatten!
16
+ when OpenStruct; this.call(this,val)
17
+ end
18
+ end
19
+ end
20
+ flatten_arrays.call(flatten_arrays,PROJ)
21
+
22
+ PROJ.changes ||= paragraphs_of(PROJ.history_file, 0..1).join("\n\n")
23
+
24
+ PROJ.description ||= paragraphs_of(PROJ.readme_file, 'description').join("\n\n")
25
+
26
+ PROJ.summary ||= PROJ.description.split('.').first
27
+
28
+ PROJ.gem.files ||= manifest
29
+
30
+ PROJ.gem.executables ||= PROJ.gem.files.find_all {|fn| fn =~ %r/^bin/}
31
+
32
+ PROJ.rdoc.main ||= PROJ.readme_file
33
+
34
+ # EOF
data/tasks/rdoc.rake ADDED
@@ -0,0 +1,51 @@
1
+
2
+ require 'rake/rdoctask'
3
+
4
+ namespace :doc do
5
+
6
+ desc 'Generate RDoc documentation'
7
+ Rake::RDocTask.new do |rd|
8
+ rdoc = PROJ.rdoc
9
+ rd.main = rdoc.main
10
+ rd.rdoc_dir = rdoc.dir
11
+
12
+ incl = Regexp.new(rdoc.include.join('|'))
13
+ excl = Regexp.new(rdoc.exclude.join('|'))
14
+ files = PROJ.gem.files.find_all do |fn|
15
+ case fn
16
+ when excl; false
17
+ when incl; true
18
+ else false end
19
+ end
20
+ rd.rdoc_files.push(*files)
21
+
22
+ name = PROJ.name
23
+ rf_name = PROJ.rubyforge.name
24
+
25
+ title = "#{name}-#{PROJ.version} Documentation"
26
+ title = "#{rf_name}'s " + title if rf_name.valid? and rf_name != name
27
+
28
+ rd.options << "-t #{title}"
29
+ rd.options.concat(rdoc.opts)
30
+ end
31
+
32
+ desc 'Generate ri locally for testing'
33
+ task :ri => :clobber_ri do
34
+ sh "#{RDOC} --ri -o ri ."
35
+ end
36
+
37
+ task :clobber_ri do
38
+ rm_r 'ri' rescue nil
39
+ end
40
+
41
+ end # namespace :doc
42
+
43
+ desc 'Alias to doc:rdoc'
44
+ task :doc => 'doc:rdoc'
45
+
46
+ desc 'Remove all build products'
47
+ task :clobber => %w(doc:clobber_rdoc doc:clobber_ri)
48
+
49
+ remove_desc_for_task %w(doc:clobber_rdoc)
50
+
51
+ # EOF
@@ -0,0 +1,55 @@
1
+
2
+ if PROJ.rubyforge.name.valid? && HAVE_RUBYFORGE
3
+
4
+ require 'rubyforge'
5
+ require 'rake/contrib/sshpublisher'
6
+
7
+ namespace :gem do
8
+ desc 'Package and upload to RubyForge'
9
+ task :release => [:clobber, 'gem'] do |t|
10
+ v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
11
+ abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
12
+ pkg = "pkg/#{PROJ.gem._spec.full_name}"
13
+
14
+ if $DEBUG then
15
+ puts "release_id = rf.add_release #{PROJ.rubyforge.name.inspect}, #{PROJ.name.inspect}, #{PROJ.version.inspect}, \"#{pkg}.tgz\""
16
+ puts "rf.add_file #{PROJ.rubyforge.name.inspect}, #{PROJ.name.inspect}, release_id, \"#{pkg}.gem\""
17
+ end
18
+
19
+ rf = RubyForge.new
20
+ rf.configure rescue nil
21
+ puts 'Logging in'
22
+ rf.login
23
+
24
+ c = rf.userconfig
25
+ c['release_notes'] = PROJ.description if PROJ.description
26
+ c['release_changes'] = PROJ.changes if PROJ.changes
27
+ c['preformatted'] = true
28
+
29
+ files = Dir.glob("#{pkg}*.*")
30
+
31
+ puts "Releasing #{PROJ.name} v. #{PROJ.version}"
32
+ rf.add_release PROJ.rubyforge.name, PROJ.name, PROJ.version, *files
33
+ end
34
+ end # namespace :gem
35
+
36
+
37
+ namespace :doc do
38
+ desc "Publish RDoc to RubyForge"
39
+ task :release => %w(doc:clobber_rdoc doc:rdoc) do
40
+ config = YAML.load(
41
+ File.read(File.expand_path('~/.rubyforge/user-config.yml'))
42
+ )
43
+
44
+ host = "#{config['username']}@rubyforge.org"
45
+ remote_dir = "/var/www/gforge-projects/#{PROJ.rubyforge.name}/"
46
+ remote_dir << PROJ.rdoc.remote_dir if PROJ.rdoc.remote_dir
47
+ local_dir = PROJ.rdoc.dir
48
+
49
+ Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
50
+ end
51
+ end # namespace :doc
52
+
53
+ end # if HAVE_RUBYFORGE
54
+
55
+ # EOF
data/tasks/setup.rb ADDED
@@ -0,0 +1,294 @@
1
+
2
+ require 'rubygems'
3
+ require 'rake'
4
+ require 'rake/clean'
5
+ require 'fileutils'
6
+ require 'ostruct'
7
+ require 'find'
8
+
9
+ class OpenStruct; undef :gem if defined? :gem; end
10
+
11
+ # TODO: make my own openstruct type object that includes descriptions
12
+ # TODO: use the descriptions to output help on the available bones options
13
+
14
+ PROJ = OpenStruct.new(
15
+ # Project Defaults
16
+ :name => nil,
17
+ :summary => nil,
18
+ :description => nil,
19
+ :changes => nil,
20
+ :authors => nil,
21
+ :email => nil,
22
+ :url => "\000",
23
+ :version => ENV['VERSION'] || '0.0.0',
24
+ :exclude => %w(tmp$ bak$ ~$ CVS \.svn/ \.git/ ^pkg/),
25
+ :include => %w(\A\Z),
26
+ :release_name => ENV['RELEASE'],
27
+
28
+ # System Defaults
29
+ :ruby_opts => %w(-w),
30
+ :libs => [],
31
+ :history_file => 'History.txt',
32
+ :readme_file => 'README.txt',
33
+ :ignore_file => '.bnsignore',
34
+
35
+ # Announce
36
+ :ann => OpenStruct.new(
37
+ :file => 'announcement.txt',
38
+ :text => nil,
39
+ :paragraphs => [],
40
+ :email => {
41
+ :from => nil,
42
+ :to => %w(ruby-talk@ruby-lang.org),
43
+ :server => 'localhost',
44
+ :port => 25,
45
+ :domain => ENV['HOSTNAME'],
46
+ :acct => nil,
47
+ :passwd => nil,
48
+ :authtype => :plain
49
+ }
50
+ ),
51
+
52
+ # Gem Packaging
53
+ :gem => OpenStruct.new(
54
+ :dependencies => [],
55
+ :development_dependencies => [],
56
+ :executables => nil,
57
+ :extensions => FileList['ext/**/extconf.rb'],
58
+ :files => nil,
59
+ :need_tar => true,
60
+ :need_zip => false,
61
+ :extras => {}
62
+ ),
63
+
64
+ # File Annotations
65
+ :notes => OpenStruct.new(
66
+ :exclude => %w(^tasks/setup\.rb$),
67
+ :extensions => %w(.txt .rb .erb .rdoc) << '',
68
+ :tags => %w(FIXME OPTIMIZE TODO)
69
+ ),
70
+
71
+ # Rcov
72
+ :rcov => OpenStruct.new(
73
+ :dir => 'coverage',
74
+ :opts => %w[--sort coverage -T],
75
+ :threshold => 90.0,
76
+ :threshold_exact => false
77
+ ),
78
+
79
+ # Rdoc
80
+ :rdoc => OpenStruct.new(
81
+ :opts => [],
82
+ :include => %w(^lib/ ^bin/ ^ext/ \.txt$ \.rdoc$),
83
+ :exclude => %w(extconf\.rb$),
84
+ :main => nil,
85
+ :dir => 'doc',
86
+ :remote_dir => nil
87
+ ),
88
+
89
+ # Rubyforge
90
+ :rubyforge => OpenStruct.new(
91
+ :name => "\000"
92
+ ),
93
+
94
+ # Rspec
95
+ :spec => OpenStruct.new(
96
+ :files => FileList['spec/**/*_spec.rb'],
97
+ :opts => []
98
+ ),
99
+
100
+ # Subversion Repository
101
+ :svn => OpenStruct.new(
102
+ :root => nil,
103
+ :path => '',
104
+ :trunk => 'trunk',
105
+ :tags => 'tags',
106
+ :branches => 'branches'
107
+ ),
108
+
109
+ # Test::Unit
110
+ :test => OpenStruct.new(
111
+ :files => FileList['test/**/test_*.rb'],
112
+ :file => 'test/all.rb',
113
+ :opts => []
114
+ )
115
+ )
116
+
117
+ # Load the other rake files in the tasks folder
118
+ tasks_dir = File.expand_path(File.dirname(__FILE__))
119
+ post_load_fn = File.join(tasks_dir, 'post_load.rake')
120
+ rakefiles = Dir.glob(File.join(tasks_dir, '*.rake')).sort
121
+ rakefiles.unshift(rakefiles.delete(post_load_fn)).compact!
122
+ import(*rakefiles)
123
+
124
+ # Setup the project libraries
125
+ %w(lib ext).each {|dir| PROJ.libs << dir if test ?d, dir}
126
+
127
+ # Setup some constants
128
+ DEV_NULL = File.exist?('/dev/null') ? '/dev/null' : 'NUL:'
129
+
130
+ def quiet( &block )
131
+ io = [STDOUT.dup, STDERR.dup]
132
+ STDOUT.reopen DEV_NULL
133
+ STDERR.reopen DEV_NULL
134
+ block.call
135
+ ensure
136
+ STDOUT.reopen io.first
137
+ STDERR.reopen io.last
138
+ $stdout, $stderr = STDOUT, STDERR
139
+ end
140
+
141
+ DIFF = if system("gdiff '#{__FILE__}' '#{__FILE__}' > #{DEV_NULL} 2>&1") then 'gdiff'
142
+ else 'diff' end unless defined? DIFF
143
+
144
+ SUDO = if system("which sudo > #{DEV_NULL} 2>&1") then 'sudo'
145
+ else '' end unless defined? SUDO
146
+
147
+ RCOV = "#{RUBY} -S rcov"
148
+ RDOC = "#{RUBY} -S rdoc"
149
+ GEM = "#{RUBY} -S gem"
150
+
151
+ %w(rcov spec/rake/spectask rubyforge bones facets/ansicode zentest).each do |lib|
152
+ begin
153
+ require lib
154
+ Object.instance_eval {const_set "HAVE_#{lib.tr('/','_').upcase}", true}
155
+ rescue LoadError
156
+ Object.instance_eval {const_set "HAVE_#{lib.tr('/','_').upcase}", false}
157
+ end
158
+ end
159
+ HAVE_SVN = (Dir.entries(Dir.pwd).include?('.svn') and
160
+ system("svn --version 2>&1 > #{DEV_NULL}"))
161
+ HAVE_GIT = (Dir.entries(Dir.pwd).include?('.git') and
162
+ system("git --version 2>&1 > #{DEV_NULL}"))
163
+
164
+ # Add bones as a development dependency
165
+ #
166
+ if HAVE_BONES
167
+ PROJ.gem.development_dependencies << ['bones', ">= #{Bones::VERSION}"]
168
+ end
169
+
170
+ # Reads a file at +path+ and spits out an array of the +paragraphs+
171
+ # specified.
172
+ #
173
+ # changes = paragraphs_of('History.txt', 0..1).join("\n\n")
174
+ # summary, *description = paragraphs_of('README.txt', 3, 3..8)
175
+ #
176
+ def paragraphs_of( path, *paragraphs )
177
+ title = String === paragraphs.first ? paragraphs.shift : nil
178
+ ary = File.read(path).delete("\r").split(/\n\n+/)
179
+
180
+ result = if title
181
+ tmp, matching = [], false
182
+ rgxp = %r/^=+\s*#{Regexp.escape(title)}/i
183
+ paragraphs << (0..-1) if paragraphs.empty?
184
+
185
+ ary.each do |val|
186
+ if val =~ rgxp
187
+ break if matching
188
+ matching = true
189
+ rgxp = %r/^=+/i
190
+ elsif matching
191
+ tmp << val
192
+ end
193
+ end
194
+ tmp
195
+ else ary end
196
+
197
+ result.values_at(*paragraphs)
198
+ end
199
+
200
+ # Adds the given gem _name_ to the current project's dependency list. An
201
+ # optional gem _version_ can be given. If omitted, the newest gem version
202
+ # will be used.
203
+ #
204
+ def depend_on( name, version = nil )
205
+ spec = Gem.source_index.find_name(name).last
206
+ version = spec.version.to_s if version.nil? and !spec.nil?
207
+
208
+ PROJ.gem.dependencies << case version
209
+ when nil; [name]
210
+ when %r/^\d/; [name, ">= #{version}"]
211
+ else [name, version] end
212
+ end
213
+
214
+ # Adds the given arguments to the include path if they are not already there
215
+ #
216
+ def ensure_in_path( *args )
217
+ args.each do |path|
218
+ path = File.expand_path(path)
219
+ $:.unshift(path) if test(?d, path) and not $:.include?(path)
220
+ end
221
+ end
222
+
223
+ # Find a rake task using the task name and remove any description text. This
224
+ # will prevent the task from being displayed in the list of available tasks.
225
+ #
226
+ def remove_desc_for_task( names )
227
+ Array(names).each do |task_name|
228
+ task = Rake.application.tasks.find {|t| t.name == task_name}
229
+ next if task.nil?
230
+ task.instance_variable_set :@comment, nil
231
+ end
232
+ end
233
+
234
+ # Change working directories to _dir_, call the _block_ of code, and then
235
+ # change back to the original working directory (the current directory when
236
+ # this method was called).
237
+ #
238
+ def in_directory( dir, &block )
239
+ curdir = pwd
240
+ begin
241
+ cd dir
242
+ return block.call
243
+ ensure
244
+ cd curdir
245
+ end
246
+ end
247
+
248
+ # Scans the current working directory and creates a list of files that are
249
+ # candidates to be in the manifest.
250
+ #
251
+ def manifest
252
+ files = []
253
+ exclude = PROJ.exclude.dup
254
+ comment = %r/^\s*#/
255
+
256
+ # process the ignore file and add the items there to the exclude list
257
+ if test(?f, PROJ.ignore_file)
258
+ ary = []
259
+ File.readlines(PROJ.ignore_file).each do |line|
260
+ next if line =~ comment
261
+ line.chomp!
262
+ line.strip!
263
+ next if line.nil? or line.empty?
264
+
265
+ glob = line =~ %r/\*\./ ? File.join('**', line) : line
266
+ Dir.glob(glob).each {|fn| ary << "^#{Regexp.escape(fn)}"}
267
+ end
268
+ exclude.concat ary
269
+ end
270
+
271
+ # generate a regular expression from the exclude list
272
+ exclude = Regexp.new(exclude.join('|'))
273
+ include = Regexp.new(PROJ.include.join('|'))
274
+
275
+ Find.find '.' do |path|
276
+ path.sub! %r/^(\.\/|\/)/o, ''
277
+ next unless test ?f, path
278
+ next if path =~ exclude && path !~ include
279
+ files << path
280
+ end
281
+ files.sort!
282
+ end
283
+
284
+ # We need a "valid" method thtat determines if a string is suitable for use
285
+ # in the gem specification.
286
+ #
287
+ class Object
288
+ def valid?
289
+ return !(self.empty? or self == "\000") if self.respond_to?(:to_str)
290
+ return false
291
+ end
292
+ end
293
+
294
+ # EOF