dm-is-reflective 0.9.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ tmp
2
+ pkg
3
+ doc
4
+ ann-*
5
+ Gemfile.lock
6
+
7
+ *.rbc
data/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "task"]
2
+ path = task
3
+ url = git://github.com/godfat/gemgem.git
data/CHANGES CHANGED
@@ -1,5 +1,8 @@
1
1
  = dm-is-reflective changes history
2
2
 
3
+ === dm-is-reflective 1.0.0, 2011-06-16
4
+ * updated against dm-core 1.1.0
5
+
3
6
  === dm-is-reflective 0.9.0, 2010-07-05
4
7
  * adapted to dm-core 1.0.0
5
8
  * reanmed AbstractAdapter to DataObjectsAdapter
data/CONTRIBUTORS ADDED
@@ -0,0 +1 @@
1
+ Lin Jen-Shin (godfat)
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+
2
+ source 'http://rubygems.org'
3
+ gemspec
data/README CHANGED
@@ -1,5 +1,5 @@
1
- = dm-is-reflective 0.9.0
2
- by Lin Jen-Shin (aka godfat-真常[http://godfat.org])
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, 'sqlite3:db/development.sqlite3'
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.0.0 or later
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-2010, Lin Jen-Shin (aka godfat 真常)
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 0.9.0
2
- by Lin Jen-Shin (aka godfat-真常[http://godfat.org])
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, 'sqlite3:db/development.sqlite3'
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.0.0 or later
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-2010, Lin Jen-Shin (aka godfat 真常)
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
- begin
4
- require 'bones'
5
- rescue LoadError
6
- abort '### Please install the "bones" gem ###'
7
- end
8
-
9
- ensure_in_path 'lib'
10
- proj = 'dm-is-reflective'
11
- require "#{proj}/version"
12
-
13
- Bones{
14
- version DataMapper::Is::Reflective::VERSION
15
-
16
- ruby_opts [''] # silence warning, too many in addressable and/or dm-core
17
- depend_on 'dm-core' , :version => '>=1.0.0'
18
- depend_on 'dm-do-adapter', :version => '>=1.0.0'
19
-
20
- %w[dm-migrations dm-sqlite-adapter
21
- dm-mysql-adapter dm-postgres-adapter].each{ |lib|
22
- depend_on lib, :development => true, :version => '>=1.0.0'
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
@@ -9,3 +9,5 @@
9
9
  * better doc...
10
10
  * 0.7.1 for more data types for postgresql adapter
11
11
  * 0.9 automatic determine model relationship
12
+
13
+ * use bacon instead of minitest
@@ -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.9.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 = ["Lin Jen-Shin (aka godfat 真常)"]
9
- s.date = %q{2010-07-05}
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", "Rakefile", "TODO", "dm-is-reflective.gemspec", "test/setup_db.sh"]
14
- s.files = ["CHANGES", "LICENSE", "NOTICE", "README", "Rakefile", "TODO", "dm-is-reflective.gemspec", "lib/dm-is-reflective.rb", "lib/dm-is-reflective/is/adapters/abstract_adapter.rb", "lib/dm-is-reflective/is/adapters/data_objects_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/sqlite_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/setup_db.sh", "test/test_dm-is-reflective.rb"]
15
- s.homepage = %q{http://github.com/godfat/dm-is-reflective}
16
- s.rdoc_options = ["--main", "README"]
17
- s.require_paths = ["lib"]
18
- s.rubyforge_project = %q{dm-is-reflective}
19
- s.rubygems_version = %q{1.3.7}
20
- s.summary = %q{DataMapper plugin that helps you manipulate an existing database}
21
- s.test_files = ["test/test_dm-is-reflective.rb"]
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>, [">= 1.0.0"])
29
- s.add_development_dependency(%q<dm-migrations>, [">= 1.0.0"])
30
- s.add_development_dependency(%q<dm-sqlite-adapter>, [">= 1.0.0"])
31
- s.add_development_dependency(%q<dm-mysql-adapter>, [">= 1.0.0"])
32
- s.add_development_dependency(%q<dm-postgres-adapter>, [">= 1.0.0"])
33
- s.add_development_dependency(%q<bones>, [">= 3.4.7"])
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>, [">= 1.0.0"])
36
- s.add_dependency(%q<dm-migrations>, [">= 1.0.0"])
37
- s.add_dependency(%q<dm-sqlite-adapter>, [">= 1.0.0"])
38
- s.add_dependency(%q<dm-mysql-adapter>, [">= 1.0.0"])
39
- s.add_dependency(%q<dm-postgres-adapter>, [">= 1.0.0"])
40
- s.add_dependency(%q<bones>, [">= 3.4.7"])
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>, [">= 1.0.0"])
44
- s.add_dependency(%q<dm-migrations>, [">= 1.0.0"])
45
- s.add_dependency(%q<dm-sqlite-adapter>, [">= 1.0.0"])
46
- s.add_dependency(%q<dm-mysql-adapter>, [">= 1.0.0"])
47
- s.add_dependency(%q<dm-postgres-adapter>, [">= 1.0.0"])
48
- s.add_dependency(%q<bones>, [">= 3.4.7"])
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.find{ |klass, attrs|
27
- next false if [Object, Time].include?(klass)
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
- DataMapper::Property::Serial
43
+ Property::Serial
36
44
 
37
45
  elsif type == TrueClass
38
- DataMapper::Property::Boolean
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] ||= DataMapper::Is::Reflective
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, DataMapper::Resource)
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(Extlib::Inflection.classify(storage), model)
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
- require "dm-is-reflective/is/adapters/#{options['scheme']}_adapter"
138
- class_name = "#{Extlib::Inflection.camelize(options['scheme'])}Adapter"
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.compress_lines
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(sql, options[:path].sub('/', ''), storage)
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 DataMapper::Property::Boolean if %w[BOOL BOOLEAN].member?(p)
55
- return DataMapper::Property::Text if p =~ /\w*TEXT/
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.compress_lines
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.compress_lines
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.compress_lines
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] = DataMapper::Property::Text.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 DataMapper::Property::Text if p == 'TEXT'
75
- return DataMapper::Property::Boolean if p == 'BOOL'
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.compress_lines
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] = DataMapper::Property::Text.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 DataMapper::Property::Text if p == 'TEXT'
54
+ return Property::Text if p == 'TEXT'
53
55
 
54
56
  super(primitive)
55
57
  end
@@ -1,3 +1,4 @@
1
+
1
2
  module DataMapper
2
3
  module Is
3
4
  module Reflective
@@ -1,7 +1,8 @@
1
+
1
2
  module DataMapper
2
3
  module Is
3
4
  module Reflective
4
- VERSION = '0.9.0'
5
+ VERSION = '1.0.0'
5
6
  end
6
7
  end
7
8
  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
- require 'test/abstract'
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, 'mysql://dm_is_reflective:godfat@localhost/dm_is_reflective')
38
+ DataMapper.setup(:default, :adapter => 'sqlite', :database => ':memory:')
37
39
  end
38
- end if defined?(DataMapper::Adapters::MysqlAdapter)
39
-
40
+ end if defined?(DataMapper::Adapters::SqliteAdapter)
40
41
 
41
- # cost 3 seconds to run
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
- hash: 59
5
- prerelease: false
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
- - "Lin Jen-Shin (aka godfat \xE7\x9C\x9F\xE5\xB8\xB8)"
7
+ authors:
8
+ - Lin Jen-Shin (godfat)
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2010-07-05 00:00:00 +08:00
19
- default_executable:
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
- prerelease: false
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
- hash: 23
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
- requirement: &id002 !ruby/object:Gem::Requirement
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
- hash: 23
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
- requirement: &id003 !ruby/object:Gem::Requirement
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
- hash: 23
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
- requirement: &id004 !ruby/object:Gem::Requirement
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
- hash: 23
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
- requirement: &id005 !ruby/object:Gem::Requirement
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
- hash: 23
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
- requirement: &id006 !ruby/object:Gem::Requirement
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
- hash: 23
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
- requirement: &id007 !ruby/object:Gem::Requirement
121
- none: false
122
- requirements:
123
- - - ">="
124
- - !ruby/object:Gem::Version
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
- - dm-is-reflective.gemspec
148
- - test/setup_db.sh
149
- files:
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
- has_rdoc: true
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
- hash: 3
185
- segments:
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
- hash: 3
194
- segments:
195
- - 0
196
- version: "0"
132
+ requirements:
133
+ - - ! '>='
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
197
136
  requirements: []
198
-
199
- rubyforge_project: dm-is-reflective
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
- test_files:
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