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