dm-is-reflective 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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/NOTICE ADDED
@@ -0,0 +1,30 @@
1
+ = notice and thanks
2
+
3
+ * dm-is-reflective is a plugin of DataMapper
4
+ > sudo gem install dm-core
5
+ http://datamapper.org
6
+
7
+ * this project skeleton is built through Mr Bones
8
+ http://codeforpeople.rubyforge.org/bones/
9
+
10
+ * thanks to Rails team with ActiveRecord, it's inspiring.
11
+ and some SQL snippets are borrowed from it.
12
+ http://rubyonrails.org
13
+
14
+ * Ruby the great language
15
+ http://www.ruby-lang.org
16
+
17
+ * Rubygems the great package management
18
+ http://rubygems.org
19
+
20
+ * Rake the great task automation
21
+ http://rake.rubyforge.org
22
+
23
+ * Facets the great ruby library collection
24
+ http://facets.rubyforge.org/
25
+
26
+ * Rubyforge for distributing ruby gems
27
+ http://rubyforge.org
28
+
29
+ * Github for hosting git
30
+ http://github.com
data/README ADDED
@@ -0,0 +1,122 @@
1
+ = dm-is-reflective 0.8.0
2
+ by Lin Jen-Shin (aka godfat-真常[http://godfat.org])
3
+ godfat (XD) godfat.org
4
+
5
+ == LINKS:
6
+
7
+ * rdoc[http://ludy.rubyforge.org/dm-is-reflective]
8
+ * github-project[http://github.com/godfat/dm-is-reflective]
9
+ * rubyforge-project[http://rubyforge.org/projects/ludy]
10
+
11
+ == DESCRIPTION:
12
+
13
+ DataMapper plugin that helps you manipulate an existing database.
14
+ It creates mappings between existing columns and model's properties.
15
+
16
+ == SYNOPSIS:
17
+
18
+ require 'dm-is-reflective' # this would require 'dm-core'
19
+ dm = DataMapper.setup :default, 'sqlite3:db/development.sqlite3'
20
+
21
+ class User
22
+ include DataMapper::Resource
23
+ is :reflective
24
+
25
+ # mapping all, returns an array of properties indicating fields it mapped
26
+ mapping /.*/ # e.g. => [#<Property:#<Class:0x18f89b8>:id>,
27
+ # #<Property:#<Class:0x18f89b8>:title>,
28
+ # #<Property:#<Class:0x18f89b8>:body>,
29
+ # #<Property:#<Class:0x18f89b8>:user_id>]
30
+
31
+ # mapping all (with no argument at all)
32
+ mapping
33
+
34
+ # mapping for field name ended with _at, and started with salt_
35
+ mapping /_at$/, /^salt_/
36
+
37
+ # mapping id and email
38
+ mapping :id, :email
39
+
40
+ # mapping all fields with type String, and id
41
+ mapping String, :id
42
+
43
+ # mapping login, and all fields with type Integer
44
+ mapping :login, Integer
45
+ end
46
+
47
+ # there's no guarantee of the order in storages array
48
+ dm.storages
49
+ # => ['users']
50
+
51
+ # there's no guarantee of the order in fields array
52
+ User.fields
53
+ # => [[:created_at, DateTime, {:nullable => true}],
54
+ [:email, String, {:nullable => true, :length => 255,
55
+ :default => 'nospam@nospam.tw'}],
56
+ [:id, Serial, {:nullable => false, :serial => true,
57
+ :key => true}],
58
+ [:salt_first, String, {:nullable => true, :length => 50}],
59
+ [:salt_second, String, {:nullable => true, :length => 50}]]
60
+
61
+ dm.fields('users').sort_by{ |field| field.first.to_s } ==
62
+ User.fields.sort_by{ |field| field.first.to_s }
63
+ # => true
64
+
65
+ dm.storages_and_fields
66
+ # => {'users' => [[:id, Serial, {:nullable => false,
67
+ :serial => true,
68
+ :key => true}],
69
+ [:email, String, {:nullable => true,
70
+ :default => 'nospam@nospam.tw'}],
71
+ [:created_at, DateTime, {:nullable => true}],
72
+ [:salt_first, String, {:nullable => true, :length => 50}],
73
+ [:salt_second, String, {:nullable => true, :length => 50}]]}
74
+
75
+ # there's no guarantee of the order in returned array
76
+ dm.auto_genclass!
77
+ # => [DataMapper::Is::Reflective::User,
78
+ DataMapper::Is::Reflective::SchemaInfo,
79
+ DataMapper::Is::Reflective::Session]
80
+
81
+ # you can change the scope of generated models:
82
+ dm.auto_genclass! :scope => Object
83
+ # => [User, SchemaInfo, Session]
84
+
85
+ # you can generate classes for tables you specified only:
86
+ dm.auto_genclass! :scope => Object, :storages => /^phpbb_/
87
+ # => [PhpbbUser, PhpbbPost, PhpbbConfig]
88
+
89
+ # you can generate classes with String too:
90
+ dm.auto_genclass! :storages => ['users', 'config'], :scope => Object
91
+ # => [User, Config]
92
+
93
+ # you can generate a class only:
94
+ dm.auto_genclass! :storages => 'users'
95
+ # => [DataMapper::Is::Reflective::User]
96
+
97
+ == REQUIREMENTS:
98
+
99
+ * dm-core 0.10.0 or later
100
+ * at least one do_* adapter
101
+
102
+ == INSTALL:
103
+
104
+ > sudo gem install dm-is-reflective
105
+
106
+ == LICENSE:
107
+
108
+ Apache License 2.0
109
+
110
+ Copyright (c) 2008, Lin Jen-Shin (aka godfat 真常)
111
+
112
+ Licensed under the Apache License, Version 2.0 (the "License");
113
+ you may not use this file except in compliance with the License.
114
+ You may obtain a copy of the License at
115
+
116
+ http://www.apache.org/licenses/LICENSE-2.0
117
+
118
+ Unless required by applicable law or agreed to in writing, software
119
+ distributed under the License is distributed on an "AS IS" BASIS,
120
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121
+ See the License for the specific language governing permissions and
122
+ limitations under the License.
data/Rakefile ADDED
@@ -0,0 +1,45 @@
1
+ # encoding: utf-8
2
+
3
+ require 'bones'
4
+ Bones.setup
5
+
6
+ PROJ.name = 'dm-is-reflective'
7
+ PROJ.authors = 'Lin Jen-Shin (aka godfat 真常)'
8
+ PROJ.email = 'godfat (XD) godfat.org'
9
+ PROJ.url = "http://github.com/godfat/#{PROJ.name}"
10
+ PROJ.rubyforge.name = 'ludy'
11
+
12
+ PROJ.gem.dependencies << ['dm-core', '>=0.10.0'] << ['extlib', '>=0.9.13']
13
+ # PROJ.gem.development_dependencies << ['minitest', '>=1.3.0']
14
+ # PROJ.gem.executables = ["bin/#{PROJ.name}"]
15
+
16
+ PROJ.ruby_opts.delete '-w' # too many warnings in addressable, dm-core, extlib...
17
+
18
+ PROJ.description = PROJ.summary = paragraphs_of('README', 'description').join("\n\n")
19
+ PROJ.changes = paragraphs_of('CHANGES', 0..1).join("\n\n")
20
+ PROJ.version = File.read("lib/#{PROJ.name}/version.rb").gsub(/.*VERSION = '(.*)'.*/m, '\1')
21
+
22
+ PROJ.exclude += ['^tmp', 'tmp$', '^pkg', '^\.gitignore$',
23
+ '^ann-', '\.sqlite3$', '\.db$']
24
+
25
+ PROJ.rdoc.remote_dir = PROJ.name
26
+
27
+ PROJ.readme_file = 'README'
28
+ PROJ.rdoc.main = 'README'
29
+ PROJ.rdoc.exclude += ['Rakefile', '^tasks', '^test']
30
+ PROJ.rdoc.include << '\w+'
31
+ # PROJ.rdoc.opts << '--diagram' if !Rake::WIN32 and `which dot` =~ %r/\/dot/
32
+ PROJ.rdoc.opts += ['--charset=utf-8', '--inline-source',
33
+ '--line-numbers', '--promiscuous']
34
+
35
+ PROJ.spec.opts << '--color'
36
+
37
+ PROJ.ann.file = "ann-#{PROJ.name}-#{PROJ.version}"
38
+ PROJ.ann.paragraphs.concat %w[LINKS SYNOPSIS REQUIREMENTS INSTALL LICENSE]
39
+
40
+ CLEAN.include Dir['**/*.rbc']
41
+
42
+ task :default do
43
+ Rake.application.options.show_task_pattern = /./
44
+ Rake.application.display_tasks_and_comments
45
+ end
data/TODO ADDED
@@ -0,0 +1,7 @@
1
+ = dm-is-reflective todo list
2
+
3
+ * test Model#fields with different repo
4
+
5
+ * better doc...
6
+ * 0.7.1 for more data types for postgresql adapter
7
+ * 0.9 automatic determine model relationship
@@ -0,0 +1,41 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{dm-is-reflective}
5
+ s.version = "0.8.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Lin Jen-Shin (aka godfat \347\234\237\345\270\270)"]
9
+ s.date = %q{2009-06-21}
10
+ s.description = %q{ DataMapper plugin that helps you manipulate an existing database.
11
+ It creates mappings between existing columns and model's properties.}
12
+ s.email = %q{godfat (XD) godfat.org}
13
+ s.extra_rdoc_files = ["CHANGES", "LICENSE", "NOTICE", "README", "TODO"]
14
+ s.files = ["CHANGES", "LICENSE", "NOTICE", "README", "Rakefile", "TODO", "lib/dm-is-reflective.rb", "lib/dm-is-reflective/is/adapters/abstract_adapter.rb", "lib/dm-is-reflective/is/adapters/mysql_adapter.rb", "lib/dm-is-reflective/is/adapters/postgres_adapter.rb", "lib/dm-is-reflective/is/adapters/sqlite3_adapter.rb", "lib/dm-is-reflective/is/reflective.rb", "lib/dm-is-reflective/is/version.rb", "lib/dm-is-reflective/version.rb", "test/abstract.rb", "test/test_dm-is-reflexible.rb"]
15
+ s.homepage = %q{http://github.com/godfat/dm-is-reflective}
16
+ s.rdoc_options = ["--charset=utf-8", "--inline-source", "--line-numbers", "--promiscuous", "--main", "README"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{ludy}
19
+ s.rubygems_version = %q{1.3.4}
20
+ s.summary = %q{DataMapper plugin that helps you manipulate an existing database. It creates mappings between existing columns and model's properties.}
21
+ s.test_files = ["test/test_dm-is-reflexible.rb"]
22
+
23
+ if s.respond_to? :specification_version then
24
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
+ s.specification_version = 3
26
+
27
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
+ s.add_runtime_dependency(%q<dm-core>, [">= 0.10.0"])
29
+ s.add_runtime_dependency(%q<extlib>, [">= 0.9.13"])
30
+ s.add_development_dependency(%q<bones>, [">= 2.5.1"])
31
+ else
32
+ s.add_dependency(%q<dm-core>, [">= 0.10.0"])
33
+ s.add_dependency(%q<extlib>, [">= 0.9.13"])
34
+ s.add_dependency(%q<bones>, [">= 2.5.1"])
35
+ end
36
+ else
37
+ s.add_dependency(%q<dm-core>, [">= 0.10.0"])
38
+ s.add_dependency(%q<extlib>, [">= 0.9.13"])
39
+ s.add_dependency(%q<bones>, [">= 2.5.1"])
40
+ end
41
+ end
@@ -0,0 +1,10 @@
1
+
2
+ gem 'dm-core', '>=0.10.0'
3
+ require 'dm-core'
4
+
5
+ require 'dm-is-reflective/is/reflective'
6
+ DataMapper::Model.append_extensions(DataMapper::Is::Reflective)
7
+
8
+ require 'dm-is-reflective/is/adapters/abstract_adapter'
9
+ DataMapper::Adapters::AbstractAdapter.__send__(:include,
10
+ DataMapper::Is::Reflective::AbstractAdapter)
@@ -0,0 +1,144 @@
1
+
2
+ module DataMapper
3
+ module Is::Reflective
4
+ module AbstractAdapter
5
+ # returns all tables' name in the repository.
6
+ # e.g.
7
+ # ['comments', 'users']
8
+ def storages
9
+ reflective_auto_load_adapter_extension
10
+ storages # call the overrided method
11
+ end
12
+
13
+ # returns all fields, with format [[name, type, attrs]]
14
+ # e.g.
15
+ # [[:created_at, DateTime, {:nullable => true}],
16
+ # [:email, String, {:nullable => true, :size => 255,
17
+ # :default => 'nospam@nospam.tw'}],
18
+ # [:id, DataMapper::Types::Serial, {:nullable => false, :serial => true,
19
+ # :key => true}],
20
+ # [:salt_first, String, {:nullable => true, :size => 50}],
21
+ # [:salt_second, String, {:nullable => true, :size => 50}]]
22
+ def fields storage
23
+ reflective_query_storage(storage).map{ |field|
24
+ primitive = reflective_primitive(field)
25
+
26
+ type = self.class.type_map.find{ |klass, attrs|
27
+ next false if [DataMapper::Types::Object, Time].include?(klass)
28
+ attrs[:primitive] == primitive
29
+ }
30
+ type = type ? type.first : reflective_lookup_primitive(primitive)
31
+
32
+ attrs = reflective_attributes(field)
33
+
34
+ type = if attrs[:serial] && type == Integer
35
+ DataMapper::Types::Serial
36
+
37
+ elsif type == TrueClass
38
+ DataMapper::Types::Boolean
39
+
40
+ else
41
+ type
42
+ end
43
+
44
+ [reflective_field_name(field).to_sym, type, attrs]
45
+ }
46
+ end
47
+
48
+ # returns a hash with storage names in keys and
49
+ # corresponded fields in values. e.g.
50
+ # {'users' => [[:id, Integer, {:nullable => false,
51
+ # :serial => true,
52
+ # :key => true}],
53
+ # [:email, String, {:nullable => true,
54
+ # :default => 'nospam@nospam.tw'}],
55
+ # [:created_at, DateTime, {:nullable => true}],
56
+ # [:salt_first, String, {:nullable => true, :size => 50}],
57
+ # [:salt_second, String, {:nullable => true, :size => 50}]]}
58
+ # see Migration#storages and Migration#fields for detail
59
+ def storages_and_fields
60
+ storages.inject({}){ |result, storage|
61
+ result[storage] = fields(storage)
62
+ result
63
+ }
64
+ end
65
+
66
+ # automaticly generate model class(es) and reflect
67
+ # all fields with reflect /.*/ for you.
68
+ # e.g.
69
+ # dm.auto_genclass!
70
+ # # => [DataMapper::Is::Reflective::User,
71
+ # # DataMapper::Is::Reflective::SchemaInfo,
72
+ # # DataMapper::Is::Reflective::Session]
73
+ #
74
+ # you can change the scope of generated models:
75
+ # e.g.
76
+ # dm.auto_genclass! :scope => Object
77
+ # # => [User, SchemaInfo, Session]
78
+ #
79
+ # you can generate classes for tables you specified only:
80
+ # e.g.
81
+ # dm.auto_genclass! :scope => Object, :storages => /^phpbb_/
82
+ # # => [PhpbbUser, PhpbbPost, PhpbbConfig]
83
+ #
84
+ # you can generate classes with String too:
85
+ # e.g.
86
+ # dm.auto_genclass! :storages => ['users', 'config'], :scope => Object
87
+ # # => [User, Config]
88
+ #
89
+ # you can generate a class only:
90
+ # e.g.
91
+ # dm.auto_genclass! :storages => 'users'
92
+ # # => [DataMapper::Is::Reflective::User]
93
+ def auto_genclass! opts = {}
94
+ opts[:scope] ||= DataMapper::Is::Reflective
95
+ opts[:storages] ||= /.*/
96
+ opts[:storages] = [opts[:storages]].flatten
97
+
98
+ storages.map{ |storage|
99
+
100
+ mapped = opts[:storages].each{ |target|
101
+ case target
102
+ when Regexp;
103
+ break storage if storage =~ target
104
+
105
+ when Symbol, String;
106
+ break storage if storage == target.to_s
107
+
108
+ else
109
+ raise ArgumentError.new("invalid argument: #{target.inspect}")
110
+ end
111
+ }
112
+
113
+ reflective_genclass(mapped, opts[:scope]) if mapped.kind_of?(String)
114
+ }.compact
115
+ end
116
+
117
+ private
118
+ def reflective_query_storage storage
119
+ reflective_auto_load_adapter_extension
120
+ reflective_query_storage(storage) # call the overrided method
121
+ end
122
+
123
+ def reflective_genclass storage, scope
124
+ model = Class.new
125
+ model.__send__(:include, DataMapper::Resource)
126
+ model.is(:reflective)
127
+ model.storage_names[:default] = storage
128
+ model.__send__(:reflect, /.*/)
129
+ scope.const_set(Extlib::Inflection.classify(storage), model)
130
+ end
131
+
132
+ def reflective_lookup_primitive primitive
133
+ raise TypeError.new("#{primitive} not found for #{self.class}")
134
+ end
135
+
136
+ def reflective_auto_load_adapter_extension
137
+ require "dm-is-reflective/is/adapters/#{options['scheme']}_adapter"
138
+ class_name = "#{Extlib::Inflection.camelize(options['scheme'])}Adapter"
139
+ Adapters.const_get(class_name).__send__(:include,
140
+ Is::Reflective.const_get(class_name))
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,62 @@
1
+
2
+ require 'dm-is-reflective/is/adapters/abstract_adapter'
3
+
4
+ module DataMapper
5
+ module Is::Reflective
6
+ module MysqlAdapter
7
+ def storages
8
+ query 'SHOW TABLES'
9
+ end
10
+
11
+ private
12
+ # construct needed table metadata
13
+ def reflective_query_storage storage
14
+ sql = <<-SQL.compress_lines
15
+ SELECT column_name, column_default, is_nullable, data_type,
16
+ character_maximum_length, column_key, extra
17
+ FROM `information_schema`.`columns`
18
+ WHERE `table_schema` = ? AND `table_name` = ?
19
+ SQL
20
+
21
+ query(sql, db_name, storage)
22
+ end
23
+
24
+ def reflective_field_name field
25
+ field.column_name
26
+ end
27
+
28
+ def reflective_primitive field
29
+ field.data_type
30
+ end
31
+
32
+ def reflective_attributes field, attrs = {}
33
+ attrs[:serial] = true if field.extra == 'auto_increment'
34
+ attrs[:key] = true if field.column_key == 'PRI'
35
+
36
+ attrs[:nullable] = field.is_nullable == 'YES'
37
+ attrs[:default] = field.column_default if
38
+ field.column_default
39
+
40
+ attrs[:length] = field.character_maximum_length if
41
+ field.character_maximum_length
42
+
43
+ attrs
44
+ end
45
+
46
+ def reflective_lookup_primitive primitive
47
+ p = primitive.upcase
48
+
49
+ return Integer if p == 'YEAR'
50
+ return Integer if p =~ /\w*INT(EGER)?( SIGNED| UNSIGNED)?( ZEROFILL)?/
51
+ return BigDecimal if p =~ /(DOUBLE|FLOAT|DECIMAL)( SIGNED| UNSIGNED)?( ZEROFILL)?/
52
+ return String if p =~ /\w*BLOB|\w*BINARY|ENUM|SET|CHAR/
53
+ return Time if p == 'TIME'
54
+ return DateTime if p == 'DATETIME'
55
+ return DataMapper::Types::Boolean if %w[BOOL BOOLEAN].member?(p)
56
+ return DataMapper::Types::Text if p =~ /\w*TEXT/
57
+
58
+ super(primitive)
59
+ end
60
+ end
61
+ end
62
+ end