dm-core 0.10.2 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (183) hide show
  1. data/.gitignore +10 -1
  2. data/Gemfile +143 -0
  3. data/Rakefile +9 -5
  4. data/VERSION +1 -1
  5. data/dm-core.gemspec +160 -57
  6. data/lib/dm-core.rb +131 -56
  7. data/lib/dm-core/adapters.rb +98 -14
  8. data/lib/dm-core/adapters/abstract_adapter.rb +24 -4
  9. data/lib/dm-core/adapters/in_memory_adapter.rb +7 -2
  10. data/lib/dm-core/associations/many_to_many.rb +19 -30
  11. data/lib/dm-core/associations/many_to_one.rb +58 -42
  12. data/lib/dm-core/associations/one_to_many.rb +33 -23
  13. data/lib/dm-core/associations/one_to_one.rb +27 -11
  14. data/lib/dm-core/associations/relationship.rb +4 -4
  15. data/lib/dm-core/collection.rb +23 -16
  16. data/lib/dm-core/core_ext/array.rb +36 -0
  17. data/lib/dm-core/core_ext/hash.rb +30 -0
  18. data/lib/dm-core/core_ext/module.rb +46 -0
  19. data/lib/dm-core/core_ext/object.rb +31 -0
  20. data/lib/dm-core/core_ext/pathname.rb +20 -0
  21. data/lib/dm-core/core_ext/string.rb +22 -0
  22. data/lib/dm-core/core_ext/try_dup.rb +44 -0
  23. data/lib/dm-core/model.rb +88 -27
  24. data/lib/dm-core/model/hook.rb +75 -18
  25. data/lib/dm-core/model/property.rb +50 -9
  26. data/lib/dm-core/model/relationship.rb +31 -31
  27. data/lib/dm-core/model/scope.rb +3 -3
  28. data/lib/dm-core/property.rb +196 -516
  29. data/lib/dm-core/property/binary.rb +7 -0
  30. data/lib/dm-core/property/boolean.rb +35 -0
  31. data/lib/dm-core/property/class.rb +24 -0
  32. data/lib/dm-core/property/date.rb +47 -0
  33. data/lib/dm-core/property/date_time.rb +48 -0
  34. data/lib/dm-core/property/decimal.rb +43 -0
  35. data/lib/dm-core/property/discriminator.rb +48 -0
  36. data/lib/dm-core/property/float.rb +24 -0
  37. data/lib/dm-core/property/integer.rb +32 -0
  38. data/lib/dm-core/property/numeric.rb +43 -0
  39. data/lib/dm-core/property/object.rb +32 -0
  40. data/lib/dm-core/property/serial.rb +8 -0
  41. data/lib/dm-core/property/string.rb +49 -0
  42. data/lib/dm-core/property/text.rb +12 -0
  43. data/lib/dm-core/property/time.rb +48 -0
  44. data/lib/dm-core/property/typecast/numeric.rb +32 -0
  45. data/lib/dm-core/property/typecast/time.rb +28 -0
  46. data/lib/dm-core/property_set.rb +10 -4
  47. data/lib/dm-core/query.rb +14 -37
  48. data/lib/dm-core/query/conditions/comparison.rb +8 -6
  49. data/lib/dm-core/query/conditions/operation.rb +33 -2
  50. data/lib/dm-core/query/operator.rb +2 -5
  51. data/lib/dm-core/query/path.rb +4 -6
  52. data/lib/dm-core/repository.rb +21 -6
  53. data/lib/dm-core/resource.rb +316 -133
  54. data/lib/dm-core/resource/state.rb +79 -0
  55. data/lib/dm-core/resource/state/clean.rb +40 -0
  56. data/lib/dm-core/resource/state/deleted.rb +30 -0
  57. data/lib/dm-core/resource/state/dirty.rb +86 -0
  58. data/lib/dm-core/resource/state/immutable.rb +34 -0
  59. data/lib/dm-core/resource/state/persisted.rb +29 -0
  60. data/lib/dm-core/resource/state/transient.rb +70 -0
  61. data/lib/dm-core/spec/lib/adapter_helpers.rb +52 -0
  62. data/lib/dm-core/spec/lib/collection_helpers.rb +20 -0
  63. data/{spec → lib/dm-core/spec}/lib/counter_adapter.rb +5 -1
  64. data/lib/dm-core/spec/lib/pending_helpers.rb +50 -0
  65. data/lib/dm-core/spec/lib/spec_helper.rb +68 -0
  66. data/lib/dm-core/spec/setup.rb +165 -0
  67. data/lib/dm-core/spec/{adapter_shared_spec.rb → shared/adapter_spec.rb} +21 -7
  68. data/{spec/public/shared/resource_shared_spec.rb → lib/dm-core/spec/shared/resource_spec.rb} +120 -83
  69. data/{spec/public/shared/sel_shared_spec.rb → lib/dm-core/spec/shared/sel_spec.rb} +5 -6
  70. data/lib/dm-core/support/assertions.rb +8 -0
  71. data/lib/dm-core/support/equalizer.rb +1 -0
  72. data/lib/dm-core/support/hook.rb +420 -0
  73. data/lib/dm-core/support/lazy_array.rb +453 -0
  74. data/lib/dm-core/support/local_object_space.rb +12 -0
  75. data/lib/dm-core/support/logger.rb +193 -6
  76. data/lib/dm-core/support/naming_conventions.rb +8 -8
  77. data/lib/dm-core/support/subject.rb +33 -0
  78. data/lib/dm-core/type.rb +4 -0
  79. data/lib/dm-core/types/boolean.rb +2 -0
  80. data/lib/dm-core/types/decimal.rb +9 -0
  81. data/lib/dm-core/types/discriminator.rb +2 -0
  82. data/lib/dm-core/types/object.rb +3 -0
  83. data/lib/dm-core/types/serial.rb +2 -0
  84. data/lib/dm-core/types/text.rb +2 -0
  85. data/lib/dm-core/version.rb +1 -1
  86. data/spec/public/associations/many_to_many/read_multiple_join_spec.rb +67 -0
  87. data/spec/public/model/hook_spec.rb +209 -0
  88. data/spec/public/model/property_spec.rb +35 -0
  89. data/spec/public/model/relationship_spec.rb +33 -20
  90. data/spec/public/model_spec.rb +142 -10
  91. data/spec/public/property/binary_spec.rb +14 -0
  92. data/spec/public/property/boolean_spec.rb +14 -0
  93. data/spec/public/property/class_spec.rb +20 -0
  94. data/spec/public/property/date_spec.rb +14 -0
  95. data/spec/public/property/date_time_spec.rb +14 -0
  96. data/spec/public/property/decimal_spec.rb +14 -0
  97. data/spec/public/{types → property}/discriminator_spec.rb +2 -12
  98. data/spec/public/property/float_spec.rb +14 -0
  99. data/spec/public/property/integer_spec.rb +14 -0
  100. data/spec/public/property/object_spec.rb +9 -17
  101. data/spec/public/property/serial_spec.rb +14 -0
  102. data/spec/public/property/string_spec.rb +14 -0
  103. data/spec/public/property/text_spec.rb +52 -0
  104. data/spec/public/property/time_spec.rb +14 -0
  105. data/spec/public/property_spec.rb +28 -87
  106. data/spec/public/resource_spec.rb +101 -0
  107. data/spec/public/sel_spec.rb +5 -15
  108. data/spec/public/shared/collection_shared_spec.rb +16 -30
  109. data/spec/public/shared/finder_shared_spec.rb +2 -4
  110. data/spec/public/shared/property_shared_spec.rb +176 -0
  111. data/spec/semipublic/adapters/abstract_adapter_spec.rb +1 -1
  112. data/spec/semipublic/adapters/in_memory_adapter_spec.rb +2 -2
  113. data/spec/semipublic/associations/many_to_many_spec.rb +89 -0
  114. data/spec/semipublic/associations/many_to_one_spec.rb +24 -1
  115. data/spec/semipublic/associations/one_to_many_spec.rb +51 -0
  116. data/spec/semipublic/associations/one_to_one_spec.rb +49 -0
  117. data/spec/semipublic/associations/relationship_spec.rb +3 -3
  118. data/spec/semipublic/associations_spec.rb +1 -1
  119. data/spec/semipublic/property/binary_spec.rb +13 -0
  120. data/spec/semipublic/property/boolean_spec.rb +65 -0
  121. data/spec/semipublic/property/class_spec.rb +33 -0
  122. data/spec/semipublic/property/date_spec.rb +43 -0
  123. data/spec/semipublic/property/date_time_spec.rb +46 -0
  124. data/spec/semipublic/property/decimal_spec.rb +82 -0
  125. data/spec/semipublic/property/discriminator_spec.rb +19 -0
  126. data/spec/semipublic/property/float_spec.rb +82 -0
  127. data/spec/semipublic/property/integer_spec.rb +82 -0
  128. data/spec/semipublic/property/serial_spec.rb +13 -0
  129. data/spec/semipublic/property/string_spec.rb +13 -0
  130. data/spec/semipublic/property/text_spec.rb +31 -0
  131. data/spec/semipublic/property/time_spec.rb +50 -0
  132. data/spec/semipublic/property_spec.rb +2 -532
  133. data/spec/semipublic/query/conditions/comparison_spec.rb +171 -169
  134. data/spec/semipublic/query/conditions/operation_spec.rb +53 -51
  135. data/spec/semipublic/query/path_spec.rb +17 -17
  136. data/spec/semipublic/query_spec.rb +47 -78
  137. data/spec/semipublic/resource/state/clean_spec.rb +88 -0
  138. data/spec/semipublic/resource/state/deleted_spec.rb +78 -0
  139. data/spec/semipublic/resource/state/dirty_spec.rb +133 -0
  140. data/spec/semipublic/resource/state/immutable_spec.rb +99 -0
  141. data/spec/semipublic/resource/state/transient_spec.rb +128 -0
  142. data/spec/semipublic/resource/state_spec.rb +226 -0
  143. data/spec/semipublic/shared/property_shared_spec.rb +143 -0
  144. data/spec/semipublic/shared/resource_shared_spec.rb +16 -15
  145. data/spec/semipublic/shared/resource_state_shared_spec.rb +78 -0
  146. data/spec/semipublic/shared/subject_shared_spec.rb +79 -0
  147. data/spec/spec_helper.rb +21 -97
  148. data/spec/support/types/huge_integer.rb +17 -0
  149. data/spec/unit/array_spec.rb +48 -0
  150. data/spec/unit/hash_spec.rb +35 -0
  151. data/spec/unit/hook_spec.rb +1234 -0
  152. data/spec/unit/lazy_array_spec.rb +1959 -0
  153. data/spec/unit/module_spec.rb +70 -0
  154. data/spec/unit/object_spec.rb +37 -0
  155. data/spec/unit/try_dup_spec.rb +45 -0
  156. data/tasks/local_gemfile.rake +18 -0
  157. data/tasks/spec.rake +0 -3
  158. metadata +197 -71
  159. data/deps.rip +0 -2
  160. data/lib/dm-core/adapters/data_objects_adapter.rb +0 -712
  161. data/lib/dm-core/adapters/mysql_adapter.rb +0 -42
  162. data/lib/dm-core/adapters/oracle_adapter.rb +0 -229
  163. data/lib/dm-core/adapters/postgres_adapter.rb +0 -22
  164. data/lib/dm-core/adapters/sqlite3_adapter.rb +0 -17
  165. data/lib/dm-core/adapters/sqlserver_adapter.rb +0 -114
  166. data/lib/dm-core/adapters/yaml_adapter.rb +0 -111
  167. data/lib/dm-core/core_ext/enumerable.rb +0 -28
  168. data/lib/dm-core/migrations.rb +0 -1427
  169. data/lib/dm-core/spec/data_objects_adapter_shared_spec.rb +0 -366
  170. data/lib/dm-core/transaction.rb +0 -508
  171. data/lib/dm-core/types/paranoid_boolean.rb +0 -42
  172. data/lib/dm-core/types/paranoid_datetime.rb +0 -41
  173. data/spec/lib/adapter_helpers.rb +0 -105
  174. data/spec/lib/collection_helpers.rb +0 -18
  175. data/spec/lib/pending_helpers.rb +0 -46
  176. data/spec/public/migrations_spec.rb +0 -503
  177. data/spec/public/transaction_spec.rb +0 -153
  178. data/spec/semipublic/adapters/mysql_adapter_spec.rb +0 -17
  179. data/spec/semipublic/adapters/oracle_adapter_spec.rb +0 -194
  180. data/spec/semipublic/adapters/postgres_adapter_spec.rb +0 -17
  181. data/spec/semipublic/adapters/sqlite3_adapter_spec.rb +0 -17
  182. data/spec/semipublic/adapters/sqlserver_adapter_spec.rb +0 -17
  183. data/spec/semipublic/adapters/yaml_adapter_spec.rb +0 -12
@@ -1,42 +0,0 @@
1
- module DataMapper
2
- module Types
3
- class ParanoidBoolean < Type
4
- primitive TrueClass
5
- default false
6
- lazy true
7
-
8
- # @api private
9
- def self.bind(property)
10
- repository_name = property.repository_name
11
- model = property.model
12
- property_name = property.name
13
-
14
- model.send(:set_paranoid_property, property_name){true}
15
-
16
- model.class_eval <<-RUBY, __FILE__, __LINE__ + 1
17
- def self.with_deleted
18
- with_exclusive_scope(#{property_name.inspect} => true) do
19
- yield
20
- end
21
- end
22
-
23
- def destroy
24
- paranoid_destroy
25
- end
26
-
27
- def paranoid_destroy
28
- self.class.paranoid_properties.each do |name, blk|
29
- attribute_set(name, blk.call(self))
30
- end
31
- save_self
32
- @_destroyed = true
33
- @_readonly = true
34
- reset
35
- end
36
- RUBY
37
-
38
- model.default_scope(repository_name).update(property_name => false)
39
- end
40
- end # class ParanoidBoolean
41
- end # module Types
42
- end # module DataMapper
@@ -1,41 +0,0 @@
1
- module DataMapper
2
- module Types
3
- class ParanoidDateTime < Type
4
- primitive DateTime
5
- lazy true
6
-
7
- # @api private
8
- def self.bind(property)
9
- repository_name = property.repository_name
10
- model = property.model
11
- property_name = property.name
12
-
13
- model.send(:set_paranoid_property, property_name){DateTime.now}
14
-
15
- model.class_eval <<-RUBY, __FILE__, __LINE__ + 1
16
- def self.with_deleted
17
- with_exclusive_scope(#{property_name.inspect}.not => nil) do
18
- yield
19
- end
20
- end
21
-
22
- def destroy
23
- paranoid_destroy
24
- end
25
-
26
- def paranoid_destroy
27
- self.class.paranoid_properties.each do |name, blk|
28
- attribute_set(name, blk.call(self))
29
- end
30
- save_self
31
- @_destroyed = true
32
- @_readonly = true
33
- reset
34
- end
35
- RUBY
36
-
37
- model.default_scope(repository_name).update(property_name => nil)
38
- end
39
- end # class ParanoidDateTime
40
- end # module Types
41
- end # module DataMapper
@@ -1,105 +0,0 @@
1
- require "benchmark"
2
-
3
- module DataMapper::Spec
4
- module AdapterHelpers
5
- def self.current_adapters
6
- @current_adapters ||= []
7
- end
8
-
9
- def supported_by(*adapters, &block)
10
- adapters = get_adapters(*adapters)
11
-
12
- PRIMARY.only(*adapters).each do |adapter, connection_uri|
13
- # keep track of the current adapters
14
- AdapterHelpers.current_adapters << adapters
15
-
16
- describe("with #{adapter}") do
17
-
18
- before :all do
19
- # store these in instance vars for the shared adapter specs
20
- @adapter = DataMapper.setup(:default, connection_uri)
21
- @repository = DataMapper.repository(@adapter.name)
22
-
23
- # create all tables and constraints before each spec
24
- if @repository.respond_to?(:auto_migrate!)
25
- @repository.auto_migrate!
26
- end
27
- end
28
-
29
- after :all do
30
- # remove all tables and constraints after each spec
31
- if DataMapper.respond_to?(:auto_migrate_down!, true)
32
- DataMapper.send(:auto_migrate_down!, @repository.name)
33
- end
34
- end
35
-
36
- # TODO: add destroy_model_storage and migrations code
37
- # that removes the YAML file and remove this code
38
- after :all do
39
- if defined?(DataMapper::Adapters::YamlAdapter) && @adapter.kind_of?(DataMapper::Adapters::YamlAdapter)
40
- descendants = DataMapper::Model.descendants.to_a
41
- while model = descendants.shift
42
- descendants.concat(model.descendants.to_a - [ model ])
43
-
44
- model.default_scope.clear
45
- model.all(:repository => @repository).destroy!
46
- end
47
- end
48
- end
49
-
50
- self.instance_eval(&block)
51
- end
52
-
53
- AdapterHelpers.current_adapters.pop
54
- end
55
- end
56
-
57
- def with_alternate_adapter(&block)
58
- adapters = AdapterHelpers.current_adapters.last
59
-
60
- ALTERNATE.only(*adapters).each do |adapter, connection_uri|
61
- describe("and #{adapter}") do
62
-
63
- before :all do
64
- @alternate_adapter = DataMapper.setup(:alternate, connection_uri)
65
- @alternate_repository = DataMapper.repository(@alternate_adapter.name)
66
-
67
- # create all tables and constraints before each spec
68
- if @alternate_repository.respond_to?(:auto_migrate!)
69
- @alternate_repository.auto_migrate!
70
- end
71
- end
72
-
73
- after :all do
74
- # remove all tables and constraints after each spec
75
- if DataMapper.respond_to?(:auto_migrate_down!, true)
76
- DataMapper.send(:auto_migrate_down!, @alternate_repository.name)
77
- end
78
- end
79
-
80
- # TODO: add destroy_model_storage and migrations code
81
- # that removes the YAML file and remove this code
82
- after :all do
83
- if defined?(DataMapper::Adapters::YamlAdapter) && @alternate_adapter.kind_of?(DataMapper::Adapters::YamlAdapter)
84
- descendants = DataMapper::Model.descendants.to_a
85
- while model = descendants.shift
86
- descendants.concat(model.descendants.to_a - [ model ])
87
-
88
- model.default_scope.clear
89
- model.all(:repository => @alternate_repository).destroy!
90
- end
91
- end
92
- end
93
-
94
- self.instance_eval(&block)
95
- end
96
- end
97
- end
98
-
99
- def get_adapters(*adapters)
100
- adapters.map! { |adapter_name| adapter_name.to_s }
101
- adapters = ADAPTERS if adapters.include?('all')
102
- ADAPTERS & adapters
103
- end
104
- end
105
- end
@@ -1,18 +0,0 @@
1
- module DataMapper::Spec
2
- module CollectionHelpers
3
- module GroupMethods
4
- def self.extended(base)
5
- base.class_inheritable_accessor :loaded
6
- base.loaded = false
7
- end
8
-
9
- def should_not_be_a_kicker(ivar = :@articles)
10
- unless loaded
11
- it 'should not be a kicker' do
12
- instance_variable_get(ivar).should_not be_loaded
13
- end
14
- end
15
- end
16
- end
17
- end
18
- end
@@ -1,46 +0,0 @@
1
- module DataMapper::Spec
2
- module PendingHelpers
3
- def pending_if(*args)
4
- message, boolean = parse_args(*args)
5
-
6
- if boolean
7
- pending(message) { yield }
8
- else
9
- yield
10
- end
11
- end
12
-
13
- def rescue_if(*args)
14
- message, boolean = parse_args(*args)
15
-
16
- if boolean
17
- raised = nil
18
- begin
19
- yield
20
- raised = false
21
- rescue Exception
22
- raised = true
23
- end
24
-
25
- raise "should have raised: #{message || 'TODO'}" if raised == false
26
- else
27
- yield
28
- end
29
- end
30
-
31
- private
32
-
33
- def parse_args(*args)
34
- case args.map { |arg| arg.class }
35
- when [ String, TrueClass ], [ String, FalseClass ] then args
36
- when [ String, NilClass ] then [ args.first, false ]
37
- when [ String ] then [ args.first, true ]
38
- when [ TrueClass ], [ FalseClass ] then [ '', args.first ]
39
- when [ NilClass ] then [ '', false ]
40
- when [] then [ '', true ] # defaults
41
- else
42
- raise ArgumentError, "Invalid arguments: #{args.inspect}"
43
- end
44
- end
45
- end
46
- end
@@ -1,503 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
-
3
- describe DataMapper::Migrations do
4
- def capture_log(mod)
5
- original, mod.logger = mod.logger, DataObjects::Logger.new(@log = StringIO.new, :debug)
6
- yield
7
- ensure
8
- @log.rewind
9
- @output = @log.readlines.map do |line|
10
- line.chomp.gsub(/\A.+?~ \(\d+\.?\d*\)\s+/, '')
11
- end
12
-
13
- mod.logger = original
14
- end
15
-
16
- supported_by :mysql do
17
- before :all do
18
- module ::Blog
19
- class Article
20
- include DataMapper::Resource
21
- end
22
- end
23
-
24
- @model = ::Blog::Article
25
- end
26
-
27
- describe '#auto_migrate' do
28
- describe 'Integer property' do
29
- [
30
- [ 0, 1, 'TINYINT(1) UNSIGNED' ],
31
- [ 0, 9, 'TINYINT(1) UNSIGNED' ],
32
- [ 0, 10, 'TINYINT(2) UNSIGNED' ],
33
- [ 0, 99, 'TINYINT(2) UNSIGNED' ],
34
- [ 0, 100, 'TINYINT(3) UNSIGNED' ],
35
- [ 0, 255, 'TINYINT(3) UNSIGNED' ],
36
- [ 0, 256, 'SMALLINT(3) UNSIGNED' ],
37
- [ 0, 999, 'SMALLINT(3) UNSIGNED' ],
38
- [ 0, 1000, 'SMALLINT(4) UNSIGNED' ],
39
- [ 0, 9999, 'SMALLINT(4) UNSIGNED' ],
40
- [ 0, 10000, 'SMALLINT(5) UNSIGNED' ],
41
- [ 0, 65535, 'SMALLINT(5) UNSIGNED' ],
42
- [ 0, 65536, 'MEDIUMINT(5) UNSIGNED' ],
43
- [ 0, 99999, 'MEDIUMINT(5) UNSIGNED' ],
44
- [ 0, 100000, 'MEDIUMINT(6) UNSIGNED' ],
45
- [ 0, 999999, 'MEDIUMINT(6) UNSIGNED' ],
46
- [ 0, 1000000, 'MEDIUMINT(7) UNSIGNED' ],
47
- [ 0, 9999999, 'MEDIUMINT(7) UNSIGNED' ],
48
- [ 0, 10000000, 'MEDIUMINT(8) UNSIGNED' ],
49
- [ 0, 16777215, 'MEDIUMINT(8) UNSIGNED' ],
50
- [ 0, 16777216, 'INT(8) UNSIGNED' ],
51
- [ 0, 99999999, 'INT(8) UNSIGNED' ],
52
- [ 0, 100000000, 'INT(9) UNSIGNED' ],
53
- [ 0, 999999999, 'INT(9) UNSIGNED' ],
54
- [ 0, 1000000000, 'INT(10) UNSIGNED' ],
55
- [ 0, 4294967295, 'INT(10) UNSIGNED' ],
56
- [ 0, 4294967296, 'BIGINT(10) UNSIGNED' ],
57
- [ 0, 9999999999, 'BIGINT(10) UNSIGNED' ],
58
- [ 0, 10000000000, 'BIGINT(11) UNSIGNED' ],
59
- [ 0, 99999999999, 'BIGINT(11) UNSIGNED' ],
60
- [ 0, 100000000000, 'BIGINT(12) UNSIGNED' ],
61
- [ 0, 999999999999, 'BIGINT(12) UNSIGNED' ],
62
- [ 0, 1000000000000, 'BIGINT(13) UNSIGNED' ],
63
- [ 0, 9999999999999, 'BIGINT(13) UNSIGNED' ],
64
- [ 0, 10000000000000, 'BIGINT(14) UNSIGNED' ],
65
- [ 0, 99999999999999, 'BIGINT(14) UNSIGNED' ],
66
- [ 0, 100000000000000, 'BIGINT(15) UNSIGNED' ],
67
- [ 0, 999999999999999, 'BIGINT(15) UNSIGNED' ],
68
- [ 0, 1000000000000000, 'BIGINT(16) UNSIGNED' ],
69
- [ 0, 9999999999999999, 'BIGINT(16) UNSIGNED' ],
70
- [ 0, 10000000000000000, 'BIGINT(17) UNSIGNED' ],
71
- [ 0, 99999999999999999, 'BIGINT(17) UNSIGNED' ],
72
- [ 0, 100000000000000000, 'BIGINT(18) UNSIGNED' ],
73
- [ 0, 999999999999999999, 'BIGINT(18) UNSIGNED' ],
74
- [ 0, 1000000000000000000, 'BIGINT(19) UNSIGNED' ],
75
- [ 0, 9999999999999999999, 'BIGINT(19) UNSIGNED' ],
76
- [ 0, 10000000000000000000, 'BIGINT(20) UNSIGNED' ],
77
- [ 0, 18446744073709551615, 'BIGINT(20) UNSIGNED' ],
78
-
79
- [ -1, 0, 'TINYINT(2)' ],
80
- [ -1, 9, 'TINYINT(2)' ],
81
- [ -1, 10, 'TINYINT(2)' ],
82
- [ -1, 99, 'TINYINT(2)' ],
83
- [ -1, 100, 'TINYINT(3)' ],
84
- [ -1, 127, 'TINYINT(3)' ],
85
- [ -1, 128, 'SMALLINT(3)' ],
86
- [ -1, 999, 'SMALLINT(3)' ],
87
- [ -1, 1000, 'SMALLINT(4)' ],
88
- [ -1, 9999, 'SMALLINT(4)' ],
89
- [ -1, 10000, 'SMALLINT(5)' ],
90
- [ -1, 32767, 'SMALLINT(5)' ],
91
- [ -1, 32768, 'MEDIUMINT(5)' ],
92
- [ -1, 99999, 'MEDIUMINT(5)' ],
93
- [ -1, 100000, 'MEDIUMINT(6)' ],
94
- [ -1, 999999, 'MEDIUMINT(6)' ],
95
- [ -1, 1000000, 'MEDIUMINT(7)' ],
96
- [ -1, 8388607, 'MEDIUMINT(7)' ],
97
- [ -1, 8388608, 'INT(7)' ],
98
- [ -1, 9999999, 'INT(7)' ],
99
- [ -1, 10000000, 'INT(8)' ],
100
- [ -1, 99999999, 'INT(8)' ],
101
- [ -1, 100000000, 'INT(9)' ],
102
- [ -1, 999999999, 'INT(9)' ],
103
- [ -1, 1000000000, 'INT(10)' ],
104
- [ -1, 2147483647, 'INT(10)' ],
105
- [ -1, 2147483648, 'BIGINT(10)' ],
106
- [ -1, 9999999999, 'BIGINT(10)' ],
107
- [ -1, 10000000000, 'BIGINT(11)' ],
108
- [ -1, 99999999999, 'BIGINT(11)' ],
109
- [ -1, 100000000000, 'BIGINT(12)' ],
110
- [ -1, 999999999999, 'BIGINT(12)' ],
111
- [ -1, 1000000000000, 'BIGINT(13)' ],
112
- [ -1, 9999999999999, 'BIGINT(13)' ],
113
- [ -1, 10000000000000, 'BIGINT(14)' ],
114
- [ -1, 99999999999999, 'BIGINT(14)' ],
115
- [ -1, 100000000000000, 'BIGINT(15)' ],
116
- [ -1, 999999999999999, 'BIGINT(15)' ],
117
- [ -1, 1000000000000000, 'BIGINT(16)' ],
118
- [ -1, 9999999999999999, 'BIGINT(16)' ],
119
- [ -1, 10000000000000000, 'BIGINT(17)' ],
120
- [ -1, 99999999999999999, 'BIGINT(17)' ],
121
- [ -1, 100000000000000000, 'BIGINT(18)' ],
122
- [ -1, 999999999999999999, 'BIGINT(18)' ],
123
- [ -1, 1000000000000000000, 'BIGINT(19)' ],
124
- [ -1, 9223372036854775807, 'BIGINT(19)' ],
125
-
126
- [ -1, 0, 'TINYINT(2)' ],
127
- [ -9, 0, 'TINYINT(2)' ],
128
- [ -10, 0, 'TINYINT(3)' ],
129
- [ -99, 0, 'TINYINT(3)' ],
130
- [ -100, 0, 'TINYINT(4)' ],
131
- [ -128, 0, 'TINYINT(4)' ],
132
- [ -129, 0, 'SMALLINT(4)' ],
133
- [ -999, 0, 'SMALLINT(4)' ],
134
- [ -1000, 0, 'SMALLINT(5)' ],
135
- [ -9999, 0, 'SMALLINT(5)' ],
136
- [ -10000, 0, 'SMALLINT(6)' ],
137
- [ -32768, 0, 'SMALLINT(6)' ],
138
- [ -32769, 0, 'MEDIUMINT(6)' ],
139
- [ -99999, 0, 'MEDIUMINT(6)' ],
140
- [ -100000, 0, 'MEDIUMINT(7)' ],
141
- [ -999999, 0, 'MEDIUMINT(7)' ],
142
- [ -1000000, 0, 'MEDIUMINT(8)' ],
143
- [ -8388608, 0, 'MEDIUMINT(8)' ],
144
- [ -8388609, 0, 'INT(8)' ],
145
- [ -9999999, 0, 'INT(8)' ],
146
- [ -10000000, 0, 'INT(9)' ],
147
- [ -99999999, 0, 'INT(9)' ],
148
- [ -100000000, 0, 'INT(10)' ],
149
- [ -999999999, 0, 'INT(10)' ],
150
- [ -1000000000, 0, 'INT(11)' ],
151
- [ -2147483648, 0, 'INT(11)' ],
152
- [ -2147483649, 0, 'BIGINT(11)' ],
153
- [ -9999999999, 0, 'BIGINT(11)' ],
154
- [ -10000000000, 0, 'BIGINT(12)' ],
155
- [ -99999999999, 0, 'BIGINT(12)' ],
156
- [ -100000000000, 0, 'BIGINT(13)' ],
157
- [ -999999999999, 0, 'BIGINT(13)' ],
158
- [ -1000000000000, 0, 'BIGINT(14)' ],
159
- [ -9999999999999, 0, 'BIGINT(14)' ],
160
- [ -10000000000000, 0, 'BIGINT(15)' ],
161
- [ -99999999999999, 0, 'BIGINT(15)' ],
162
- [ -100000000000000, 0, 'BIGINT(16)' ],
163
- [ -999999999999999, 0, 'BIGINT(16)' ],
164
- [ -1000000000000000, 0, 'BIGINT(17)' ],
165
- [ -9999999999999999, 0, 'BIGINT(17)' ],
166
- [ -10000000000000000, 0, 'BIGINT(18)' ],
167
- [ -99999999999999999, 0, 'BIGINT(18)' ],
168
- [ -100000000000000000, 0, 'BIGINT(19)' ],
169
- [ -999999999999999999, 0, 'BIGINT(19)' ],
170
- [ -1000000000000000000, 0, 'BIGINT(20)' ],
171
- [ -9223372036854775808, 0, 'BIGINT(20)' ],
172
-
173
- [ nil, 2147483647, 'INT(10) UNSIGNED' ],
174
- [ 0, nil, 'INT(10) UNSIGNED' ],
175
- [ nil, nil, 'INTEGER' ],
176
- ].each do |min, max, statement|
177
- options = { :key => true }
178
- options[:min] = min if min
179
- options[:max] = max if max
180
-
181
- describe "with a min of #{min} and a max of #{max}" do
182
- before :all do
183
- @property = @model.property(:id, Integer, options)
184
-
185
- @response = capture_log(DataObjects::Mysql) { @model.auto_migrate! }
186
- end
187
-
188
- it 'should return true' do
189
- @response.should be_true
190
- end
191
-
192
- it "should create a #{statement} column" do
193
- @output.last.should =~ %r{\ACREATE TABLE `blog_articles` \(`id` #{Regexp.escape(statement)} NOT NULL, PRIMARY KEY\(`id`\)\) ENGINE = InnoDB CHARACTER SET [a-z\d]+ COLLATE (?:[a-z\d](?:_?[a-z\d]+)*)\z}
194
- end
195
-
196
- options.only(:min, :max).each do |key, value|
197
- it "should allow the #{key} value #{value} to be stored" do
198
- lambda {
199
- resource = @model.create(@property => value)
200
- @model.first(@property => value).should eql(resource)
201
- }.should_not raise_error
202
- end
203
- end
204
- end
205
- end
206
- end
207
-
208
- describe 'Text property' do
209
- before :all do
210
- @model.property(:id, DataMapper::Types::Serial)
211
- end
212
-
213
- [
214
- [ 0, 'TINYTEXT' ],
215
- [ 1, 'TINYTEXT' ],
216
- [ 255, 'TINYTEXT' ],
217
- [ 256, 'TEXT' ],
218
- [ 65535, 'TEXT' ],
219
- [ 65536, 'MEDIUMTEXT' ],
220
- [ 16777215, 'MEDIUMTEXT' ],
221
- [ 16777216, 'LONGTEXT' ],
222
- [ 4294967295, 'LONGTEXT' ],
223
-
224
- [ nil, 'TEXT' ],
225
- ].each do |length, statement|
226
- options = {}
227
- options[:length] = length if length
228
-
229
- describe "with a length of #{length}" do
230
- before :all do
231
- @property = @model.property(:body, DataMapper::Types::Text, options)
232
-
233
- @response = capture_log(DataObjects::Mysql) { @model.auto_migrate! }
234
- end
235
-
236
- it 'should return true' do
237
- @response.should be_true
238
- end
239
-
240
- it "should create a #{statement} column" do
241
- @output.last.should =~ %r{\ACREATE TABLE `blog_articles` \(`id` INT\(10\) UNSIGNED NOT NULL AUTO_INCREMENT, `body` #{Regexp.escape(statement)}, PRIMARY KEY\(`id`\)\) ENGINE = InnoDB CHARACTER SET [a-z\d]+ COLLATE (?:[a-z\d](?:_?[a-z\d]+)*)\z}
242
- end
243
- end
244
- end
245
- end
246
-
247
- describe 'String property' do
248
- before :all do
249
- @model.property(:id, DataMapper::Types::Serial)
250
- end
251
-
252
- [
253
- [ 1, 'VARCHAR(1)' ],
254
- [ 50, 'VARCHAR(50)' ],
255
- [ 255, 'VARCHAR(255)' ],
256
- [ nil, 'VARCHAR(50)' ],
257
- ].each do |length, statement|
258
- options = {}
259
- options[:length] = length if length
260
-
261
- describe "with a length of #{length}" do
262
- before :all do
263
- @property = @model.property(:title, String, options)
264
-
265
- @response = capture_log(DataObjects::Mysql) { @model.auto_migrate! }
266
- end
267
-
268
- it 'should return true' do
269
- @response.should be_true
270
- end
271
-
272
- it "should create a #{statement} column" do
273
- @output.last.should =~ %r{\ACREATE TABLE `blog_articles` \(`id` INT\(10\) UNSIGNED NOT NULL AUTO_INCREMENT, `title` #{Regexp.escape(statement)}, PRIMARY KEY\(`id`\)\) ENGINE = InnoDB CHARACTER SET [a-z\d]+ COLLATE (?:[a-z\d](?:_?[a-z\d]+)*)\z}
274
- end
275
- end
276
- end
277
- end
278
- end
279
- end
280
-
281
- supported_by :postgres do
282
- before :all do
283
- module ::Blog
284
- class Article
285
- include DataMapper::Resource
286
- end
287
- end
288
-
289
- @model = ::Blog::Article
290
- end
291
-
292
- describe '#auto_migrate' do
293
- describe 'Integer property' do
294
- [
295
- [ 0, 1, 'SMALLINT' ],
296
- [ 0, 32767, 'SMALLINT' ],
297
- [ 0, 32768, 'INTEGER' ],
298
- [ 0, 2147483647, 'INTEGER' ],
299
- [ 0, 2147483648, 'BIGINT' ],
300
- [ 0, 9223372036854775807, 'BIGINT' ],
301
-
302
- [ -1, 1, 'SMALLINT' ],
303
- [ -1, 32767, 'SMALLINT' ],
304
- [ -1, 32768, 'INTEGER' ],
305
- [ -1, 2147483647, 'INTEGER' ],
306
- [ -1, 2147483648, 'BIGINT' ],
307
- [ -1, 9223372036854775807, 'BIGINT' ],
308
-
309
- [ -1, 0, 'SMALLINT' ],
310
- [ -32768, 0, 'SMALLINT' ],
311
- [ -32769, 0, 'INTEGER' ],
312
- [ -2147483648, 0, 'INTEGER' ],
313
- [ -2147483649, 0, 'BIGINT' ],
314
- [ -9223372036854775808, 0, 'BIGINT' ],
315
-
316
- [ nil, 2147483647, 'INTEGER' ],
317
- [ 0, nil, 'INTEGER' ],
318
- [ nil, nil, 'INTEGER' ],
319
- ].each do |min, max, statement|
320
- options = { :key => true }
321
- options[:min] = min if min
322
- options[:max] = max if max
323
-
324
- describe "with a min of #{min} and a max of #{max}" do
325
- before :all do
326
- @property = @model.property(:id, Integer, options)
327
-
328
- @response = capture_log(DataObjects::Postgres) { @model.auto_migrate! }
329
- end
330
-
331
- it 'should return true' do
332
- @response.should be_true
333
- end
334
-
335
- it "should create a #{statement} column" do
336
- @output[-2].should == "CREATE TABLE \"blog_articles\" (\"id\" #{statement} NOT NULL, PRIMARY KEY(\"id\"))"
337
- end
338
-
339
- options.only(:min, :max).each do |key, value|
340
- it "should allow the #{key} value #{value} to be stored" do
341
- lambda {
342
- resource = @model.create(@property => value)
343
- @model.first(@property => value).should eql(resource)
344
- }.should_not raise_error
345
- end
346
- end
347
- end
348
- end
349
- end
350
-
351
- describe 'Serial property' do
352
- [
353
- [ 1, 'SERIAL' ],
354
- [ 2147483647, 'SERIAL' ],
355
- [ 2147483648, 'BIGSERIAL' ],
356
- [ 9223372036854775807, 'BIGSERIAL' ],
357
-
358
- [ nil, 'SERIAL' ],
359
- ].each do |max, statement|
360
- options = {}
361
- options[:max] = max if max
362
-
363
- describe "with a max of #{max}" do
364
- before :all do
365
- @property = @model.property(:id, DataMapper::Types::Serial, options)
366
-
367
- @response = capture_log(DataObjects::Postgres) { @model.auto_migrate! }
368
- end
369
-
370
- it 'should return true' do
371
- @response.should be_true
372
- end
373
-
374
- it "should create a #{statement} column" do
375
- @output[-2].should == "CREATE TABLE \"blog_articles\" (\"id\" #{statement} NOT NULL, PRIMARY KEY(\"id\"))"
376
- end
377
-
378
- options.only(:min, :max).each do |key, value|
379
- it "should allow the #{key} value #{value} to be stored" do
380
- lambda {
381
- resource = @model.create(@property => value)
382
- @model.first(@property => value).should eql(resource)
383
- }.should_not raise_error
384
- end
385
- end
386
- end
387
- end
388
- end
389
-
390
- describe 'String property' do
391
- before :all do
392
- @model.property(:id, DataMapper::Types::Serial)
393
- end
394
-
395
- [
396
- [ 1, 'VARCHAR(1)' ],
397
- [ 50, 'VARCHAR(50)' ],
398
- [ 255, 'VARCHAR(255)' ],
399
- [ nil, 'VARCHAR(50)' ],
400
- ].each do |length, statement|
401
- options = {}
402
- options[:length] = length if length
403
-
404
- describe "with a length of #{length}" do
405
- before :all do
406
- @property = @model.property(:title, String, options)
407
-
408
- @response = capture_log(DataObjects::Postgres) { @model.auto_migrate! }
409
- end
410
-
411
- it 'should return true' do
412
- @response.should be_true
413
- end
414
-
415
- it "should create a #{statement} column" do
416
- @output[-2].should == "CREATE TABLE \"blog_articles\" (\"id\" SERIAL NOT NULL, \"title\" #{statement}, PRIMARY KEY(\"id\"))"
417
- end
418
- end
419
- end
420
- end
421
- end
422
- end
423
-
424
- supported_by :sqlserver do
425
- before :all do
426
- module ::Blog
427
- class Article
428
- include DataMapper::Resource
429
- end
430
- end
431
-
432
- @model = ::Blog::Article
433
- end
434
-
435
- describe '#auto_migrate' do
436
- describe 'Integer property' do
437
- [
438
- [ 0, 1, 'TINYINT' ],
439
- [ 0, 255, 'TINYINT' ],
440
- [ 0, 256, 'SMALLINT' ],
441
- [ 0, 32767, 'SMALLINT' ],
442
- [ 0, 32768, 'INT' ],
443
- [ 0, 2147483647, 'INT' ],
444
- [ 0, 2147483648, 'BIGINT' ],
445
- [ 0, 9223372036854775807, 'BIGINT' ],
446
-
447
- [ -1, 1, 'SMALLINT' ],
448
- [ -1, 255, 'SMALLINT' ],
449
- [ -1, 256, 'SMALLINT' ],
450
- [ -1, 32767, 'SMALLINT' ],
451
- [ -1, 32768, 'INT' ],
452
- [ -1, 2147483647, 'INT' ],
453
- [ -1, 2147483648, 'BIGINT' ],
454
- [ -1, 9223372036854775807, 'BIGINT' ],
455
-
456
- [ -1, 0, 'SMALLINT' ],
457
- [ -32768, 0, 'SMALLINT' ],
458
- [ -32769, 0, 'INT' ],
459
- [ -2147483648, 0, 'INT' ],
460
- [ -2147483649, 0, 'BIGINT' ],
461
- [ -9223372036854775808, 0, 'BIGINT' ],
462
-
463
- [ nil, 2147483647, 'INT' ],
464
- [ 0, nil, 'INT' ],
465
- [ nil, nil, 'INTEGER' ],
466
- ].each do |min, max, statement|
467
- options = { :key => true }
468
- options[:min] = min if min
469
- options[:max] = max if max
470
-
471
- describe "with a min of #{min} and a max of #{max}" do
472
- before :all do
473
- @property = @model.property(:id, Integer, options)
474
-
475
- @response = capture_log(DataObjects::Sqlserver) { @model.auto_migrate! }
476
- end
477
-
478
- it 'should return true' do
479
- @response.should be_true
480
- end
481
-
482
- it "should create a #{statement} column" do
483
- @output.last.should == "CREATE TABLE \"blog_articles\" (\"id\" #{statement} NOT NULL, PRIMARY KEY(\"id\"))"
484
- end
485
-
486
- options.only(:min, :max).each do |key, value|
487
- it "should allow the #{key} value #{value} to be stored" do
488
- lambda {
489
- resource = @model.create(@property => value)
490
- @model.first(@property => value).should eql(resource)
491
- }.should_not raise_error
492
- end
493
- end
494
- end
495
- end
496
- end
497
-
498
- describe 'String property' do
499
- it 'needs specs'
500
- end
501
- end
502
- end
503
- end