dm-reflection 0.0.5
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.
- data/.document +5 -0
- data/.gitignore +25 -0
- data/LICENSE +21 -0
- data/README.rdoc +77 -0
- data/Rakefile +38 -0
- data/VERSION +1 -0
- data/dm-reflection.gemspec +79 -0
- data/lib/dm-reflection/adapters/mysql.rb +95 -0
- data/lib/dm-reflection/adapters/persevere.rb +98 -0
- data/lib/dm-reflection/adapters/postgres.rb +126 -0
- data/lib/dm-reflection/adapters/sqlite3.rb +85 -0
- data/lib/dm-reflection/builders/source_builder.rb +326 -0
- data/lib/dm-reflection/reflection.rb +73 -0
- data/lib/dm-reflection/version.rb +5 -0
- data/lib/dm-reflection.rb +6 -0
- data/spec/persevere_reflection_spec.rb +86 -0
- data/spec/rcov.opts +6 -0
- data/spec/reflection_spec.rb +108 -0
- data/spec/source_builder_spec.rb +130 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +41 -0
- data/tasks/changelog.rake +20 -0
- data/tasks/ci.rake +1 -0
- data/tasks/metrics.rake +36 -0
- data/tasks/spec.rake +25 -0
- data/tasks/yard.rake +9 -0
- data/tasks/yardstick.rake +19 -0
- metadata +131 -0
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'dm-reflection/builders/source_builder'
|
3
|
+
|
4
|
+
PERSON = <<-RUBY
|
5
|
+
class Person
|
6
|
+
|
7
|
+
include DataMapper::Resource
|
8
|
+
|
9
|
+
property :id, Serial
|
10
|
+
|
11
|
+
property :name, String, :required => true, :length => 200
|
12
|
+
property :email, String, :required => true, :unique => true, :unique_index => true
|
13
|
+
property :created_at, DateTime
|
14
|
+
property :updated_at, DateTime
|
15
|
+
|
16
|
+
has 1, :profile
|
17
|
+
has n, :projects, :through => Resource
|
18
|
+
|
19
|
+
end
|
20
|
+
RUBY
|
21
|
+
|
22
|
+
PROFILE = <<-RUBY
|
23
|
+
class Profile
|
24
|
+
|
25
|
+
include DataMapper::Resource
|
26
|
+
|
27
|
+
property :id, Serial
|
28
|
+
|
29
|
+
property :person_id, Integer, :required => true, :min => 1
|
30
|
+
property :nickname, String
|
31
|
+
property :image, String
|
32
|
+
property :created_at, DateTime
|
33
|
+
property :updated_at, DateTime
|
34
|
+
|
35
|
+
belongs_to :person
|
36
|
+
|
37
|
+
end
|
38
|
+
RUBY
|
39
|
+
|
40
|
+
PROJECT = <<-RUBY
|
41
|
+
class Project
|
42
|
+
|
43
|
+
include DataMapper::Resource
|
44
|
+
|
45
|
+
property :id, Serial
|
46
|
+
|
47
|
+
property :name, String, :required => true, :length => 200
|
48
|
+
property :created_at, DateTime
|
49
|
+
property :updated_at, DateTime
|
50
|
+
|
51
|
+
has n, :project_tasks
|
52
|
+
has n, :tasks, :through => :project_tasks
|
53
|
+
has 1..n, :people, :through => Resource
|
54
|
+
|
55
|
+
end
|
56
|
+
RUBY
|
57
|
+
|
58
|
+
TASK = <<-RUBY
|
59
|
+
class Task
|
60
|
+
|
61
|
+
include DataMapper::Resource
|
62
|
+
|
63
|
+
property :id, Serial
|
64
|
+
|
65
|
+
property :name, String, :required => true, :length => 200
|
66
|
+
property :email, String, :required => true, :unique => true, :unique_index => true
|
67
|
+
property :created_at, DateTime
|
68
|
+
property :updated_at, DateTime
|
69
|
+
|
70
|
+
has n, :project_tasks
|
71
|
+
has n, :projects, :through => :project_tasks
|
72
|
+
|
73
|
+
end
|
74
|
+
RUBY
|
75
|
+
|
76
|
+
PROJECT_TASK = <<-RUBY
|
77
|
+
class ProjectTask
|
78
|
+
|
79
|
+
include DataMapper::Resource
|
80
|
+
|
81
|
+
property :project_id, Integer, :key => true, :min => 1
|
82
|
+
property :task_id, Integer, :key => true, :min => 1
|
83
|
+
|
84
|
+
property :created_at, DateTime
|
85
|
+
property :updated_at, DateTime
|
86
|
+
|
87
|
+
belongs_to :project
|
88
|
+
belongs_to :task
|
89
|
+
|
90
|
+
end
|
91
|
+
RUBY
|
92
|
+
|
93
|
+
SOURCES = [ PERSON, PROFILE, PROJECT, TASK, PROJECT_TASK ]
|
94
|
+
|
95
|
+
describe DataMapper::Reflection::Builders::Source::Model do
|
96
|
+
|
97
|
+
before(:all) do
|
98
|
+
|
99
|
+
SOURCES.each { |source| eval(source) }
|
100
|
+
|
101
|
+
@models = {
|
102
|
+
Person => PERSON,
|
103
|
+
Profile => PROFILE,
|
104
|
+
Project => PROJECT,
|
105
|
+
Task => TASK,
|
106
|
+
ProjectTask => PROJECT_TASK
|
107
|
+
}
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should behave like datamapper when the relation is not in 1NF (raise DataMapper::IncompleteModelError)" do
|
112
|
+
invalid_resource = Class.new { include DataMapper::Resource }
|
113
|
+
lambda { invalid_resource.to_ruby }.should raise_error(DataMapper::IncompleteModelError)
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'should return a proper datamapper model definition' do
|
117
|
+
|
118
|
+
@models.each_pair do |model, source|
|
119
|
+
|
120
|
+
# puts '-'*80
|
121
|
+
# puts model.to_ruby
|
122
|
+
# puts '-'*80
|
123
|
+
|
124
|
+
model.to_ruby.should == source
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
4
|
+
$LOAD_PATH.unshift(File.expand_path('../lib', __FILE__))
|
5
|
+
|
6
|
+
require 'dm-core'
|
7
|
+
require 'dm-reflection'
|
8
|
+
|
9
|
+
require 'spec'
|
10
|
+
require 'spec/autorun'
|
11
|
+
|
12
|
+
ENV["SQLITE3_SPEC_URI"] ||= 'sqlite3::memory:'
|
13
|
+
ENV["MYSQL_SPEC_URI"] ||= 'mysql://localhost/dm-reflections_test'
|
14
|
+
ENV["POSTGRES_SPEC_URI"] ||= 'postgres://postgres@localhost/dm-reflection_test'
|
15
|
+
ENV["PERSEVERE_SPEC_URI"] ||= 'persevere://localhost:8080/'
|
16
|
+
|
17
|
+
def setup_adapter(name, default_uri = nil)
|
18
|
+
begin
|
19
|
+
DataMapper.setup(name, ENV["#{ENV['ADAPTER'].to_s.upcase}_SPEC_URI"] || default_uri)
|
20
|
+
Object.const_set('ADAPTER', ENV['ADAPTER'].to_sym) if name.to_s == ENV['ADAPTER']
|
21
|
+
true
|
22
|
+
rescue Exception => e
|
23
|
+
if name.to_s == ENV['ADAPTER']
|
24
|
+
Object.const_set('ADAPTER', nil)
|
25
|
+
warn "Could not load do_#{name}: #{e}"
|
26
|
+
end
|
27
|
+
false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
ENV['ADAPTER'] ||= 'persevere'
|
32
|
+
setup_adapter(:default)
|
33
|
+
|
34
|
+
Spec::Runner.configure do |config|
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
def remove_model_from_memory(model)
|
39
|
+
DataMapper::Model.descendants.delete(model)
|
40
|
+
Object.send(:remove_const, model.name.to_sym)
|
41
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'time'
|
2
|
+
|
3
|
+
desc 'update changelog'
|
4
|
+
task :changelog do
|
5
|
+
File.open('CHANGELOG', 'w+') do |changelog|
|
6
|
+
`git log -z --abbrev-commit`.split("\0").each do |commit|
|
7
|
+
next if commit =~ /^Merge: \d*/
|
8
|
+
ref, author, time, _, title, _, message = commit.split("\n", 7)
|
9
|
+
ref = ref[/commit ([0-9a-f]+)/, 1]
|
10
|
+
author = author[/Author: (.*)/, 1].strip
|
11
|
+
time = Time.parse(time[/Date: (.*)/, 1]).utc
|
12
|
+
title.strip!
|
13
|
+
|
14
|
+
changelog.puts "[#{ref} | #{time}] #{author}"
|
15
|
+
changelog.puts '', " * #{title}"
|
16
|
+
changelog.puts '', message.rstrip if message
|
17
|
+
changelog.puts
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/tasks/ci.rake
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
task :ci => [ :verify_measurements, 'metrics:all' ]
|
data/tasks/metrics.rake
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
begin
|
2
|
+
require 'metric_fu'
|
3
|
+
rescue LoadError
|
4
|
+
namespace :metrics do
|
5
|
+
task :all do
|
6
|
+
abort 'metric_fu is not available. In order to run metrics:all, you must: gem install metric_fu'
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
begin
|
12
|
+
require 'reek/adapters/rake_task'
|
13
|
+
|
14
|
+
Reek::RakeTask.new do |t|
|
15
|
+
t.fail_on_error = true
|
16
|
+
t.verbose = false
|
17
|
+
t.source_files = 'lib/**/*.rb'
|
18
|
+
end
|
19
|
+
rescue LoadError
|
20
|
+
task :reek do
|
21
|
+
abort 'Reek is not available. In order to run reek, you must: gem install reek'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
begin
|
26
|
+
require 'roodi'
|
27
|
+
require 'roodi_task'
|
28
|
+
|
29
|
+
RoodiTask.new do |t|
|
30
|
+
t.verbose = false
|
31
|
+
end
|
32
|
+
rescue LoadError
|
33
|
+
task :roodi do
|
34
|
+
abort 'Roodi is not available. In order to run roodi, you must: gem install roodi'
|
35
|
+
end
|
36
|
+
end
|
data/tasks/spec.rake
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec/rake/spectask'
|
2
|
+
require 'spec/rake/verify_rcov'
|
3
|
+
|
4
|
+
spec_defaults = lambda do |spec|
|
5
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
6
|
+
spec.libs << 'lib' << 'spec'
|
7
|
+
spec.spec_opts << '--options' << 'spec/spec.opts'
|
8
|
+
end
|
9
|
+
|
10
|
+
Spec::Rake::SpecTask.new(:spec, &spec_defaults)
|
11
|
+
|
12
|
+
Spec::Rake::SpecTask.new(:rcov) do |rcov|
|
13
|
+
spec_defaults.call(rcov)
|
14
|
+
rcov.rcov = true
|
15
|
+
rcov.rcov_opts = File.read('spec/rcov.opts').split(/\s+/)
|
16
|
+
end
|
17
|
+
|
18
|
+
RCov::VerifyTask.new(:verify_rcov => :rcov) do |rcov|
|
19
|
+
rcov.threshold = 100
|
20
|
+
end
|
21
|
+
|
22
|
+
task :spec => :check_dependencies
|
23
|
+
task :rcov => :check_dependencies
|
24
|
+
|
25
|
+
task :default => :spec
|
data/tasks/yard.rake
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
begin
|
2
|
+
require 'pathname'
|
3
|
+
require 'yardstick/rake/measurement'
|
4
|
+
require 'yardstick/rake/verify'
|
5
|
+
|
6
|
+
# yardstick_measure task
|
7
|
+
Yardstick::Rake::Measurement.new
|
8
|
+
|
9
|
+
# verify_measurements task
|
10
|
+
Yardstick::Rake::Verify.new do |verify|
|
11
|
+
verify.threshold = 100
|
12
|
+
end
|
13
|
+
rescue LoadError
|
14
|
+
%w[ yardstick_measure verify_measurements ].each do |name|
|
15
|
+
task name.to_s do
|
16
|
+
abort "Yardstick is not available. In order to run #{name}, you must: gem install yardstick"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dm-reflection
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 5
|
9
|
+
version: 0.0.5
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Martin Gamsjaeger (snusnu), Yogo Team
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-05-03 00:00:00 -06:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: dm-core
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ~>
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 10
|
30
|
+
- 2
|
31
|
+
version: 0.10.2
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: rspec
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ~>
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 1
|
43
|
+
- 3
|
44
|
+
version: "1.3"
|
45
|
+
type: :development
|
46
|
+
version_requirements: *id002
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: yard
|
49
|
+
prerelease: false
|
50
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
segments:
|
55
|
+
- 0
|
56
|
+
- 5
|
57
|
+
version: "0.5"
|
58
|
+
type: :development
|
59
|
+
version_requirements: *id003
|
60
|
+
description: Generates datamapper models from existing database schemas and export them to files
|
61
|
+
email: irjudson@gmail.com
|
62
|
+
executables: []
|
63
|
+
|
64
|
+
extensions: []
|
65
|
+
|
66
|
+
extra_rdoc_files:
|
67
|
+
- LICENSE
|
68
|
+
- README.rdoc
|
69
|
+
files:
|
70
|
+
- .document
|
71
|
+
- .gitignore
|
72
|
+
- LICENSE
|
73
|
+
- README.rdoc
|
74
|
+
- Rakefile
|
75
|
+
- VERSION
|
76
|
+
- dm-reflection.gemspec
|
77
|
+
- lib/dm-reflection.rb
|
78
|
+
- lib/dm-reflection/adapters/mysql.rb
|
79
|
+
- lib/dm-reflection/adapters/persevere.rb
|
80
|
+
- lib/dm-reflection/adapters/postgres.rb
|
81
|
+
- lib/dm-reflection/adapters/sqlite3.rb
|
82
|
+
- lib/dm-reflection/builders/source_builder.rb
|
83
|
+
- lib/dm-reflection/reflection.rb
|
84
|
+
- lib/dm-reflection/version.rb
|
85
|
+
- spec/persevere_reflection_spec.rb
|
86
|
+
- spec/rcov.opts
|
87
|
+
- spec/reflection_spec.rb
|
88
|
+
- spec/source_builder_spec.rb
|
89
|
+
- spec/spec.opts
|
90
|
+
- spec/spec_helper.rb
|
91
|
+
- tasks/changelog.rake
|
92
|
+
- tasks/ci.rake
|
93
|
+
- tasks/metrics.rake
|
94
|
+
- tasks/spec.rake
|
95
|
+
- tasks/yard.rake
|
96
|
+
- tasks/yardstick.rake
|
97
|
+
has_rdoc: true
|
98
|
+
homepage: http://github.com/irjudson/dm-reflection
|
99
|
+
licenses: []
|
100
|
+
|
101
|
+
post_install_message:
|
102
|
+
rdoc_options:
|
103
|
+
- --charset=UTF-8
|
104
|
+
require_paths:
|
105
|
+
- lib
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
segments:
|
111
|
+
- 0
|
112
|
+
version: "0"
|
113
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
segments:
|
118
|
+
- 0
|
119
|
+
version: "0"
|
120
|
+
requirements: []
|
121
|
+
|
122
|
+
rubyforge_project:
|
123
|
+
rubygems_version: 1.3.6
|
124
|
+
signing_key:
|
125
|
+
specification_version: 3
|
126
|
+
summary: Generates datamapper models from existing database schemas
|
127
|
+
test_files:
|
128
|
+
- spec/persevere_reflection_spec.rb
|
129
|
+
- spec/reflection_spec.rb
|
130
|
+
- spec/source_builder_spec.rb
|
131
|
+
- spec/spec_helper.rb
|