dm-is-reflective 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,8 +1,4 @@
1
1
 
2
- module DataMapper
3
- module Is
4
- module Reflective
5
- VERSION = '1.1.0'
6
- end
7
- end
2
+ module DmIsReflective
3
+ VERSION = '1.2.0'
8
4
  end
@@ -14,6 +14,7 @@ module Gemgem
14
14
 
15
15
  s.description = description.join
16
16
  s.summary = description.first
17
+ s.license = readme['LICENSE'].sub(/.+\n\n/, '').lines.first.strip
17
18
 
18
19
  s.rubygems_version = Gem::VERSION
19
20
  s.date = Time.now.strftime('%Y-%m-%d')
@@ -33,8 +34,8 @@ module Gemgem
33
34
  @readme ||=
34
35
  if path
35
36
  ps = "##{File.read(path)}".
36
- scan(/((#+)[^\n]+\n\n.+?(?=\n\n\2[^#\n]+\n))/m).map(&:first)
37
- ps.inject({'HEADER' => ps.first}){ |r, s, i|
37
+ scan(/((#+)[^\n]+\n\n.+?(?=(\n\n\2[^#\n]+\n)|\Z))/m).map(&:first)
38
+ ps.inject('HEADER' => ps.first){ |r, s, i|
38
39
  r[s[/\w+/]] = s
39
40
  r
40
41
  }
@@ -44,7 +45,7 @@ module Gemgem
44
45
  end
45
46
 
46
47
  def description
47
- @description ||= (readme['DESCRIPTION']||'').sub(/.+\n\n/, '').lines.to_a
48
+ @description ||= (readme['DESCRIPTION']||'').sub(/.+\n\n/, '').lines
48
49
  end
49
50
 
50
51
  def changes
@@ -104,9 +105,9 @@ module Gemgem
104
105
  end
105
106
 
106
107
  def split_lines ruby
107
- ruby.gsub(/(.+?)\[(.+?)\]/){ |s|
108
+ ruby.gsub(/(.+?)\s*=\s*\[(.+?)\]/){ |s|
108
109
  if $2.index(',')
109
- "#{$1}[\n #{$2.split(',').map(&:strip).join(",\n ")}]"
110
+ "#{$1} = [\n #{$2.split(',').map(&:strip).join(",\n ")}]"
110
111
  else
111
112
  s
112
113
  end
@@ -179,7 +180,7 @@ namespace :gem do
179
180
 
180
181
  desc 'Install gem'
181
182
  task :install => [:build] do
182
- sh("#{Gem.ruby} -S gem install pkg/#{Gemgem.gem_tag}")
183
+ sh("#{Gem.ruby} -S gem install pkg/#{Gemgem.gem_tag}.gem")
183
184
  end
184
185
 
185
186
  desc 'Build gem'
@@ -0,0 +1,23 @@
1
+
2
+ require 'dm-is-reflective/test'
3
+ require_adapter 'mysql'
4
+
5
+ describe 'mysql' do
6
+ if ENV['TRAVIS']
7
+ def setup_data_mapper
8
+ DataMapper.setup(:default, :adapter => 'mysql' ,
9
+ :username => 'root' ,
10
+ :host => 'localhost' ,
11
+ :database => 'myapp_test')
12
+ end
13
+ else
14
+ def setup_data_mapper
15
+ DataMapper.setup(:default, :adapter => 'mysql' ,
16
+ :username => 'dm_is_reflective',
17
+ :password => 'godfat' ,
18
+ :host => 'localhost' ,
19
+ :database => 'dm_is_reflective')
20
+ end
21
+ end
22
+ behaves_like :reflective
23
+ end if defined?(DataMapper::Adapters::MysqlAdapter)
@@ -0,0 +1,23 @@
1
+
2
+ require 'dm-is-reflective/test'
3
+ require_adapter 'postgres'
4
+
5
+ describe 'postgres' do
6
+ if ENV['TRAVIS']
7
+ def setup_data_mapper
8
+ DataMapper.setup(:default, :adapter => 'postgres' ,
9
+ :username => 'postgres' ,
10
+ :host => 'localhost' ,
11
+ :database => 'myapp_test')
12
+ end
13
+ else
14
+ def setup_data_mapper
15
+ DataMapper.setup(:default, :adapter => 'postgres' ,
16
+ :username => 'dm_is_reflective',
17
+ :password => 'godfat' ,
18
+ :host => 'localhost' ,
19
+ :database => 'dm_is_reflective')
20
+ end
21
+ end
22
+ behaves_like :reflective
23
+ end if defined?(DataMapper::Adapters::PostgresAdapter)
@@ -0,0 +1,10 @@
1
+
2
+ require 'dm-is-reflective/test'
3
+ require_adapter 'sqlite'
4
+
5
+ describe 'sqlite' do
6
+ def setup_data_mapper
7
+ DataMapper.setup(:default, :adapter => 'sqlite', :database => ':memory:')
8
+ end
9
+ behaves_like :reflective
10
+ end if defined?(DataMapper::Adapters::SqliteAdapter)
@@ -0,0 +1,55 @@
1
+
2
+ require 'dm-is-reflective/test'
3
+
4
+ describe 'DataMapper::Resource#to_source' do
5
+ DataMapper.setup(:default, :adapter => 'in_memory')
6
+ Comment.create # enforce Comment#user_id generated
7
+
8
+ should 'match Abstract::User' do
9
+ Abstract::User.to_source.should.eq <<-RUBY
10
+ class ::Abstract::User < Object
11
+ include DataMapper::Resource
12
+ property :id, DataMapper::Property::Serial, {:primitive=>Integer, :min=>1, :serial=>true}
13
+ property :login, DataMapper::Property::String, {:primitive=>String, :length=>70}
14
+ property :sig, DataMapper::Property::Text, {:primitive=>String, :lazy=>true, :length=>65535}
15
+ property :created_at, DataMapper::Property::DateTime, {:primitive=>DateTime}
16
+ end
17
+ RUBY
18
+ end
19
+
20
+ should 'match Abstract::Comment' do
21
+ Abstract::Comment.to_source.should.eq <<-RUBY
22
+ class ::Abstract::Comment < Object
23
+ include DataMapper::Resource
24
+ property :id, DataMapper::Property::Serial, {:primitive=>Integer, :min=>1, :serial=>true}
25
+ property :title, DataMapper::Property::String, {:primitive=>String, :length=>50, :default=>"default title", :allow_nil=>false}
26
+ property :body, DataMapper::Property::Text, {:primitive=>String, :lazy=>true, :length=>65535}
27
+ property :user_id, DataMapper::Property::Integer, {:primitive=>Integer, :index=>:user, :required=>false, :key=>false, :unique=>false, :min=>1, :max=>2147483647}
28
+ end
29
+ RUBY
30
+ end
31
+
32
+ should 'match Abstract::Comment::Abstract::Comment' do
33
+ Abstract::Comment.to_source(Abstract::Comment).should.eq <<-RUBY
34
+ class Abstract::Comment::Abstract::Comment < Object
35
+ include DataMapper::Resource
36
+ property :id, DataMapper::Property::Serial, {:primitive=>Integer, :min=>1, :serial=>true}
37
+ property :title, DataMapper::Property::String, {:primitive=>String, :length=>50, :default=>"default title", :allow_nil=>false}
38
+ property :body, DataMapper::Property::Text, {:primitive=>String, :lazy=>true, :length=>65535}
39
+ property :user_id, DataMapper::Property::Integer, {:primitive=>Integer, :index=>:user, :required=>false, :key=>false, :unique=>false, :min=>1, :max=>2147483647}
40
+ end
41
+ RUBY
42
+ end
43
+
44
+ should 'match Abstract::Comment::Abstract::User' do
45
+ Abstract::User.to_source('Abstract::Comment').should.eq <<-RUBY
46
+ class Abstract::Comment::Abstract::User < Object
47
+ include DataMapper::Resource
48
+ property :id, DataMapper::Property::Serial, {:primitive=>Integer, :min=>1, :serial=>true}
49
+ property :login, DataMapper::Property::String, {:primitive=>String, :length=>70}
50
+ property :sig, DataMapper::Property::Text, {:primitive=>String, :lazy=>true, :length=>65535}
51
+ property :created_at, DataMapper::Property::DateTime, {:primitive=>DateTime}
52
+ end
53
+ RUBY
54
+ end
55
+ end
metadata CHANGED
@@ -1,165 +1,162 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dm-is-reflective
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
5
- prerelease:
4
+ version: 1.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Lin Jen-Shin (godfat)
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-01-11 00:00:00.000000000 Z
11
+ date: 2013-05-14 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: dm-core
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: dm-do-adapter
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: dm-migrations
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: dm-sqlite-adapter
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: dm-mysql-adapter
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - '>='
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - '>='
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: dm-postgres-adapter
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - '>='
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - '>='
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
- description: ! 'DataMapper plugin that helps you manipulate an existing database.
111
-
112
- It creates mappings between existing columns and model''s properties.'
97
+ description: |-
98
+ DataMapper plugin that helps you manipulate an existing database.
99
+ It creates mappings between existing columns and model's properties.
113
100
  email:
114
101
  - godfat (XD) godfat.org
115
- executables: []
102
+ executables:
103
+ - dm-is-reflective
116
104
  extensions: []
117
105
  extra_rdoc_files: []
118
106
  files:
119
107
  - .gitignore
120
108
  - .gitmodules
109
+ - .travis.yml
121
110
  - CHANGES.md
122
111
  - Gemfile
123
112
  - LICENSE
124
113
  - README.md
125
114
  - Rakefile
126
115
  - TODO.md
116
+ - bin/dm-is-reflective
127
117
  - dm-is-reflective.gemspec
128
118
  - lib/dm-is-reflective.rb
129
- - lib/dm-is-reflective/is/adapters/data_objects_adapter.rb
130
- - lib/dm-is-reflective/is/adapters/mysql_adapter.rb
131
- - lib/dm-is-reflective/is/adapters/postgres_adapter.rb
132
- - lib/dm-is-reflective/is/adapters/sqlite_adapter.rb
133
- - lib/dm-is-reflective/is/reflective.rb
119
+ - lib/dm-is-reflective/adapters/data_objects_adapter.rb
120
+ - lib/dm-is-reflective/adapters/mysql_adapter.rb
121
+ - lib/dm-is-reflective/adapters/postgres_adapter.rb
122
+ - lib/dm-is-reflective/adapters/sqlite_adapter.rb
123
+ - lib/dm-is-reflective/reflective.rb
124
+ - lib/dm-is-reflective/runner.rb
125
+ - lib/dm-is-reflective/test.rb
134
126
  - lib/dm-is-reflective/version.rb
135
127
  - task/.gitignore
136
128
  - task/gemgem.rb
137
- - test/abstract.rb
138
129
  - test/setup_db.sh
139
- - test/test_dm-is-reflective.rb
130
+ - test/test_mysql.rb
131
+ - test/test_postgres.rb
132
+ - test/test_sqlite.rb
133
+ - test/test_to_source.rb
140
134
  homepage: https://github.com/godfat/dm-is-reflective
141
- licenses: []
135
+ licenses:
136
+ - Apache License 2.0
137
+ metadata: {}
142
138
  post_install_message:
143
139
  rdoc_options: []
144
140
  require_paths:
145
141
  - lib
146
142
  required_ruby_version: !ruby/object:Gem::Requirement
147
- none: false
148
143
  requirements:
149
- - - ! '>='
144
+ - - '>='
150
145
  - !ruby/object:Gem::Version
151
146
  version: '0'
152
147
  required_rubygems_version: !ruby/object:Gem::Requirement
153
- none: false
154
148
  requirements:
155
- - - ! '>='
149
+ - - '>='
156
150
  - !ruby/object:Gem::Version
157
151
  version: '0'
158
152
  requirements: []
159
153
  rubyforge_project:
160
- rubygems_version: 1.8.23
154
+ rubygems_version: 2.0.3
161
155
  signing_key:
162
- specification_version: 3
156
+ specification_version: 4
163
157
  summary: DataMapper plugin that helps you manipulate an existing database.
164
158
  test_files:
165
- - test/test_dm-is-reflective.rb
159
+ - test/test_mysql.rb
160
+ - test/test_postgres.rb
161
+ - test/test_sqlite.rb
162
+ - test/test_to_source.rb
@@ -1,138 +0,0 @@
1
-
2
- module DataMapper
3
- module Is::Reflective
4
- module DataObjectsAdapter
5
- include DataMapper
6
-
7
- # returns all tables' name in the repository.
8
- # e.g.
9
- # ['comments', 'users']
10
- def storages
11
- reflective_auto_load_adapter_extension
12
- storages # call the overrided method
13
- end
14
-
15
- # returns all fields, with format [[name, type, attrs]]
16
- # e.g.
17
- # [[:created_at, DateTime, {:required => false}],
18
- # [:email, String, {:required => false, :size => 255,
19
- # :default => 'nospam@nospam.tw'}],
20
- # [:id, DataMapper::Property::Serial, {:required => true, :serial => true,
21
- # :key => true}],
22
- # [:salt_first, String, {:required => false, :size => 50}],
23
- # [:salt_second, String, {:required => false, :size => 50}]]
24
- def fields storage
25
- reflective_query_storage(storage).map{ |field|
26
- attr = reflective_attributes(field)
27
- type = reflective_lookup_primitive(reflective_primitive(field))
28
- pick = if attr[:serial] && type == Integer
29
- Property::Serial
30
- else
31
- type
32
- end
33
- [reflective_field_name(field).to_sym, pick, attr]
34
- }
35
- end
36
-
37
- # returns a hash with storage names in keys and
38
- # corresponded fields in values. e.g.
39
- # {'users' => [[:id, Integer, {:required => true,
40
- # :serial => true,
41
- # :key => true}],
42
- # [:email, String, {:required => false,
43
- # :default => 'nospam@nospam.tw'}],
44
- # [:created_at, DateTime, {:required => false}],
45
- # [:salt_first, String, {:required => false, :size => 50}],
46
- # [:salt_second, String, {:required => false, :size => 50}]]}
47
- # see AbstractAdapter#storages and AbstractAdapter#fields for detail
48
- def storages_and_fields
49
- storages.inject({}){ |result, storage|
50
- result[storage] = fields(storage)
51
- result
52
- }
53
- end
54
-
55
- # automaticly generate model class(es) and reflect
56
- # all fields with reflect /.*/ for you.
57
- # e.g.
58
- # dm.auto_genclass!
59
- # # => [DataMapper::Is::Reflective::User,
60
- # # DataMapper::Is::Reflective::SchemaInfo,
61
- # # DataMapper::Is::Reflective::Session]
62
- #
63
- # you can change the scope of generated models:
64
- # e.g.
65
- # dm.auto_genclass! :scope => Object
66
- # # => [User, SchemaInfo, Session]
67
- #
68
- # you can generate classes for tables you specified only:
69
- # e.g.
70
- # dm.auto_genclass! :scope => Object, :storages => /^phpbb_/
71
- # # => [PhpbbUser, PhpbbPost, PhpbbConfig]
72
- #
73
- # you can generate classes with String too:
74
- # e.g.
75
- # dm.auto_genclass! :storages => ['users', 'config'], :scope => Object
76
- # # => [User, Config]
77
- #
78
- # you can generate a class only:
79
- # e.g.
80
- # dm.auto_genclass! :storages => 'users'
81
- # # => [DataMapper::Is::Reflective::User]
82
- def auto_genclass! opts = {}
83
- opts[:scope] ||= Is::Reflective
84
- opts[:storages] ||= /.*/
85
- opts[:storages] = [opts[:storages]].flatten
86
-
87
- storages.map{ |storage|
88
-
89
- mapped = opts[:storages].each{ |target|
90
- case target
91
- when Regexp;
92
- break storage if storage =~ target
93
-
94
- when Symbol, String;
95
- break storage if storage == target.to_s
96
-
97
- else
98
- raise ArgumentError.new("invalid argument: #{target.inspect}")
99
- end
100
- }
101
-
102
- reflective_genclass(mapped, opts[:scope]) if mapped.kind_of?(String)
103
- }.compact
104
- end
105
-
106
- private
107
- def reflective_query_storage storage
108
- reflective_auto_load_adapter_extension
109
- reflective_query_storage(storage) # call the overrided method
110
- end
111
-
112
- def reflective_genclass storage, scope
113
- model = Class.new
114
- model.__send__(:include, Resource)
115
- model.is(:reflective)
116
- model.storage_names[:default] = storage
117
- scope.const_set(Inflector.classify(storage), model)
118
- model.__send__(:reflect, /.*/)
119
- model.finalize if model.respond_to?(:finalize)
120
- model
121
- end
122
-
123
- def reflective_lookup_primitive primitive
124
- raise TypeError.new("#{primitive} not found for #{self.class}")
125
- end
126
-
127
- def reflective_auto_load_adapter_extension
128
- # TODO: can we fix this adapter name in dm-sqlite-adapter?
129
- adapter = options[:adapter].sub(/\Asqlite3\Z/, 'sqlite')
130
-
131
- require "dm-is-reflective/is/adapters/#{adapter}_adapter"
132
- class_name = "#{Inflector.camelize(adapter)}Adapter"
133
- Adapters.const_get(class_name).__send__(:include,
134
- Is::Reflective.const_get(class_name))
135
- end
136
- end
137
- end
138
- end