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 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