dm-core 0.10.2 → 1.0.0.rc1

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