dm-is-reflective 0.9.0 → 1.0.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/.gitignore +7 -0
- data/.gitmodules +3 -0
- data/CHANGES +3 -0
- data/CONTRIBUTORS +1 -0
- data/Gemfile +3 -0
- data/README +7 -6
- data/README.rdoc +7 -6
- data/Rakefile +21 -38
- data/TODO +2 -0
- data/dm-is-reflective.gemspec +61 -34
- data/lib/dm-is-reflective/is/adapters/data_objects_adapter.rb +20 -9
- data/lib/dm-is-reflective/is/adapters/mysql_adapter.rb +7 -4
- data/lib/dm-is-reflective/is/adapters/postgres_adapter.rb +11 -9
- data/lib/dm-is-reflective/is/adapters/sqlite_adapter.rb +6 -4
- data/lib/dm-is-reflective/is/version.rb +1 -0
- data/lib/dm-is-reflective/version.rb +2 -1
- data/task/gemgem.rb +165 -0
- data/test/abstract.rb +1 -0
- data/test/test_dm-is-reflective.rb +19 -9
- metadata +85 -146
data/.gitignore
ADDED
data/.gitmodules
ADDED
data/CHANGES
CHANGED
data/CONTRIBUTORS
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Lin Jen-Shin (godfat)
|
data/Gemfile
ADDED
data/README
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
= dm-is-reflective
|
2
|
-
by Lin Jen-Shin (
|
1
|
+
= dm-is-reflective
|
2
|
+
by Lin Jen-Shin (godfat[http://godfat.org])
|
3
3
|
godfat (XD) godfat.org
|
4
4
|
|
5
5
|
== LINKS:
|
@@ -16,7 +16,7 @@ by Lin Jen-Shin (aka godfat-真常[http://godfat.org])
|
|
16
16
|
== SYNOPSIS:
|
17
17
|
|
18
18
|
require 'dm-is-reflective' # this would require 'dm-core'
|
19
|
-
dm = DataMapper.setup :default, '
|
19
|
+
dm = DataMapper.setup :default, 'sqlite:db/dev.sqlite3'
|
20
20
|
|
21
21
|
class User
|
22
22
|
include DataMapper::Resource
|
@@ -96,8 +96,9 @@ by Lin Jen-Shin (aka godfat-真常[http://godfat.org])
|
|
96
96
|
|
97
97
|
== REQUIREMENTS:
|
98
98
|
|
99
|
-
* dm-core 1.
|
100
|
-
* at least one dm-*-adapter
|
99
|
+
* dm-core 1.1.0 or later
|
100
|
+
* at least one dm-*-adapter which is using dm-do-adapter.
|
101
|
+
(relational database, namely sqlite, postgres, and mysql at the moment)
|
101
102
|
|
102
103
|
== INSTALL:
|
103
104
|
|
@@ -107,7 +108,7 @@ by Lin Jen-Shin (aka godfat-真常[http://godfat.org])
|
|
107
108
|
|
108
109
|
Apache License 2.0
|
109
110
|
|
110
|
-
Copyright (c) 2008-
|
111
|
+
Copyright (c) 2008-2011, Lin Jen-Shin (godfat)
|
111
112
|
|
112
113
|
Licensed under the Apache License, Version 2.0 (the "License");
|
113
114
|
you may not use this file except in compliance with the License.
|
data/README.rdoc
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
= dm-is-reflective
|
2
|
-
by Lin Jen-Shin (
|
1
|
+
= dm-is-reflective
|
2
|
+
by Lin Jen-Shin (godfat[http://godfat.org])
|
3
3
|
godfat (XD) godfat.org
|
4
4
|
|
5
5
|
== LINKS:
|
@@ -16,7 +16,7 @@ by Lin Jen-Shin (aka godfat-真常[http://godfat.org])
|
|
16
16
|
== SYNOPSIS:
|
17
17
|
|
18
18
|
require 'dm-is-reflective' # this would require 'dm-core'
|
19
|
-
dm = DataMapper.setup :default, '
|
19
|
+
dm = DataMapper.setup :default, 'sqlite:db/dev.sqlite3'
|
20
20
|
|
21
21
|
class User
|
22
22
|
include DataMapper::Resource
|
@@ -96,8 +96,9 @@ by Lin Jen-Shin (aka godfat-真常[http://godfat.org])
|
|
96
96
|
|
97
97
|
== REQUIREMENTS:
|
98
98
|
|
99
|
-
* dm-core 1.
|
100
|
-
* at least one dm-*-adapter
|
99
|
+
* dm-core 1.1.0 or later
|
100
|
+
* at least one dm-*-adapter which is using dm-do-adapter.
|
101
|
+
(relational database, namely sqlite, postgres, and mysql at the moment)
|
101
102
|
|
102
103
|
== INSTALL:
|
103
104
|
|
@@ -107,7 +108,7 @@ by Lin Jen-Shin (aka godfat-真常[http://godfat.org])
|
|
107
108
|
|
108
109
|
Apache License 2.0
|
109
110
|
|
110
|
-
Copyright (c) 2008-
|
111
|
+
Copyright (c) 2008-2011, Lin Jen-Shin (godfat)
|
111
112
|
|
112
113
|
Licensed under the Apache License, Version 2.0 (the "License");
|
113
114
|
you may not use this file except in compliance with the License.
|
data/Rakefile
CHANGED
@@ -1,41 +1,24 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
require
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
name proj
|
26
|
-
url "http://github.com/godfat/#{proj}"
|
27
|
-
authors 'Lin Jen-Shin (aka godfat 真常)'
|
28
|
-
email 'godfat (XD) godfat.org'
|
29
|
-
|
30
|
-
history_file 'CHANGES'
|
31
|
-
readme_file 'README'
|
32
|
-
ignore_file '.gitignore'
|
33
|
-
rdoc.include ['\w+']
|
34
|
-
}
|
35
|
-
|
36
|
-
CLEAN.include Dir['**/*.rbc']
|
37
|
-
|
38
|
-
task :default do
|
39
|
-
Rake.application.options.show_task_pattern = /./
|
40
|
-
Rake.application.display_tasks_and_comments
|
3
|
+
require "#{dir = File.dirname(__FILE__)}/task/gemgem"
|
4
|
+
Gemgem.dir = dir
|
5
|
+
|
6
|
+
($LOAD_PATH << File.expand_path("#{Gemgem.dir}/lib" )).uniq!
|
7
|
+
|
8
|
+
desc 'Generate gemspec'
|
9
|
+
task 'gem:spec' do
|
10
|
+
Gemgem.spec = Gemgem.create do |s|
|
11
|
+
require 'dm-is-reflective/version'
|
12
|
+
s.name = 'dm-is-reflective'
|
13
|
+
s.version = DataMapper::Is::Reflective::VERSION
|
14
|
+
# s.executables = [s.name]
|
15
|
+
|
16
|
+
%w[dm-core dm-do-adapter].each{ |g| s.add_runtime_dependency(g) }
|
17
|
+
%w[dm-migrations
|
18
|
+
dm-sqlite-adapter
|
19
|
+
dm-mysql-adapter
|
20
|
+
dm-postgres-adapter].each{ |g| s.add_development_dependency(g) }
|
21
|
+
end
|
22
|
+
|
23
|
+
Gemgem.write
|
41
24
|
end
|
data/TODO
CHANGED
data/dm-is-reflective.gemspec
CHANGED
@@ -2,49 +2,76 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{dm-is-reflective}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "1.0.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.authors = [
|
9
|
-
s.date = %q{
|
10
|
-
s.description = %q{
|
11
|
-
|
12
|
-
s.
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
s.
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
8
|
+
s.authors = [%q{Lin Jen-Shin (godfat)}]
|
9
|
+
s.date = %q{2011-06-16}
|
10
|
+
s.description = %q{DataMapper plugin that helps you manipulate an existing database. It creates mappings between existing columns and model's properties.}
|
11
|
+
s.email = [%q{godfat (XD) godfat.org}]
|
12
|
+
s.extra_rdoc_files = [
|
13
|
+
%q{CHANGES},
|
14
|
+
%q{CONTRIBUTORS},
|
15
|
+
%q{LICENSE},
|
16
|
+
%q{TODO}]
|
17
|
+
s.files = [
|
18
|
+
%q{.gitignore},
|
19
|
+
%q{.gitmodules},
|
20
|
+
%q{CHANGES},
|
21
|
+
%q{CONTRIBUTORS},
|
22
|
+
%q{Gemfile},
|
23
|
+
%q{LICENSE},
|
24
|
+
%q{NOTICE},
|
25
|
+
%q{README},
|
26
|
+
%q{README.rdoc},
|
27
|
+
%q{Rakefile},
|
28
|
+
%q{TODO},
|
29
|
+
%q{dm-is-reflective.gemspec},
|
30
|
+
%q{lib/dm-is-reflective.rb},
|
31
|
+
%q{lib/dm-is-reflective/is/adapters/data_objects_adapter.rb},
|
32
|
+
%q{lib/dm-is-reflective/is/adapters/mysql_adapter.rb},
|
33
|
+
%q{lib/dm-is-reflective/is/adapters/postgres_adapter.rb},
|
34
|
+
%q{lib/dm-is-reflective/is/adapters/sqlite_adapter.rb},
|
35
|
+
%q{lib/dm-is-reflective/is/reflective.rb},
|
36
|
+
%q{lib/dm-is-reflective/is/version.rb},
|
37
|
+
%q{lib/dm-is-reflective/version.rb},
|
38
|
+
%q{task/gemgem.rb},
|
39
|
+
%q{test/abstract.rb},
|
40
|
+
%q{test/setup_db.sh},
|
41
|
+
%q{test/test_dm-is-reflective.rb}]
|
42
|
+
s.homepage = %q{https://github.com/godfat/dm-is-reflective}
|
43
|
+
s.rdoc_options = [
|
44
|
+
%q{--main},
|
45
|
+
%q{README}]
|
46
|
+
s.require_paths = [%q{lib}]
|
47
|
+
s.rubygems_version = %q{1.8.5}
|
48
|
+
s.summary = %q{DataMapper plugin that helps you manipulate an existing database. It creates mappings between existing columns and model's properties.}
|
49
|
+
s.test_files = [%q{test/test_dm-is-reflective.rb}]
|
22
50
|
|
23
51
|
if s.respond_to? :specification_version then
|
24
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
52
|
s.specification_version = 3
|
26
53
|
|
27
54
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
28
|
-
s.add_runtime_dependency(%q<dm-core>, [">=
|
29
|
-
s.
|
30
|
-
s.add_development_dependency(%q<dm-
|
31
|
-
s.add_development_dependency(%q<dm-
|
32
|
-
s.add_development_dependency(%q<dm-
|
33
|
-
s.add_development_dependency(%q<
|
55
|
+
s.add_runtime_dependency(%q<dm-core>, [">= 0"])
|
56
|
+
s.add_runtime_dependency(%q<dm-do-adapter>, [">= 0"])
|
57
|
+
s.add_development_dependency(%q<dm-migrations>, [">= 0"])
|
58
|
+
s.add_development_dependency(%q<dm-sqlite-adapter>, [">= 0"])
|
59
|
+
s.add_development_dependency(%q<dm-mysql-adapter>, [">= 0"])
|
60
|
+
s.add_development_dependency(%q<dm-postgres-adapter>, [">= 0"])
|
34
61
|
else
|
35
|
-
s.add_dependency(%q<dm-core>, [">=
|
36
|
-
s.add_dependency(%q<dm-
|
37
|
-
s.add_dependency(%q<dm-
|
38
|
-
s.add_dependency(%q<dm-
|
39
|
-
s.add_dependency(%q<dm-
|
40
|
-
s.add_dependency(%q<
|
62
|
+
s.add_dependency(%q<dm-core>, [">= 0"])
|
63
|
+
s.add_dependency(%q<dm-do-adapter>, [">= 0"])
|
64
|
+
s.add_dependency(%q<dm-migrations>, [">= 0"])
|
65
|
+
s.add_dependency(%q<dm-sqlite-adapter>, [">= 0"])
|
66
|
+
s.add_dependency(%q<dm-mysql-adapter>, [">= 0"])
|
67
|
+
s.add_dependency(%q<dm-postgres-adapter>, [">= 0"])
|
41
68
|
end
|
42
69
|
else
|
43
|
-
s.add_dependency(%q<dm-core>, [">=
|
44
|
-
s.add_dependency(%q<dm-
|
45
|
-
s.add_dependency(%q<dm-
|
46
|
-
s.add_dependency(%q<dm-
|
47
|
-
s.add_dependency(%q<dm-
|
48
|
-
s.add_dependency(%q<
|
70
|
+
s.add_dependency(%q<dm-core>, [">= 0"])
|
71
|
+
s.add_dependency(%q<dm-do-adapter>, [">= 0"])
|
72
|
+
s.add_dependency(%q<dm-migrations>, [">= 0"])
|
73
|
+
s.add_dependency(%q<dm-sqlite-adapter>, [">= 0"])
|
74
|
+
s.add_dependency(%q<dm-mysql-adapter>, [">= 0"])
|
75
|
+
s.add_dependency(%q<dm-postgres-adapter>, [">= 0"])
|
49
76
|
end
|
50
77
|
end
|
@@ -2,6 +2,8 @@
|
|
2
2
|
module DataMapper
|
3
3
|
module Is::Reflective
|
4
4
|
module DataObjectsAdapter
|
5
|
+
include DataMapper
|
6
|
+
|
5
7
|
# returns all tables' name in the repository.
|
6
8
|
# e.g.
|
7
9
|
# ['comments', 'users']
|
@@ -23,8 +25,14 @@ module DataMapper
|
|
23
25
|
reflective_query_storage(storage).map{ |field|
|
24
26
|
primitive = reflective_primitive(field)
|
25
27
|
|
26
|
-
type = self.class.type_map.
|
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)
|
28
36
|
attrs[:primitive] == primitive
|
29
37
|
}
|
30
38
|
type = type ? type.first : reflective_lookup_primitive(primitive)
|
@@ -32,10 +40,10 @@ module DataMapper
|
|
32
40
|
attrs = reflective_attributes(field)
|
33
41
|
|
34
42
|
type = if attrs[:serial] && type == Integer
|
35
|
-
|
43
|
+
Property::Serial
|
36
44
|
|
37
45
|
elsif type == TrueClass
|
38
|
-
|
46
|
+
Property::Boolean
|
39
47
|
|
40
48
|
else
|
41
49
|
type
|
@@ -91,7 +99,7 @@ module DataMapper
|
|
91
99
|
# dm.auto_genclass! :storages => 'users'
|
92
100
|
# # => [DataMapper::Is::Reflective::User]
|
93
101
|
def auto_genclass! opts = {}
|
94
|
-
opts[:scope] ||=
|
102
|
+
opts[:scope] ||= Is::Reflective
|
95
103
|
opts[:storages] ||= /.*/
|
96
104
|
opts[:storages] = [opts[:storages]].flatten
|
97
105
|
|
@@ -122,11 +130,11 @@ module DataMapper
|
|
122
130
|
|
123
131
|
def reflective_genclass storage, scope
|
124
132
|
model = Class.new
|
125
|
-
model.__send__(:include,
|
133
|
+
model.__send__(:include, Resource)
|
126
134
|
model.is(:reflective)
|
127
135
|
model.storage_names[:default] = storage
|
128
136
|
model.__send__(:reflect, /.*/)
|
129
|
-
scope.const_set(
|
137
|
+
scope.const_set(Inflector.classify(storage), model)
|
130
138
|
end
|
131
139
|
|
132
140
|
def reflective_lookup_primitive primitive
|
@@ -134,8 +142,11 @@ module DataMapper
|
|
134
142
|
end
|
135
143
|
|
136
144
|
def reflective_auto_load_adapter_extension
|
137
|
-
|
138
|
-
|
145
|
+
# TODO: can we fix this adapter name in dm-sqlite-adapter?
|
146
|
+
adapter = options[:adapter].sub(/\Asqlite3\Z/, 'sqlite')
|
147
|
+
|
148
|
+
require "dm-is-reflective/is/adapters/#{adapter}_adapter"
|
149
|
+
class_name = "#{Inflector.camelize(adapter)}Adapter"
|
139
150
|
Adapters.const_get(class_name).__send__(:include,
|
140
151
|
Is::Reflective.const_get(class_name))
|
141
152
|
end
|
@@ -2,6 +2,8 @@
|
|
2
2
|
module DataMapper
|
3
3
|
module Is::Reflective
|
4
4
|
module MysqlAdapter
|
5
|
+
include DataMapper
|
6
|
+
|
5
7
|
def storages
|
6
8
|
select('SHOW TABLES')
|
7
9
|
end
|
@@ -9,14 +11,15 @@ module DataMapper
|
|
9
11
|
private
|
10
12
|
# construct needed table metadata
|
11
13
|
def reflective_query_storage storage
|
12
|
-
sql = <<-SQL
|
14
|
+
sql = <<-SQL
|
13
15
|
SELECT column_name, column_default, is_nullable, data_type,
|
14
16
|
character_maximum_length, column_key, extra
|
15
17
|
FROM `information_schema`.`columns`
|
16
18
|
WHERE `table_schema` = ? AND `table_name` = ?
|
17
19
|
SQL
|
18
20
|
|
19
|
-
select(
|
21
|
+
select(Ext::String.compress_lines(sql),
|
22
|
+
options[:path].sub('/', ''), storage)
|
20
23
|
end
|
21
24
|
|
22
25
|
def reflective_field_name field
|
@@ -51,8 +54,8 @@ module DataMapper
|
|
51
54
|
return Time if p == 'TIME'
|
52
55
|
return Date if p == 'DATE'
|
53
56
|
return DateTime if %w[DATETIME TIMESTAMP].member?(p)
|
54
|
-
return
|
55
|
-
return
|
57
|
+
return Property::Boolean if %w[BOOL BOOLEAN].member?(p)
|
58
|
+
return Property::Text if p =~ /\w*TEXT/
|
56
59
|
|
57
60
|
super(primitive)
|
58
61
|
end
|
@@ -2,32 +2,34 @@
|
|
2
2
|
module DataMapper
|
3
3
|
module Is::Reflective
|
4
4
|
module PostgresAdapter
|
5
|
+
include DataMapper
|
6
|
+
|
5
7
|
def storages
|
6
|
-
sql = <<-SQL
|
8
|
+
sql = <<-SQL
|
7
9
|
SELECT table_name FROM "information_schema"."tables"
|
8
10
|
WHERE table_schema = current_schema()
|
9
11
|
SQL
|
10
12
|
|
11
|
-
select(sql)
|
13
|
+
select(Ext::String.compress_lines(sql))
|
12
14
|
end
|
13
15
|
|
14
16
|
private
|
15
17
|
def reflective_query_storage storage
|
16
|
-
sql = <<-SQL
|
18
|
+
sql = <<-SQL
|
17
19
|
SELECT column_name FROM "information_schema"."key_column_usage"
|
18
20
|
WHERE table_schema = current_schema() AND table_name = ?
|
19
21
|
SQL
|
20
22
|
|
21
|
-
keys = select(sql, storage).to_set
|
23
|
+
keys = select(Ext::String.compress_lines(sql), storage).to_set
|
22
24
|
|
23
|
-
sql = <<-SQL
|
25
|
+
sql = <<-SQL
|
24
26
|
SELECT column_name, column_default, is_nullable,
|
25
27
|
character_maximum_length, udt_name
|
26
28
|
FROM "information_schema"."columns"
|
27
29
|
WHERE table_schema = current_schema() AND table_name = ?
|
28
30
|
SQL
|
29
31
|
|
30
|
-
select(sql, storage).map{ |struct|
|
32
|
+
select(Ext::String.compress_lines(sql), storage).map{ |struct|
|
31
33
|
struct.instance_eval <<-END_EVAL
|
32
34
|
def key?
|
33
35
|
#{keys.member?(struct.column_name)}
|
@@ -59,7 +61,7 @@ module DataMapper
|
|
59
61
|
if field.character_maximum_length
|
60
62
|
attrs[:length] = field.character_maximum_length
|
61
63
|
elsif field.udt_name.upcase == 'TEXT'
|
62
|
-
attrs[:length] =
|
64
|
+
attrs[:length] = Property::Text.length
|
63
65
|
end
|
64
66
|
|
65
67
|
attrs
|
@@ -71,8 +73,8 @@ module DataMapper
|
|
71
73
|
return Integer if p =~ /^INT\d+$/
|
72
74
|
return String if p == 'VARCHAR'
|
73
75
|
return DateTime if p == 'TIMESTAMP'
|
74
|
-
return
|
75
|
-
return
|
76
|
+
return Property::Text if p == 'TEXT'
|
77
|
+
return Property::Boolean if p == 'BOOL'
|
76
78
|
|
77
79
|
super(primitive)
|
78
80
|
end
|
@@ -2,14 +2,16 @@
|
|
2
2
|
module DataMapper
|
3
3
|
module Is::Reflective
|
4
4
|
module SqliteAdapter
|
5
|
+
include DataMapper
|
6
|
+
|
5
7
|
def storages
|
6
|
-
sql = <<-SQL
|
8
|
+
sql = <<-SQL
|
7
9
|
SELECT name
|
8
10
|
FROM sqlite_master
|
9
11
|
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
|
10
12
|
SQL
|
11
13
|
|
12
|
-
select(sql)
|
14
|
+
select(Ext::String.compress_lines(sql))
|
13
15
|
end
|
14
16
|
|
15
17
|
private
|
@@ -34,7 +36,7 @@ module DataMapper
|
|
34
36
|
attrs[:default] = field.dflt_value[1..-2] if field.dflt_value
|
35
37
|
|
36
38
|
if field.type.upcase == 'TEXT'
|
37
|
-
attrs[:length] =
|
39
|
+
attrs[:length] = Property::Text.length
|
38
40
|
else
|
39
41
|
ergo = field.type.match(/\((\d+)\)/)
|
40
42
|
size = ergo && ergo[1].to_i
|
@@ -49,7 +51,7 @@ module DataMapper
|
|
49
51
|
|
50
52
|
return Integer if p == 'INTEGER'
|
51
53
|
return Float if p == 'REAL' || p == 'NUMERIC'
|
52
|
-
return
|
54
|
+
return Property::Text if p == 'TEXT'
|
53
55
|
|
54
56
|
super(primitive)
|
55
57
|
end
|
data/task/gemgem.rb
ADDED
@@ -0,0 +1,165 @@
|
|
1
|
+
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
module Gemgem
|
5
|
+
class << self
|
6
|
+
attr_accessor :dir, :spec
|
7
|
+
end
|
8
|
+
|
9
|
+
module_function
|
10
|
+
def create
|
11
|
+
yield(spec = Gem::Specification.new{ |s|
|
12
|
+
s.authors = ['Lin Jen-Shin (godfat)']
|
13
|
+
s.email = ['godfat (XD) godfat.org']
|
14
|
+
|
15
|
+
s.summary = File.read("#{Gemgem.dir}/README").
|
16
|
+
match(/DESCRIPTION:\n\n(.+?)\n\n/m)[1]
|
17
|
+
s.description = s.summary
|
18
|
+
|
19
|
+
s.extra_rdoc_files = %w[CHANGES CONTRIBUTORS LICENSE TODO]
|
20
|
+
s.rdoc_options = %w[--main README]
|
21
|
+
s.rubygems_version = Gem::VERSION
|
22
|
+
s.date = Time.now.strftime('%Y-%m-%d')
|
23
|
+
s.files = gem_files
|
24
|
+
s.test_files = gem_files.grep(%r{^test/(.+?/)*test_.+?\.rb$})
|
25
|
+
s.require_paths = %w[lib]
|
26
|
+
})
|
27
|
+
spec.homepage = "https://github.com/godfat/#{spec.name}" unless
|
28
|
+
spec.homepage
|
29
|
+
spec
|
30
|
+
end
|
31
|
+
|
32
|
+
def gem_tag
|
33
|
+
"#{spec.name}-#{spec.version}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def write
|
37
|
+
File.open("#{dir}/#{spec.name}.gemspec", 'w'){ |f|
|
38
|
+
f << split_lines(spec.to_ruby) }
|
39
|
+
end
|
40
|
+
|
41
|
+
def split_lines ruby
|
42
|
+
ruby.gsub(/(.+?)\[(.+?)\]/){ |s|
|
43
|
+
if $2.index(',')
|
44
|
+
"#{$1}[\n #{$2.split(',').map(&:strip).join(",\n ")}]"
|
45
|
+
else
|
46
|
+
s
|
47
|
+
end
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def all_files
|
52
|
+
@all_files ||= find_files(Pathname.new(dir)).map{ |file|
|
53
|
+
if file.to_s =~ %r{\.git/}
|
54
|
+
nil
|
55
|
+
else
|
56
|
+
file.to_s
|
57
|
+
end
|
58
|
+
}.compact.sort
|
59
|
+
end
|
60
|
+
|
61
|
+
def gem_files
|
62
|
+
@gem_files ||= all_files - ignored_files
|
63
|
+
end
|
64
|
+
|
65
|
+
def ignored_files
|
66
|
+
@ignored_file ||= all_files.select{ |path| ignore_patterns.find{ |ignore|
|
67
|
+
path =~ ignore && !git_files.include?(path)}}
|
68
|
+
end
|
69
|
+
|
70
|
+
def git_files
|
71
|
+
@git_files ||= if File.exist?("#{dir}/.git")
|
72
|
+
`git ls-files`.split("\n")
|
73
|
+
else
|
74
|
+
[]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# protected
|
79
|
+
def find_files path
|
80
|
+
path.children.select(&:file?).map{|file| file.to_s[(dir.size+1)..-1]} +
|
81
|
+
path.children.select(&:directory?).map{|dir| find_files(dir)}.flatten
|
82
|
+
end
|
83
|
+
|
84
|
+
def ignore_patterns
|
85
|
+
@ignore_files ||= expand_patterns(
|
86
|
+
File.read("#{dir}/.gitignore").split("\n").reject{ |pattern|
|
87
|
+
pattern.strip == ''
|
88
|
+
}).map{ |pattern| %r{^([^/]+/)*?#{Regexp.escape(pattern)}(/[^/]+)*?$} }
|
89
|
+
end
|
90
|
+
|
91
|
+
def expand_patterns pathes
|
92
|
+
pathes.map{ |path|
|
93
|
+
if path !~ /\*/
|
94
|
+
path
|
95
|
+
else
|
96
|
+
expand_patterns(
|
97
|
+
Dir[path] +
|
98
|
+
Pathname.new(File.dirname(path)).children.select(&:directory?).
|
99
|
+
map{ |prefix| "#{prefix}/#{File.basename(path)}" })
|
100
|
+
end
|
101
|
+
}.flatten
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
namespace :gem do
|
106
|
+
|
107
|
+
desc 'Install gem'
|
108
|
+
task :install => [:build] do
|
109
|
+
sh("#{Gem.ruby} -S gem install pkg/#{Gemgem.gem_tag}")
|
110
|
+
end
|
111
|
+
|
112
|
+
desc 'Build gem'
|
113
|
+
task :build => [:spec] do
|
114
|
+
sh("#{Gem.ruby} -S gem build #{Gemgem.spec.name}.gemspec")
|
115
|
+
sh("mkdir -p pkg")
|
116
|
+
sh("mv #{Gemgem.gem_tag}.gem pkg/")
|
117
|
+
end
|
118
|
+
|
119
|
+
desc 'Release gem'
|
120
|
+
task :release => [:spec, :check, :build] do
|
121
|
+
sh("git tag #{Gemgem.gem_tag}")
|
122
|
+
sh("git push")
|
123
|
+
sh("git push --tags")
|
124
|
+
sh("#{Gem.ruby} -S gem push pkg/#{Gemgem.gem_tag}.gem")
|
125
|
+
end
|
126
|
+
|
127
|
+
task :check do
|
128
|
+
ver = Gemgem.spec.version.to_s
|
129
|
+
|
130
|
+
if ENV['VERSION'].nil?
|
131
|
+
puts("\x1b[35mExpected " \
|
132
|
+
"\x1b[33mVERSION\x1b[35m=\x1b[33m#{ver}\x1b[m")
|
133
|
+
exit(1)
|
134
|
+
|
135
|
+
elsif ENV['VERSION'] != ver
|
136
|
+
puts("\x1b[35mExpected \x1b[33mVERSION\x1b[35m=\x1b[33m#{ver} " \
|
137
|
+
"\x1b[35mbut got\n " \
|
138
|
+
"\x1b[33mVERSION\x1b[35m=\x1b[33m#{ENV['VERSION']}\x1b[m")
|
139
|
+
exit(2)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
end # of gem namespace
|
144
|
+
|
145
|
+
desc 'Run tests'
|
146
|
+
task :test do
|
147
|
+
sh("#{Gem.ruby} -I lib -S bacon --quiet test/test_*.rb")
|
148
|
+
end
|
149
|
+
|
150
|
+
desc 'Generate rdoc'
|
151
|
+
task :doc => ['gem:spec'] do
|
152
|
+
sh("yardoc -o rdoc --main README.md" \
|
153
|
+
" --files #{Gemgem.spec.extra_rdoc_files.join(',')}")
|
154
|
+
end
|
155
|
+
|
156
|
+
desc 'Removed ignored files'
|
157
|
+
task :clean => ['gem:spec'] do
|
158
|
+
trash = "~/.Trash/#{Gemgem.spec.name}/"
|
159
|
+
sh "mkdir -p #{trash}" unless File.exist?(File.expand_path(trash))
|
160
|
+
Gemgem.ignored_files.each{ |file| sh "mv #{file} #{trash}" }
|
161
|
+
end
|
162
|
+
|
163
|
+
task :default do
|
164
|
+
puts `#{Gem.ruby} -S #{$PROGRAM_NAME} -T`
|
165
|
+
end
|
data/test/abstract.rb
CHANGED
@@ -29,6 +29,7 @@ module Abstract
|
|
29
29
|
|
30
30
|
# there's differences between adapters
|
31
31
|
def super_user_fields
|
32
|
+
Object.const_set(:MysqlTest, Class.new) unless defined?(MysqlTest) # dummy
|
32
33
|
case self
|
33
34
|
when MysqlTest # Mysql couldn't tell it's boolean or tinyint
|
34
35
|
[[:bool, Integer, AttrCommon],
|
@@ -1,5 +1,9 @@
|
|
1
1
|
|
2
|
-
|
2
|
+
if respond_to?(:require_relative, true)
|
3
|
+
require_relative 'abstract'
|
4
|
+
else
|
5
|
+
require File.dirname(__FILE__) + '/abstract'
|
6
|
+
end
|
3
7
|
|
4
8
|
TestCase = begin
|
5
9
|
require 'minitest/unit'
|
@@ -24,21 +28,18 @@ class SqliteTest < TestCase
|
|
24
28
|
|
25
29
|
def setup_data_mapper
|
26
30
|
DataMapper.setup(:default, 'sqlite::memory:')
|
31
|
+
|
27
32
|
end
|
28
33
|
end if defined?(DataMapper::Adapters::SqliteAdapter)
|
29
34
|
|
30
|
-
|
31
|
-
# cost 2 seconds to run
|
32
|
-
class MysqlTest < TestCase
|
35
|
+
class SqliteHashSetupTest < TestCase
|
33
36
|
include Abstract
|
34
|
-
|
35
37
|
def setup_data_mapper
|
36
|
-
DataMapper.setup(:default, '
|
38
|
+
DataMapper.setup(:default, :adapter => 'sqlite', :database => ':memory:')
|
37
39
|
end
|
38
|
-
end if defined?(DataMapper::Adapters::
|
39
|
-
|
40
|
+
end if defined?(DataMapper::Adapters::SqliteAdapter)
|
40
41
|
|
41
|
-
# cost
|
42
|
+
# cost 2 seconds to run
|
42
43
|
class PostgresTest < TestCase
|
43
44
|
include Abstract
|
44
45
|
|
@@ -46,3 +47,12 @@ class PostgresTest < TestCase
|
|
46
47
|
DataMapper.setup(:default, 'postgres://dm_is_reflective:godfat@localhost/dm_is_reflective')
|
47
48
|
end
|
48
49
|
end if defined?(DataMapper::Adapters::PostgresAdapter)
|
50
|
+
|
51
|
+
# cost 8 seconds to run (what the hell??)
|
52
|
+
class MysqlTest < TestCase
|
53
|
+
include Abstract
|
54
|
+
|
55
|
+
def setup_data_mapper
|
56
|
+
DataMapper.setup(:default, 'mysql://dm_is_reflective:godfat@localhost/dm_is_reflective')
|
57
|
+
end
|
58
|
+
end if defined?(DataMapper::Adapters::MysqlAdapter)
|
metadata
CHANGED
@@ -1,153 +1,99 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm-is-reflective
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 9
|
9
|
-
- 0
|
10
|
-
version: 0.9.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
13
|
-
-
|
7
|
+
authors:
|
8
|
+
- Lin Jen-Shin (godfat)
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-06-16 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: dm-core
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2160101400 !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 1
|
32
|
-
- 0
|
33
|
-
- 0
|
34
|
-
version: 1.0.0
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
35
22
|
type: :runtime
|
36
|
-
version_requirements: *id001
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: dm-do-adapter
|
39
23
|
prerelease: false
|
40
|
-
|
24
|
+
version_requirements: *2160101400
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: dm-do-adapter
|
27
|
+
requirement: &2160100780 !ruby/object:Gem::Requirement
|
41
28
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
|
46
|
-
segments:
|
47
|
-
- 1
|
48
|
-
- 0
|
49
|
-
- 0
|
50
|
-
version: 1.0.0
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
51
33
|
type: :runtime
|
52
|
-
version_requirements: *id002
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: dm-migrations
|
55
34
|
prerelease: false
|
56
|
-
|
35
|
+
version_requirements: *2160100780
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: dm-migrations
|
38
|
+
requirement: &2160100040 !ruby/object:Gem::Requirement
|
57
39
|
none: false
|
58
|
-
requirements:
|
59
|
-
- -
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
|
62
|
-
segments:
|
63
|
-
- 1
|
64
|
-
- 0
|
65
|
-
- 0
|
66
|
-
version: 1.0.0
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
67
44
|
type: :development
|
68
|
-
version_requirements: *id003
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: dm-sqlite-adapter
|
71
45
|
prerelease: false
|
72
|
-
|
46
|
+
version_requirements: *2160100040
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: dm-sqlite-adapter
|
49
|
+
requirement: &2160075900 !ruby/object:Gem::Requirement
|
73
50
|
none: false
|
74
|
-
requirements:
|
75
|
-
- -
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
|
78
|
-
segments:
|
79
|
-
- 1
|
80
|
-
- 0
|
81
|
-
- 0
|
82
|
-
version: 1.0.0
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
83
55
|
type: :development
|
84
|
-
version_requirements: *id004
|
85
|
-
- !ruby/object:Gem::Dependency
|
86
|
-
name: dm-mysql-adapter
|
87
56
|
prerelease: false
|
88
|
-
|
57
|
+
version_requirements: *2160075900
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: dm-mysql-adapter
|
60
|
+
requirement: &2160075200 !ruby/object:Gem::Requirement
|
89
61
|
none: false
|
90
|
-
requirements:
|
91
|
-
- -
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
|
94
|
-
segments:
|
95
|
-
- 1
|
96
|
-
- 0
|
97
|
-
- 0
|
98
|
-
version: 1.0.0
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
99
66
|
type: :development
|
100
|
-
version_requirements: *id005
|
101
|
-
- !ruby/object:Gem::Dependency
|
102
|
-
name: dm-postgres-adapter
|
103
67
|
prerelease: false
|
104
|
-
|
68
|
+
version_requirements: *2160075200
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: dm-postgres-adapter
|
71
|
+
requirement: &2160074520 !ruby/object:Gem::Requirement
|
105
72
|
none: false
|
106
|
-
requirements:
|
107
|
-
- -
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
|
110
|
-
segments:
|
111
|
-
- 1
|
112
|
-
- 0
|
113
|
-
- 0
|
114
|
-
version: 1.0.0
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
115
77
|
type: :development
|
116
|
-
version_requirements: *id006
|
117
|
-
- !ruby/object:Gem::Dependency
|
118
|
-
name: bones
|
119
78
|
prerelease: false
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
hash: 25
|
126
|
-
segments:
|
127
|
-
- 3
|
128
|
-
- 4
|
129
|
-
- 7
|
130
|
-
version: 3.4.7
|
131
|
-
type: :development
|
132
|
-
version_requirements: *id007
|
133
|
-
description: " DataMapper plugin that helps you manipulate an existing database.\n It creates mappings between existing columns and model's properties."
|
134
|
-
email: godfat (XD) godfat.org
|
79
|
+
version_requirements: *2160074520
|
80
|
+
description: DataMapper plugin that helps you manipulate an existing database. It
|
81
|
+
creates mappings between existing columns and model's properties.
|
82
|
+
email:
|
83
|
+
- godfat (XD) godfat.org
|
135
84
|
executables: []
|
136
|
-
|
137
85
|
extensions: []
|
138
|
-
|
139
|
-
extra_rdoc_files:
|
86
|
+
extra_rdoc_files:
|
140
87
|
- CHANGES
|
88
|
+
- CONTRIBUTORS
|
141
89
|
- LICENSE
|
142
|
-
- NOTICE
|
143
|
-
- README
|
144
|
-
- README.rdoc
|
145
|
-
- Rakefile
|
146
90
|
- TODO
|
147
|
-
|
148
|
-
-
|
149
|
-
|
91
|
+
files:
|
92
|
+
- .gitignore
|
93
|
+
- .gitmodules
|
150
94
|
- CHANGES
|
95
|
+
- CONTRIBUTORS
|
96
|
+
- Gemfile
|
151
97
|
- LICENSE
|
152
98
|
- NOTICE
|
153
99
|
- README
|
@@ -163,43 +109,36 @@ files:
|
|
163
109
|
- lib/dm-is-reflective/is/reflective.rb
|
164
110
|
- lib/dm-is-reflective/is/version.rb
|
165
111
|
- lib/dm-is-reflective/version.rb
|
112
|
+
- task/gemgem.rb
|
166
113
|
- test/abstract.rb
|
167
114
|
- test/setup_db.sh
|
168
115
|
- test/test_dm-is-reflective.rb
|
169
|
-
|
170
|
-
homepage: http://github.com/godfat/dm-is-reflective
|
116
|
+
homepage: https://github.com/godfat/dm-is-reflective
|
171
117
|
licenses: []
|
172
|
-
|
173
118
|
post_install_message:
|
174
|
-
rdoc_options:
|
119
|
+
rdoc_options:
|
175
120
|
- --main
|
176
121
|
- README
|
177
|
-
require_paths:
|
122
|
+
require_paths:
|
178
123
|
- lib
|
179
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
124
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
180
125
|
none: false
|
181
|
-
requirements:
|
182
|
-
- -
|
183
|
-
- !ruby/object:Gem::Version
|
184
|
-
|
185
|
-
|
186
|
-
- 0
|
187
|
-
version: "0"
|
188
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - ! '>='
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0'
|
130
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
189
131
|
none: false
|
190
|
-
requirements:
|
191
|
-
- -
|
192
|
-
- !ruby/object:Gem::Version
|
193
|
-
|
194
|
-
segments:
|
195
|
-
- 0
|
196
|
-
version: "0"
|
132
|
+
requirements:
|
133
|
+
- - ! '>='
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
197
136
|
requirements: []
|
198
|
-
|
199
|
-
|
200
|
-
rubygems_version: 1.3.7
|
137
|
+
rubyforge_project:
|
138
|
+
rubygems_version: 1.8.5
|
201
139
|
signing_key:
|
202
140
|
specification_version: 3
|
203
|
-
summary: DataMapper plugin that helps you manipulate an existing database
|
204
|
-
|
141
|
+
summary: DataMapper plugin that helps you manipulate an existing database. It creates
|
142
|
+
mappings between existing columns and model's properties.
|
143
|
+
test_files:
|
205
144
|
- test/test_dm-is-reflective.rb
|