datamapper 0.3.2 → 0.9.3

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 (180) hide show
  1. data/History.txt +0 -0
  2. data/Manifest.txt +5 -0
  3. data/README.txt +11 -0
  4. data/Rakefile +70 -0
  5. data/lib/datamapper.rb +8 -0
  6. metadata +152 -319
  7. data/CHANGELOG +0 -145
  8. data/FAQ +0 -96
  9. data/MIT-LICENSE +0 -22
  10. data/QUICKLINKS +0 -12
  11. data/README +0 -105
  12. data/environment.rb +0 -62
  13. data/example.rb +0 -156
  14. data/lib/data_mapper.rb +0 -88
  15. data/lib/data_mapper/adapters/abstract_adapter.rb +0 -43
  16. data/lib/data_mapper/adapters/data_object_adapter.rb +0 -480
  17. data/lib/data_mapper/adapters/mysql_adapter.rb +0 -72
  18. data/lib/data_mapper/adapters/postgresql_adapter.rb +0 -258
  19. data/lib/data_mapper/adapters/sql/coersion.rb +0 -134
  20. data/lib/data_mapper/adapters/sql/commands/load_command.rb +0 -545
  21. data/lib/data_mapper/adapters/sql/mappings/associations_set.rb +0 -34
  22. data/lib/data_mapper/adapters/sql/mappings/column.rb +0 -279
  23. data/lib/data_mapper/adapters/sql/mappings/conditions.rb +0 -172
  24. data/lib/data_mapper/adapters/sql/mappings/schema.rb +0 -60
  25. data/lib/data_mapper/adapters/sql/mappings/table.rb +0 -459
  26. data/lib/data_mapper/adapters/sql/quoting.rb +0 -24
  27. data/lib/data_mapper/adapters/sqlite3_adapter.rb +0 -159
  28. data/lib/data_mapper/associations.rb +0 -106
  29. data/lib/data_mapper/associations/belongs_to_association.rb +0 -160
  30. data/lib/data_mapper/associations/has_and_belongs_to_many_association.rb +0 -437
  31. data/lib/data_mapper/associations/has_many_association.rb +0 -283
  32. data/lib/data_mapper/associations/has_n_association.rb +0 -143
  33. data/lib/data_mapper/associations/reference.rb +0 -47
  34. data/lib/data_mapper/attributes.rb +0 -73
  35. data/lib/data_mapper/auto_migrations.rb +0 -36
  36. data/lib/data_mapper/base.rb +0 -17
  37. data/lib/data_mapper/callbacks.rb +0 -107
  38. data/lib/data_mapper/context.rb +0 -112
  39. data/lib/data_mapper/database.rb +0 -234
  40. data/lib/data_mapper/dependency_queue.rb +0 -28
  41. data/lib/data_mapper/embedded_value.rb +0 -145
  42. data/lib/data_mapper/identity_map.rb +0 -47
  43. data/lib/data_mapper/is/tree.rb +0 -121
  44. data/lib/data_mapper/migration.rb +0 -155
  45. data/lib/data_mapper/persistence.rb +0 -852
  46. data/lib/data_mapper/property.rb +0 -310
  47. data/lib/data_mapper/query.rb +0 -164
  48. data/lib/data_mapper/support/blank.rb +0 -35
  49. data/lib/data_mapper/support/connection_pool.rb +0 -117
  50. data/lib/data_mapper/support/enumerable.rb +0 -35
  51. data/lib/data_mapper/support/errors.rb +0 -16
  52. data/lib/data_mapper/support/inflector.rb +0 -265
  53. data/lib/data_mapper/support/object.rb +0 -54
  54. data/lib/data_mapper/support/serialization.rb +0 -96
  55. data/lib/data_mapper/support/silence.rb +0 -10
  56. data/lib/data_mapper/support/string.rb +0 -72
  57. data/lib/data_mapper/support/struct.rb +0 -7
  58. data/lib/data_mapper/support/symbol.rb +0 -82
  59. data/lib/data_mapper/support/typed_set.rb +0 -65
  60. data/lib/data_mapper/types/base.rb +0 -44
  61. data/lib/data_mapper/types/string.rb +0 -34
  62. data/lib/data_mapper/validatable_extensions/errors.rb +0 -12
  63. data/lib/data_mapper/validatable_extensions/macros.rb +0 -7
  64. data/lib/data_mapper/validatable_extensions/validatable_instance_methods.rb +0 -62
  65. data/lib/data_mapper/validatable_extensions/validation_base.rb +0 -18
  66. data/lib/data_mapper/validatable_extensions/validations/formats/email.rb +0 -43
  67. data/lib/data_mapper/validatable_extensions/validations/validates_acceptance_of.rb +0 -7
  68. data/lib/data_mapper/validatable_extensions/validations/validates_confirmation_of.rb +0 -7
  69. data/lib/data_mapper/validatable_extensions/validations/validates_each.rb +0 -7
  70. data/lib/data_mapper/validatable_extensions/validations/validates_format_of.rb +0 -28
  71. data/lib/data_mapper/validatable_extensions/validations/validates_length_of.rb +0 -15
  72. data/lib/data_mapper/validatable_extensions/validations/validates_numericality_of.rb +0 -7
  73. data/lib/data_mapper/validatable_extensions/validations/validates_presence_of.rb +0 -7
  74. data/lib/data_mapper/validatable_extensions/validations/validates_true_for.rb +0 -7
  75. data/lib/data_mapper/validatable_extensions/validations/validates_uniqueness_of.rb +0 -40
  76. data/lib/data_mapper/validations.rb +0 -20
  77. data/lib/data_mapper/validations/number_validator.rb +0 -40
  78. data/lib/data_mapper/validations/string_validator.rb +0 -20
  79. data/lib/data_mapper/validations/validator.rb +0 -13
  80. data/performance.rb +0 -307
  81. data/plugins/can_has_sphinx/LICENSE +0 -23
  82. data/plugins/can_has_sphinx/README +0 -4
  83. data/plugins/can_has_sphinx/REVISION +0 -1
  84. data/plugins/can_has_sphinx/Rakefile +0 -22
  85. data/plugins/can_has_sphinx/init.rb +0 -1
  86. data/plugins/can_has_sphinx/install.rb +0 -1
  87. data/plugins/can_has_sphinx/lib/acts_as_sphinx.rb +0 -123
  88. data/plugins/can_has_sphinx/lib/sphinx.rb +0 -460
  89. data/plugins/can_has_sphinx/scripts/sphinx.sh +0 -47
  90. data/plugins/can_has_sphinx/tasks/acts_as_sphinx_tasks.rake +0 -41
  91. data/profile_data_mapper.rb +0 -40
  92. data/rakefile.rb +0 -159
  93. data/spec/acts_as_tree_spec.rb +0 -67
  94. data/spec/adapters/data_object_adapter_spec.rb +0 -31
  95. data/spec/associations/belongs_to_association_spec.rb +0 -98
  96. data/spec/associations/has_and_belongs_to_many_association_spec.rb +0 -377
  97. data/spec/associations/has_many_association_spec.rb +0 -337
  98. data/spec/attributes_spec.rb +0 -52
  99. data/spec/auto_migrations_spec.rb +0 -101
  100. data/spec/callbacks_spec.rb +0 -186
  101. data/spec/can_has_sphinx.rb +0 -5
  102. data/spec/coersion_spec.rb +0 -41
  103. data/spec/column_spec.rb +0 -114
  104. data/spec/count_command_spec.rb +0 -45
  105. data/spec/database_spec.rb +0 -18
  106. data/spec/dataobjects_spec.rb +0 -27
  107. data/spec/delete_command_spec.rb +0 -11
  108. data/spec/dependency_spec.rb +0 -29
  109. data/spec/embedded_value_spec.rb +0 -161
  110. data/spec/fixtures/animals.yaml +0 -33
  111. data/spec/fixtures/animals_exhibits.yaml +0 -2
  112. data/spec/fixtures/careers.yaml +0 -5
  113. data/spec/fixtures/comments.yaml +0 -1
  114. data/spec/fixtures/exhibits.yaml +0 -90
  115. data/spec/fixtures/fruit.yaml +0 -6
  116. data/spec/fixtures/people.yaml +0 -37
  117. data/spec/fixtures/posts.yaml +0 -3
  118. data/spec/fixtures/projects.yaml +0 -13
  119. data/spec/fixtures/sections.yaml +0 -5
  120. data/spec/fixtures/serializers.yaml +0 -6
  121. data/spec/fixtures/tasks.yaml +0 -6
  122. data/spec/fixtures/tasks_tasks.yaml +0 -2
  123. data/spec/fixtures/tomatoes.yaml +0 -1
  124. data/spec/fixtures/users.yaml +0 -1
  125. data/spec/fixtures/zoos.yaml +0 -24
  126. data/spec/is_a_tree_spec.rb +0 -149
  127. data/spec/legacy_spec.rb +0 -16
  128. data/spec/load_command_spec.rb +0 -322
  129. data/spec/magic_columns_spec.rb +0 -26
  130. data/spec/migration_spec.rb +0 -267
  131. data/spec/mock_adapter.rb +0 -20
  132. data/spec/models/animal.rb +0 -12
  133. data/spec/models/candidate.rb +0 -8
  134. data/spec/models/career.rb +0 -7
  135. data/spec/models/chain.rb +0 -8
  136. data/spec/models/comment.rb +0 -6
  137. data/spec/models/exhibit.rb +0 -14
  138. data/spec/models/fence.rb +0 -7
  139. data/spec/models/fruit.rb +0 -8
  140. data/spec/models/job.rb +0 -8
  141. data/spec/models/person.rb +0 -30
  142. data/spec/models/post.rb +0 -14
  143. data/spec/models/project.rb +0 -41
  144. data/spec/models/sales_person.rb +0 -5
  145. data/spec/models/section.rb +0 -8
  146. data/spec/models/serializer.rb +0 -5
  147. data/spec/models/task.rb +0 -9
  148. data/spec/models/tomato.rb +0 -27
  149. data/spec/models/user.rb +0 -12
  150. data/spec/models/zoo.rb +0 -13
  151. data/spec/natural_key_spec.rb +0 -36
  152. data/spec/paranoia_spec.rb +0 -38
  153. data/spec/persistence_spec.rb +0 -479
  154. data/spec/postgres_spec.rb +0 -96
  155. data/spec/property_spec.rb +0 -151
  156. data/spec/query_spec.rb +0 -77
  157. data/spec/save_command_spec.rb +0 -94
  158. data/spec/schema_spec.rb +0 -8
  159. data/spec/serialize_spec.rb +0 -19
  160. data/spec/single_table_inheritance_spec.rb +0 -43
  161. data/spec/spec_helper.rb +0 -45
  162. data/spec/support/blank_spec.rb +0 -8
  163. data/spec/support/inflector_spec.rb +0 -41
  164. data/spec/support/object_spec.rb +0 -9
  165. data/spec/support/serialization_spec.rb +0 -61
  166. data/spec/support/silence_spec.rb +0 -15
  167. data/spec/support/string_spec.rb +0 -7
  168. data/spec/support/struct_spec.rb +0 -12
  169. data/spec/support/typed_set_spec.rb +0 -66
  170. data/spec/symbolic_operators_spec.rb +0 -27
  171. data/spec/table_spec.rb +0 -79
  172. data/spec/types/string.rb +0 -81
  173. data/spec/validates_confirmation_of_spec.rb +0 -55
  174. data/spec/validates_format_of_spec.rb +0 -78
  175. data/spec/validates_length_of_spec.rb +0 -117
  176. data/spec/validates_uniqueness_of_spec.rb +0 -92
  177. data/spec/validations/number_validator.rb +0 -59
  178. data/spec/validations/string_validator.rb +0 -14
  179. data/spec/validations_spec.rb +0 -141
  180. data/tasks/fixtures.rb +0 -53
@@ -1,12 +0,0 @@
1
- module Validatable
2
- class Errors
3
- def on(attribute)
4
- raw(attribute)
5
- end
6
-
7
- def full_messages
8
- errors.values.flatten.compact
9
- end
10
-
11
- end
12
- end
@@ -1,7 +0,0 @@
1
- module Validatable
2
- module Macros
3
- def validates_uniqueness_of(*args)
4
- add_validations(args, ValidatesUniquenessOf)
5
- end
6
- end
7
- end
@@ -1,62 +0,0 @@
1
- # = Validations
2
- # DataMapper uses the 'Validatable' gem to validate models.
3
- #
4
- # Example:
5
- # class Person < DataMapper::Base
6
- # property :name, :string
7
- # property :email, :string
8
- # property :password, :string
9
- #
10
- # validates_presence_of :name, :email
11
- # validates_length_of :password, :minimum => 6, :on => :create
12
- # validates_format_of :email, :with => :email_address, :message => 'Please provide a valid email address.'
13
- # end
14
- #
15
- # p = Person.new
16
- # p.valid? #=> false
17
- # p.errors.full_messages #=> ["Email must not be blank", "Please provide a valid email address.", "Name must not be blank"]
18
- #
19
- # p.save #=> false
20
- # p.errors.full_messages #=> ["Password must be more than 5 characters long", "Email must not be blank",
21
- # "Please provide a valid email address.", "Name must not be blank"]
22
- #
23
- #
24
-
25
- module Validatable
26
- alias_method :valid_in_all_cases?, :valid? #:nodoc:
27
-
28
- # Returns true if no errors were added otherwise false. Only executes validations that have no :groups option specified
29
- def valid?(event = :validate)
30
- validate_recursively(event, Set.new)
31
- end
32
-
33
- #TODO should callbacks really affect the flow? shouldn't validations themselves do that?
34
- def validate_recursively(event, cleared) #:nodoc:
35
- return true if cleared.include?(self)
36
- cleared << self
37
-
38
- self.class.callbacks.execute(:before_validation, self)
39
-
40
- # Validatable clears the errors list when running valid_for_some_group?, so we save general errors
41
- # and then merge them back in after we've validated for events
42
- generally_valid = valid_for_group?(nil)
43
- general_errors = self.errors.errors.dup
44
-
45
- if respond_to?(:"valid_for_#{event}?")
46
- valid_for_events = send(:"valid_for_#{event}?")
47
- self.errors.errors.merge!(general_errors) {|key, val1, val2| val1+val2 }
48
- return false unless generally_valid && valid_for_events
49
- end
50
-
51
- return false unless generally_valid
52
-
53
- if self.respond_to?(:loaded_associations)
54
- return false unless self.loaded_associations.all? do |association|
55
- association.validate_recursively(event, cleared)
56
- end
57
- end
58
-
59
- self.class.callbacks.execute(:after_validation, self)
60
- return true
61
- end
62
- end
@@ -1,18 +0,0 @@
1
- module Validatable
2
- class ValidationBase
3
- alias_method :old_init, :initialize
4
-
5
- DEFAULT_EVENTS = [:validate, :create, :save, :update]
6
-
7
- def initialize(klass, attribute, options={})
8
- events = [options.delete(:on)].flatten.compact + [options.delete(:event)].flatten.compact
9
- raise ArgumentError.new("Events must be one of #{DEFAULT_EVENTS.inspect}") unless (events & DEFAULT_EVENTS).size == events.size
10
- options[:groups] ||= events unless events.empty? ### <- Danger will robinson
11
- old_init(klass, attribute, options)
12
- end
13
-
14
- def humanized_attribute
15
- @humanized_attribute ||= Inflector.humanize(self.attribute.to_s)
16
- end
17
- end
18
- end
@@ -1,43 +0,0 @@
1
- module Validatable
2
- module Helpers #:nodoc:
3
- module Formats #:nodoc:
4
-
5
- # Allows you to validate fields as email addresses
6
- # validates_format_of :email_field, :with => :email_address
7
-
8
- module Email
9
-
10
- def self.included(base)
11
- base::FORMATS.merge!( :email_address => [ EmailAddress,
12
- lambda { |attribute| lambda { "%s is not a valid email address".t(self.send(attribute)) } }] )
13
- end
14
-
15
- EmailAddress = begin
16
- alpha = "a-zA-Z"
17
- digit = "0-9"
18
- atext = "[#{alpha}#{digit}\!\#\$\%\&\'\*+\/\=\?\^\_\`\{\|\}\~\-]"
19
- dot_atom_text = "#{atext}+([.]#{atext}*)*"
20
- dot_atom = "#{dot_atom_text}"
21
- qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'
22
- text = "[\\x01-\\x09\\x11\\x12\\x14-\\x7f]"
23
- quoted_pair = "(\\x5c#{text})"
24
- qcontent = "(?:#{qtext}|#{quoted_pair})"
25
- quoted_string = "[\"]#{qcontent}+[\"]"
26
- atom = "#{atext}+"
27
- word = "(?:#{atom}|#{quoted_string})"
28
- obs_local_part = "#{word}([.]#{word})*"
29
- local_part = "(?:#{dot_atom}|#{quoted_string}|#{obs_local_part})"
30
- no_ws_ctl = "\\x01-\\x08\\x11\\x12\\x14-\\x1f\\x7f"
31
- dtext = "[#{no_ws_ctl}\\x21-\\x5a\\x5e-\\x7e]"
32
- dcontent = "(?:#{dtext}|#{quoted_pair})"
33
- domain_literal = "\\[#{dcontent}+\\]"
34
- obs_domain = "#{atom}([.]#{atom})*"
35
- domain = "(?:#{dot_atom}|#{domain_literal}|#{obs_domain})"
36
- addr_spec = "#{local_part}\@#{domain}"
37
- pattern = /^#{addr_spec}$/
38
- end
39
-
40
- end
41
- end
42
- end
43
- end
@@ -1,7 +0,0 @@
1
- module Validatable
2
- class ValidatesAcceptanceOf < ValidationBase
3
- def message(instance)
4
- super || '%s must be accepted'.t(humanized_attribute)
5
- end
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- module Validatable
2
- class ValidatesConfirmationOf < ValidationBase
3
- def message(instance)
4
- super || "%s does not match the confirmation".t(humanized_attribute)
5
- end
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- module Validatable
2
- class ValidatesEach < ValidationBase
3
- def message(instance)
4
- super || '%s is invalid'.t(humanized_attribute)
5
- end
6
- end
7
- end
@@ -1,28 +0,0 @@
1
- require File.dirname(__FILE__) + '/formats/email.rb'
2
-
3
- module Validatable
4
-
5
- class ValidatesFormatOf < ValidationBase
6
- FORMATS = {}
7
-
8
- include Validatable::Helpers::Formats::Email
9
-
10
- def initialize(klass, attribute, options={})
11
- super
12
- if with.is_a? Symbol
13
- self.with = if FORMATS[with].is_a? Array
14
- @message = (FORMATS[with][1].respond_to?(:call) ? FORMATS[with][1].call(attribute) : FORMATS[with][1]) unless @message
15
- FORMATS[with][0]
16
- else
17
- FORMATS[with]
18
- end
19
- end
20
- end
21
-
22
- def message(instance)
23
- super || '%s is invalid'.t(humanized_attribute)
24
- end
25
-
26
- end
27
-
28
- end
@@ -1,15 +0,0 @@
1
- module Validatable
2
- class ValidatesLengthOf < ValidationBase
3
- def message(instance)
4
- super || unless minimum.nil?
5
- '%s must be more than %d characters long'.t(humanized_attribute, minimum-1)
6
- else unless maximum.nil?
7
- '%s must be less than %d characters long'.t(humanized_attribute, maximum+1)
8
- else unless is.nil?
9
- '%s must be %d characters long'.t(humanized_attribute, is)
10
- else unless within.nil?
11
- '%s must be between %d and %d characters long'.t(humanized_attribute, within.first, within.last)
12
- end;end;end;end
13
- end
14
- end
15
- end
@@ -1,7 +0,0 @@
1
- module Validatable
2
- class ValidatesNumericalityOf < ValidationBase
3
- def message(instance)
4
- super || '%s must be a number'.t(humanized_attribute)
5
- end
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- module Validatable
2
- class ValidatesPresenceOf < ValidationBase
3
- def message(instance)
4
- super || "%s must not be blank".t(humanized_attribute)
5
- end
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- module Validatable
2
- class ValidatesTrueFor < ValidationBase
3
- def message(instance)
4
- super || '%s must be true'.t(humanized_attribute)
5
- end
6
- end
7
- end
@@ -1,40 +0,0 @@
1
- module Validatable
2
- class ValidatesUniquenessOf < ValidationBase
3
- option :scope, :allow_nil, :case_sensitive
4
-
5
- def message(instance)
6
- super || '%s has already been taken'.t(humanized_attribute)
7
- end
8
-
9
- def case_sensitive?
10
- case_sensitive
11
- end
12
-
13
- def valid?(instance)
14
- value = instance.send(self.attribute)
15
- return true if allow_nil && value.nil?
16
-
17
- finder_options = if case_sensitive?
18
- { self.attribute => value }
19
- else
20
- { self.attribute.like => value }
21
- end
22
-
23
- if scope
24
- if scope.kind_of?(Array) # if scope is larger than just one property, check them all
25
- scope.each do |scope_property|
26
- scope_value = instance.send(scope_property)
27
- finder_options.merge! scope_property => scope_value
28
- end
29
- else
30
- scope_value = instance.send(scope)
31
- finder_options.merge! scope => scope_value
32
- end
33
- end
34
-
35
- finder_options.merge!({ instance.database_context.table(instance.class).key.name.not => instance.key }) unless instance.new_record?
36
- instance.database_context.first(instance.class, finder_options).nil?
37
- end
38
- end
39
-
40
- end
@@ -1,20 +0,0 @@
1
- Dir[File.dirname(__FILE__) + "/validatable_extensions/**/*.rb"].each do |path|
2
- require path
3
- end
4
-
5
- #--
6
- # TODO:
7
- # implement alias_option method for all validations (so we can set :with == :as)
8
- # make validations orthogonal with allow_nil default to true
9
- #
10
- module DataMapper
11
- module Validations
12
-
13
- def self.included(base) #:nodoc:
14
- base.class_eval do
15
- include Validatable
16
- end
17
- end
18
-
19
- end
20
- end
@@ -1,40 +0,0 @@
1
- require 'data_mapper/validations/validator'
2
-
3
- module DataMapper
4
- module Validations
5
- class NumberValidator < Validator
6
- def <(max)
7
- @max_excl = max
8
- end
9
-
10
- def <=(max)
11
- @max_incl = max
12
- end
13
-
14
- def >(min)
15
- @min_excl = min
16
- end
17
-
18
- def >=(min)
19
- @min_incl = min
20
- end
21
-
22
- def between(range)
23
- @range = range
24
- end
25
-
26
- def errors_for(target)
27
- errors = []
28
- error = nil
29
-
30
- errors << Validator::Error.new(@max_excl, target) if @max_excl && target >= @max_excl
31
- errors << Validator::Error.new(@max_incl, target) if @max_incl && target > @max_incl
32
- errors << Validator::Error.new(@min_excl, target) if @min_excl && target <= @min_excl
33
- errors << Validator::Error.new(@min_incl, target) if @min_incl && target < @min_incl
34
- errors << Validator::Error.new(@range, target) if @range && ! @range.include?(target)
35
-
36
- errors
37
- end
38
- end
39
- end
40
- end
@@ -1,20 +0,0 @@
1
- require 'data_mapper/validations/validator'
2
-
3
- module DataMapper
4
- module Validations
5
- class StringValidator < Validator
6
- def matches(regexp)
7
- @regexp = regexp
8
- end
9
-
10
- def errors_for(target)
11
- errors = []
12
-
13
- errors << Validator::Error.new(@regexp, target) if @regexp && @regexp.match(target)
14
-
15
- errors
16
- end
17
- end
18
- end
19
- end
20
-
@@ -1,13 +0,0 @@
1
- module DataMapper
2
- module Validations
3
- class Validator
4
- Error = Struct.new(:expected, :got)
5
-
6
- def errors_for(target)
7
- raise NotImplementedError.new
8
- end
9
- end
10
- end
11
- end
12
-
13
-
@@ -1,307 +0,0 @@
1
- require 'benchmark'
2
- require 'active_record'
3
-
4
- socket_file = [
5
- "/opt/local/var/run/mysql5/mysqld.sock",
6
- "tmp/mysqld.sock",
7
- "tmp/mysql.sock"
8
- ].find { |path| File.exists?(path) }
9
-
10
- configuration_options = {
11
- :adapter => 'mysql',
12
- :username => 'root',
13
- :password => '',
14
- :database => 'data_mapper_1'
15
- }
16
-
17
- configuration_options[:socket] = socket_file unless socket_file.nil?
18
-
19
- ActiveRecord::Base.establish_connection(configuration_options)
20
-
21
- ActiveRecord::Base.find_by_sql('SELECT 1')
22
-
23
- class ARAnimal < ActiveRecord::Base #:nodoc:
24
- set_table_name 'animals'
25
- end
26
-
27
- class ARPerson < ActiveRecord::Base #:nodoc:
28
- set_table_name 'people'
29
- end
30
-
31
- require 'lib/data_mapper'
32
-
33
- DataMapper::Database.setup(configuration_options)
34
-
35
- class DMAnimal < DataMapper::Base #:nodoc:
36
- set_table_name 'animals'
37
- property :name, :string
38
- property :notes, :text
39
- end
40
-
41
- class DMPerson < DataMapper::Base #:nodoc:
42
- set_table_name 'people'
43
- property :name, :string
44
- property :age, :integer
45
- property :occupation, :string
46
- property :type, :class
47
- property :notes, :text
48
- property :date_of_birth, :date
49
-
50
- embed :address, :prefix => true do
51
- property :street, :string
52
- property :city, :string
53
- property :state, :string, :size => 2
54
- property :zip_code, :string, :size => 10
55
-
56
- def city_state_zip_code
57
- "#{city}, #{state} #{zip_code}"
58
- end
59
-
60
- def to_s
61
- "#{street}\n#{city_state_zip_code}"
62
- end
63
- end
64
-
65
- end
66
-
67
- class Exhibit < DataMapper::Base #:nodoc:
68
- property :name, :string
69
- belongs_to :zoo
70
- end
71
-
72
- class Zoo < DataMapper::Base #:nodoc:
73
- property :name, :string
74
- property :notes, :text
75
- has_many :exhibits
76
- end
77
-
78
- class ARZoo < ActiveRecord::Base #:nodoc:
79
- set_table_name 'zoos'
80
- has_many :exhibits, :class_name => 'ARExhibit', :foreign_key => 'zoo_id'
81
- end
82
-
83
- class ARExhibit < ActiveRecord::Base #:nodoc:
84
- set_table_name 'exhibits'
85
- belongs_to :zoo, :class_name => 'ARZoo', :foreign_key => 'zoo_id'
86
- end
87
-
88
- N = (ENV['N'] || 1000).to_i
89
-
90
- # 4.times do
91
- # [DMAnimal, Zoo, Exhibit].each do |klass|
92
- # klass.all.each do |instance|
93
- # klass.create(instance.attributes.reject { |k,v| k == :id })
94
- # end
95
- # end
96
- # end
97
-
98
- Benchmark::send(ENV['BM'] || :bmbm, 40) do |x|
99
-
100
- x.report('ActiveRecord:id') do
101
- N.times { ARAnimal.find(1).name }
102
- end
103
-
104
- x.report('ActiveRecord:id:raw_result-set') do
105
- connection = ARAnimal.connection
106
-
107
- N.times do
108
- result = connection.execute("SELECT name FROM animals WHERE id = 1")
109
- result.each do |row|
110
- nil
111
- end
112
- result.free if result.respond_to?(:free)
113
- end
114
- end
115
-
116
- x.report('DataMapper:id') do
117
- N.times { DMAnimal[1].name }
118
- end
119
-
120
- x.report('DataMapper:id:in-session') do
121
- database do
122
- N.times { DMAnimal[1].name }
123
- end
124
- end
125
-
126
- x.report('DataMapper:id:raw-result-set') do
127
- database.adapter.connection do |db|
128
- N.times do
129
- command = db.create_command("SELECT name FROM animals WHERE id = 1")
130
-
131
- command.execute_reader do |reader|
132
- reader.each { reader.current_row }
133
- end
134
- end
135
- end
136
- end
137
-
138
- x.report('ActiveRecord:all') do
139
- N.times { ARZoo.find(:all).each { |a| a.name } }
140
- end
141
-
142
- x.report('DataMapper:all') do
143
- N.times { Zoo.all.each { |a| a.name } }
144
- end
145
-
146
- x.report('DataMapper:all:in-session') do
147
- database do
148
- N.times { Zoo.all.each { |a| a.name } }
149
- end
150
- end
151
-
152
- x.report('ActiveRecord:conditions') do
153
- N.times { ARZoo.find(:first, :conditions => ['name = ?', 'Galveston']).name }
154
- end
155
-
156
- x.report('DataMapper:conditions:short') do
157
- N.times { Zoo.first(:name => 'Galveston').name }
158
- end
159
-
160
- x.report('DataMapper:conditions:short:in-session') do
161
- database do
162
- N.times { Zoo.first(:name => 'Galveston').name }
163
- end
164
- end
165
-
166
- x.report('DataMapper:conditions:long') do
167
- N.times { Zoo.find(:first, :conditions => ['name = ?', 'Galveston']).name }
168
- end
169
-
170
- x.report('DataMapper:conditions:long:in-session') do
171
- database do
172
- N.times { Zoo.find(:first, :conditions => ['name = ?', 'Galveston']).name }
173
- end
174
- end
175
-
176
- people = [
177
- ['Sam', 29, 'Programmer', 'A slow text field'],
178
- ['Amy', 28, 'Business Analyst Manager', 'A slow text field'],
179
- ['Scott', 25, 'Programmer', 'A slow text field'],
180
- ['Josh', 23, 'Supervisor', 'A slow text field'],
181
- ['Bob', 40, 'Peon', 'A slow text field']
182
- ]
183
-
184
- DMPerson.truncate!
185
-
186
- x.report('ActiveRecord:insert') do
187
- N.times do
188
- people.each do |a|
189
- ARPerson::create(:name => a[0], :age => a[1], :occupation => a[2], :notes => a[3])
190
- end
191
- end
192
- end
193
-
194
- DMPerson.truncate!
195
-
196
- x.report('DataMapper:insert') do
197
- N.times do
198
- people.each do |a|
199
- DMPerson::create(:name => a[0], :age => a[1], :occupation => a[2], :notes => a[3])
200
- end
201
- end
202
- end
203
-
204
- x.report('ActiveRecord:update') do
205
- N.times do
206
- bob = ARAnimal.find(:first, :conditions => ["name = ?", 'Elephant'])
207
- bob.name
208
- bob.notes = 'Updated by ActiveRecord'
209
- bob.save
210
- end
211
- end
212
-
213
- x.report('DataMapper:update') do
214
- N.times do
215
- bob = DMAnimal.first(:name => 'Elephant')
216
- bob.name
217
- bob.notes = 'Updated by DataMapper'
218
- bob.save
219
- end
220
- end
221
-
222
- x.report('ActiveRecord:associations:lazy') do
223
- N.times do
224
- zoos = ARZoo.find(:all)
225
- zoos.each { |zoo| zoo.name; zoo.exhibits.entries }
226
- end
227
- end
228
-
229
- x.report('ActiveRecord:associations:included') do
230
- N.times do
231
- zoos = ARZoo.find(:all, :include => [:exhibits])
232
- zoos.each { |zoo| zoo.name; zoo.exhibits.entries }
233
- end
234
- end
235
-
236
- x.report('DataMapper:associations') do
237
- N.times do
238
- Zoo.all.each { |zoo| zoo.name; zoo.exhibits.entries }
239
- end
240
- end
241
-
242
- x.report('DataMapper:associations:in-session') do
243
- database do
244
- N.times do
245
- Zoo.all.each { |zoo| zoo.name; zoo.exhibits.entries }
246
- end
247
- end
248
- end
249
-
250
- x.report('ActiveRecord:find_by_sql') do
251
- N.times do
252
- ARZoo.find_by_sql("SELECT * FROM zoos").each { |z| z.name }
253
- end
254
- end
255
-
256
- x.report('DataMapper:find_by_sql') do
257
- N.times do
258
- database.query("SELECT * FROM zoos").each { |z| z.name }
259
- end
260
- end
261
-
262
- x.report('DataMapper:raw-query') do
263
- N.times do
264
- database.adapter.connection do |db|
265
-
266
- command = db.create_command("SELECT * FROM zoos")
267
-
268
- command.execute_reader do |reader|
269
- reader.each { reader.current_row }
270
- end
271
- end
272
- end
273
- end
274
-
275
- x.report('ActiveRecord:accessors') do
276
- person = ARPerson.find(:first)
277
-
278
- N.times do
279
- <<-VCARD
280
- #{person.name} (#{person.age})
281
- #{person.occupation}
282
-
283
- #{person.address_street}
284
- #{person.address_city}, #{person.address_state} #{person.address_zip_code}
285
-
286
- #{person.notes}
287
- VCARD
288
- end
289
- end
290
-
291
- x.report('DataMapper:accessors') do
292
- person = DMPerson.first
293
-
294
- N.times do
295
- <<-VCARD
296
- #{person.name} (#{person.age})
297
- #{person.occupation}
298
-
299
- #{person.address}
300
-
301
- #{person.notes}
302
- VCARD
303
- end
304
- end
305
-
306
-
307
- end