dm-is-reflective 1.0.1 → 1.1.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.
data/CHANGES.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # CHANGES
2
2
 
3
+ ## dm-is-reflective 1.1.0, 2013-01-11
4
+
5
+ * The need for dm-migrations is now removed.
6
+ * Added a few more datatypes. Thanks @onewheelskyward
7
+ * Tested against dm-core 1.2.0.
8
+
3
9
  ## dm-is-reflective 1.0.1, 2012-05-16
4
10
 
5
11
  * allow_nil is more close to db's semantics, not required. Thanks miaout17.
data/README.md CHANGED
@@ -13,6 +13,23 @@ by Lin Jen-Shin ([godfat](http://godfat.org))
13
13
  DataMapper plugin that helps you manipulate an existing database.
14
14
  It creates mappings between existing columns and model's properties.
15
15
 
16
+ ## REQUIREMENTS:
17
+
18
+ * dm-core
19
+ * choose one: dm-sqlite-adapter, dm-postgres-adapter, dm-mysql-adapter
20
+
21
+ ## INSTALLATION:
22
+
23
+ ``` shell
24
+ gem install dm-is-reflective
25
+ ```
26
+
27
+ ``` ruby
28
+ gem 'dm-is-reflective',
29
+ :git => 'git://github.com/godfat/dm-is-reflective.git',
30
+ :submodules => true
31
+ ```
32
+
16
33
  ## SYNOPSIS:
17
34
 
18
35
  ``` ruby
@@ -99,25 +116,16 @@ It creates mappings between existing columns and model's properties.
99
116
  # => [DataMapper::Is::Reflective::User]
100
117
  ```
101
118
 
102
- ## REQUIREMENTS:
103
-
104
- * dm-core
105
- * dm-do-adapter
106
- * choose one: dm-sqlite-adapter, dm-postgres-adapter, dm-mysql-adapter
107
-
108
- ## INSTALL:
109
-
110
- gem install dm-is-reflective
111
-
112
119
  ## CONTRIBUTORS:
113
120
 
121
+ * Andrew Kreps (@onewheelskyward)
114
122
  * Lin Jen-Shin (@godfat)
115
123
 
116
124
  ## LICENSE:
117
125
 
118
126
  Apache License 2.0
119
127
 
120
- Copyright (c) 2008-2012, Lin Jen-Shin (godfat)
128
+ Copyright (c) 2008-2013, Lin Jen-Shin (godfat)
121
129
 
122
130
  Licensed under the Apache License, Version 2.0 (the "License");
123
131
  you may not use this file except in compliance with the License.
data/Rakefile CHANGED
@@ -1,8 +1,13 @@
1
1
  # encoding: utf-8
2
2
 
3
- require "#{dir = File.dirname(__FILE__)}/task/gemgem"
4
- Gemgem.dir = dir
3
+ begin
4
+ require "#{dir = File.dirname(__FILE__)}/task/gemgem"
5
+ rescue LoadError
6
+ sh "git submodule update --init"
7
+ exec Gem.ruby, "-S", "rake", *ARGV
8
+ end
5
9
 
10
+ Gemgem.dir = dir
6
11
  ($LOAD_PATH << File.expand_path("#{Gemgem.dir}/lib" )).uniq!
7
12
 
8
13
  desc 'Generate gemspec'
@@ -21,3 +26,16 @@ task 'gem:spec' do
21
26
 
22
27
  Gemgem.write
23
28
  end
29
+
30
+ desc 'auto_migrate database'
31
+ task 'auto_migrate' do
32
+ require 'dm-migrations'
33
+ require './test/abstract'
34
+ require './test/test_dm-is-reflective'
35
+ include Abstract
36
+ [:SqliteTest, :PostgresTest, :MysqlTest].each do |db|
37
+ next unless Object.const_defined?(db)
38
+ Object.const_get(db).setup_data_mapper
39
+ [User, Comment, SuperUser].each(&:auto_migrate!)
40
+ end
41
+ end
data/TODO.md CHANGED
@@ -1,13 +1,8 @@
1
1
  # TODO
2
2
 
3
- * use extlib to type check args, sorry that i want to sleep right now
4
- * deal with require order problem
5
- * extract some types to data_objects_adapter
3
+ * make sure reflective_lookup_primitive has everything as
4
+ type_map from dm-migrations
6
5
 
7
- * test Model#fields with different repo
8
-
9
- * better doc...
10
- * 0.7.1 for more data types for postgresql adapter
11
- * 0.9 automatic determine model relationship
6
+ * fix `rake auto_migrate`
12
7
 
13
8
  * use bacon instead of minitest
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "dm-is-reflective"
5
- s.version = "1.0.1"
5
+ s.version = "1.1.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Lin Jen-Shin (godfat)"]
9
- s.date = "2012-05-16"
9
+ s.date = "2013-01-11"
10
10
  s.description = "DataMapper plugin that helps you manipulate an existing database.\nIt creates mappings between existing columns and model's properties."
11
11
  s.email = ["godfat (XD) godfat.org"]
12
12
  s.files = [
@@ -33,7 +33,7 @@ Gem::Specification.new do |s|
33
33
  "test/test_dm-is-reflective.rb"]
34
34
  s.homepage = "https://github.com/godfat/dm-is-reflective"
35
35
  s.require_paths = ["lib"]
36
- s.rubygems_version = "1.8.24"
36
+ s.rubygems_version = "1.8.23"
37
37
  s.summary = "DataMapper plugin that helps you manipulate an existing database."
38
38
  s.test_files = ["test/test_dm-is-reflective.rb"]
39
39
 
@@ -23,33 +23,14 @@ module DataMapper
23
23
  # [:salt_second, String, {:required => false, :size => 50}]]
24
24
  def fields storage
25
25
  reflective_query_storage(storage).map{ |field|
26
- primitive = reflective_primitive(field)
27
-
28
- type = self.class.type_map.sort{ |(k1, v1), (k2, v2)|
29
- # search from the most derived class
30
- if k1 < k2 || k2 == Class then -1
31
- elsif k1 > k2 || k1 == Class then 1
32
- else 0
33
- end
34
- }.find{ |(klass, attrs)|
35
- next false if [Object, Class, Time].include?(klass)
36
- attrs[:primitive] == primitive
37
- }
38
- type = type ? type.first : reflective_lookup_primitive(primitive)
39
-
40
- attrs = reflective_attributes(field)
41
-
42
- type = if attrs[:serial] && type == Integer
26
+ attr = reflective_attributes(field)
27
+ type = reflective_lookup_primitive(reflective_primitive(field))
28
+ pick = if attr[:serial] && type == Integer
43
29
  Property::Serial
44
-
45
- elsif type == TrueClass
46
- Property::Boolean
47
-
48
30
  else
49
- type
31
+ type
50
32
  end
51
-
52
- [reflective_field_name(field).to_sym, type, attrs]
33
+ [reflective_field_name(field).to_sym, pick, attr]
53
34
  }
54
35
  end
55
36
 
@@ -133,8 +114,10 @@ module DataMapper
133
114
  model.__send__(:include, Resource)
134
115
  model.is(:reflective)
135
116
  model.storage_names[:default] = storage
136
- model.__send__(:reflect, /.*/)
137
117
  scope.const_set(Inflector.classify(storage), model)
118
+ model.__send__(:reflect, /.*/)
119
+ model.finalize if model.respond_to?(:finalize)
120
+ model
138
121
  end
139
122
 
140
123
  def reflective_lookup_primitive primitive
@@ -45,19 +45,19 @@ module DataMapper
45
45
  end
46
46
 
47
47
  def reflective_lookup_primitive primitive
48
- p = primitive.upcase
49
-
50
- return Integer if p == 'YEAR'
51
- return Integer if p =~ /\w*INT(EGER)?( SIGNED| UNSIGNED)?( ZEROFILL)?/
52
- return BigDecimal if p =~ /(DOUBLE|FLOAT|DECIMAL)( SIGNED| UNSIGNED)?( ZEROFILL)?/
53
- return String if p =~ /\w*BLOB|\w*BINARY|ENUM|SET|CHAR/
54
- return Time if p == 'TIME'
55
- return Date if p == 'DATE'
56
- return DateTime if %w[DATETIME TIMESTAMP].member?(p)
57
- return Property::Boolean if %w[BOOL BOOLEAN].member?(p)
58
- return Property::Text if p =~ /\w*TEXT/
59
-
60
- super(primitive)
48
+ case primitive.upcase
49
+ when 'YEAR' ; Integer
50
+ when /\w*INT(EGER)?( SIGNED| UNSIGNED)?( ZEROFILL)?/
51
+ ; Integer
52
+ when /(DOUBLE|FLOAT|DECIMAL)( SIGNED| UNSIGNED)?( ZEROFILL)?/
53
+ ; BigDecimal
54
+ when /\w*BLOB|\w*BINARY|ENUM|SET|CHAR/; String
55
+ when 'TIME' ; Time
56
+ when 'DATE' ; Date
57
+ when 'DATETIME', 'TIMESTAMP' ; DateTime
58
+ when 'BOOL', 'BOOLEAN' ; Property::Boolean
59
+ when /\w*TEXT/ ; Property::Text
60
+ end || super(primitive)
61
61
  end
62
62
  end
63
63
  end
@@ -68,17 +68,15 @@ module DataMapper
68
68
  end
69
69
 
70
70
  def reflective_lookup_primitive primitive
71
- p = primitive.upcase
72
-
73
- return Integer if p =~ /^INT\d+$/
74
- return String if p == 'VARCHAR'
75
- return DateTime if p == 'TIMESTAMP'
76
- return Property::Text if p == 'TEXT'
77
- return Property::Boolean if p == 'BOOL'
78
-
79
- super(primitive)
71
+ case primitive.upcase
72
+ when /^INT\d+$/ ; Integer
73
+ when /^FLOAT\d+$/ ; Float
74
+ when 'VARCHAR', 'BPCHAR'; String
75
+ when 'TIMESTAMP', 'DATE'; DateTime
76
+ when 'TEXT' ; Property::Text
77
+ when 'BOOL' ; Property::Boolean
78
+ end || super(primitive)
80
79
  end
81
-
82
80
  end
83
81
  end
84
82
  end
@@ -47,13 +47,14 @@ module DataMapper
47
47
  end
48
48
 
49
49
  def reflective_lookup_primitive primitive
50
- p = primitive.upcase
51
-
52
- return Integer if p == 'INTEGER'
53
- return Float if p == 'REAL' || p == 'NUMERIC'
54
- return Property::Text if p == 'TEXT'
55
-
56
- super(primitive)
50
+ case primitive.upcase
51
+ when 'INTEGER' ; Integer
52
+ when 'REAL', 'NUMERIC'; Float
53
+ when 'VARCHAR' ; String
54
+ when 'TIMESTAMP' ; DateTime
55
+ when 'BOOLEAN' ; Property::Boolean
56
+ when 'TEXT' ; Property::Text
57
+ end || super(primitive)
57
58
  end
58
59
  end
59
60
  end
@@ -15,7 +15,7 @@ module Reflective
15
15
  DataMapper.repository(repo).adapter.fields(storage_name(repo))
16
16
  end
17
17
 
18
- # it automaticly creates reflection from storage fields to properties.
18
+ # it automatically creates reflection from storage fields to properties.
19
19
  # i.e. you don't have to specify any property if you are connecting
20
20
  # to an existing database.
21
21
  # you can pass it Regexp to map any field it matched, or just
@@ -49,7 +49,7 @@ module Reflective
49
49
  def reflect *targets
50
50
  targets << /.*/ if targets.empty?
51
51
 
52
- fields.map{ |field|
52
+ result = fields.map{ |field|
53
53
  name, type, attrs = field
54
54
 
55
55
  reflected = targets.each{ |target|
@@ -70,6 +70,9 @@ module Reflective
70
70
 
71
71
  property(reflected, type, attrs) if reflected.kind_of?(Symbol)
72
72
  }.compact
73
+
74
+ finalize if respond_to?(:finalize)
75
+ result
73
76
  end
74
77
  end # of ClassMethod
75
78
 
@@ -2,7 +2,7 @@
2
2
  module DataMapper
3
3
  module Is
4
4
  module Reflective
5
- VERSION = '1.0.1'
5
+ VERSION = '1.1.0'
6
6
  end
7
7
  end
8
8
  end
@@ -4,8 +4,9 @@ require 'dm-migrations'
4
4
  require 'dm-is-reflective'
5
5
 
6
6
  module Abstract
7
- def setup_data_mapper
8
- raise 'please provide a clean database because it is a destructive test!!'
7
+ def self.next_id
8
+ @id ||= 0
9
+ @id += 1
9
10
  end
10
11
 
11
12
  AttrCommon = {:allow_nil => true}
@@ -74,8 +75,6 @@ module Abstract
74
75
  is :reflective
75
76
  end
76
77
 
77
- class Model; end
78
-
79
78
  Tables = ['abstract_comments', 'abstract_super_users', 'abstract_users']
80
79
 
81
80
  def sort_fields fields
@@ -85,18 +84,20 @@ module Abstract
85
84
  end
86
85
 
87
86
  def create_fake_model
88
- model = Model.dup.send(:include, DataMapper::Resource)
89
- model.is :reflective
90
- [ model, setup_data_mapper ]
87
+ model = Class.new
88
+ model.module_eval do
89
+ include DataMapper::Resource
90
+ property :id, DataMapper::Property::Serial
91
+ is :reflective
92
+ end
93
+ Abstract.const_set("Model#{Abstract.next_id}", model)
94
+ [model, self.class.setup_data_mapper]
91
95
  end
92
96
 
93
97
  attr_reader :dm
94
98
  def setup
95
- @dm = setup_data_mapper
96
- # this is significant faster than DataMapper.auto_migrate!
97
- User.auto_migrate!
98
- Comment.auto_migrate!
99
- SuperUser.auto_migrate!
99
+ @dm = self.class.setup_data_mapper
100
+ [User, Comment, SuperUser].each(&:auto_migrate!)
100
101
  end
101
102
 
102
103
  def new_scope
@@ -110,14 +111,12 @@ module Abstract
110
111
 
111
112
  def test_create_comment
112
113
  Comment.create(:title => 'XD')
113
- assert_equal 1, Comment.first.id
114
114
  assert_equal 'XD', Comment.first.title
115
115
  end
116
116
 
117
117
  def test_create_user
118
118
  now = Time.now
119
119
  User.create(:created_at => now)
120
- assert_equal 1, User.first.id
121
120
  assert_equal now.asctime, User.first.created_at.asctime
122
121
 
123
122
  return now
@@ -136,7 +135,6 @@ module Abstract
136
135
  assert_equal comment_fields, sort_fields(model.fields)
137
136
 
138
137
  assert_equal 'XD', model.first.title
139
- assert_equal 1, model.first.id
140
138
  end
141
139
 
142
140
  def test_reflect_and_create
@@ -146,10 +144,9 @@ module Abstract
146
144
 
147
145
  model.create(:title => 'orz')
148
146
  assert_equal 'orz', model.first.title
149
- assert_equal 1, model.first.id
150
147
 
151
148
  model.create
152
- assert_equal 'default title', model.get(2).title
149
+ assert_equal 'default title', model.last.title
153
150
  end
154
151
 
155
152
  def test_storages_and_fields
@@ -216,7 +213,7 @@ module Abstract
216
213
 
217
214
  assert_equal 'XD', comment.first.title
218
215
  comment.create(:title => 'orz', :body => 'dm-reflect')
219
- assert_equal 'dm-reflect', comment.get(2).body
216
+ assert_equal 'dm-reflect', comment.last.body
220
217
  end
221
218
 
222
219
  def test_auto_genclass
@@ -232,7 +229,7 @@ module Abstract
232
229
 
233
230
  assert_equal now.asctime, user.first.created_at.asctime
234
231
  user.create(:login => 'godfat')
235
- assert_equal 'godfat', user.get(2).login
232
+ assert_equal 'godfat', user.last.login
236
233
  end
237
234
 
238
235
  def test_auto_genclass_with_regexp
@@ -252,5 +249,4 @@ module Abstract
252
249
 
253
250
  assert_equal model.properties.map(&:object_id).sort, mapped.map(&:object_id).sort
254
251
  end
255
-
256
252
  end
@@ -1,9 +1,5 @@
1
1
 
2
- if respond_to?(:require_relative, true)
3
- require_relative 'abstract'
4
- else
5
- require File.dirname(__FILE__) + '/abstract'
6
- end
2
+ require './test/abstract'
7
3
 
8
4
  TestCase = begin
9
5
  require 'minitest/unit'
@@ -14,7 +10,7 @@ TestCase = begin
14
10
  Test::Unit::TestCase
15
11
  end
16
12
 
17
- %w[sqlite mysql postgres].each{ |adapter|
13
+ %w[sqlite postgres mysql].each{ |adapter|
18
14
  begin
19
15
  require "dm-#{adapter}-adapter"
20
16
  rescue LoadError
@@ -26,15 +22,14 @@ TestCase = begin
26
22
  class SqliteTest < TestCase
27
23
  include Abstract
28
24
 
29
- def setup_data_mapper
25
+ def self.setup_data_mapper
30
26
  DataMapper.setup(:default, 'sqlite::memory:')
31
-
32
27
  end
33
28
  end if defined?(DataMapper::Adapters::SqliteAdapter)
34
29
 
35
30
  class SqliteHashSetupTest < TestCase
36
31
  include Abstract
37
- def setup_data_mapper
32
+ def self.setup_data_mapper
38
33
  DataMapper.setup(:default, :adapter => 'sqlite', :database => ':memory:')
39
34
  end
40
35
  end if defined?(DataMapper::Adapters::SqliteAdapter)
@@ -43,7 +38,7 @@ end if defined?(DataMapper::Adapters::SqliteAdapter)
43
38
  class PostgresTest < TestCase
44
39
  include Abstract
45
40
 
46
- def setup_data_mapper
41
+ def self.setup_data_mapper
47
42
  DataMapper.setup(:default, 'postgres://dm_is_reflective:godfat@localhost/dm_is_reflective')
48
43
  end
49
44
  end if defined?(DataMapper::Adapters::PostgresAdapter)
@@ -52,7 +47,7 @@ end if defined?(DataMapper::Adapters::PostgresAdapter)
52
47
  class MysqlTest < TestCase
53
48
  include Abstract
54
49
 
55
- def setup_data_mapper
50
+ def self.setup_data_mapper
56
51
  DataMapper.setup(:default, 'mysql://dm_is_reflective:godfat@localhost/dm_is_reflective')
57
52
  end
58
53
  end if defined?(DataMapper::Adapters::MysqlAdapter)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dm-is-reflective
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-16 00:00:00.000000000 Z
12
+ date: 2013-01-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: dm-core
@@ -157,10 +157,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
157
157
  version: '0'
158
158
  requirements: []
159
159
  rubyforge_project:
160
- rubygems_version: 1.8.24
160
+ rubygems_version: 1.8.23
161
161
  signing_key:
162
162
  specification_version: 3
163
163
  summary: DataMapper plugin that helps you manipulate an existing database.
164
164
  test_files:
165
165
  - test/test_dm-is-reflective.rb
166
- has_rdoc: