dm-is-reflective 0.8.0

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.
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