mack-data_mapper 0.8.1 → 0.8.2

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 (166) hide show
  1. data/lib/gems/addressable-2.0.0/lib/addressable/idna.rb +4867 -0
  2. data/lib/gems/addressable-2.0.0/lib/addressable/uri.rb +2469 -0
  3. data/lib/gems/addressable-2.0.0/lib/addressable/version.rb +35 -0
  4. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/adapters/data_objects_adapter.rb +85 -0
  5. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/aggregate_functions.rb +201 -0
  6. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/collection.rb +11 -0
  7. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/model.rb +11 -0
  8. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/repository.rb +7 -0
  9. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/support/symbol.rb +21 -0
  10. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates/version.rb +7 -0
  11. data/lib/gems/dm-aggregates-0.9.7/lib/dm-aggregates.rb +15 -0
  12. data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/abstract_adapter.rb +209 -0
  13. data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/data_objects_adapter.rb +709 -0
  14. data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/in_memory_adapter.rb +87 -0
  15. data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/mysql_adapter.rb +136 -0
  16. data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/postgres_adapter.rb +188 -0
  17. data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters/sqlite3_adapter.rb +105 -0
  18. data/lib/gems/dm-core-0.9.7/lib/dm-core/adapters.rb +22 -0
  19. data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/many_to_many.rb +147 -0
  20. data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/many_to_one.rb +107 -0
  21. data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/one_to_many.rb +318 -0
  22. data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/one_to_one.rb +61 -0
  23. data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/relationship.rb +223 -0
  24. data/lib/gems/dm-core-0.9.7/lib/dm-core/associations/relationship_chain.rb +81 -0
  25. data/lib/gems/dm-core-0.9.7/lib/dm-core/associations.rb +200 -0
  26. data/lib/gems/dm-core-0.9.7/lib/dm-core/auto_migrations.rb +105 -0
  27. data/lib/gems/dm-core-0.9.7/lib/dm-core/collection.rb +642 -0
  28. data/lib/gems/dm-core-0.9.7/lib/dm-core/dependency_queue.rb +32 -0
  29. data/lib/gems/dm-core-0.9.7/lib/dm-core/hook.rb +11 -0
  30. data/lib/gems/dm-core-0.9.7/lib/dm-core/identity_map.rb +42 -0
  31. data/lib/gems/dm-core-0.9.7/lib/dm-core/is.rb +16 -0
  32. data/lib/gems/dm-core-0.9.7/lib/dm-core/logger.rb +232 -0
  33. data/lib/gems/dm-core-0.9.7/lib/dm-core/migrations/destructive_migrations.rb +17 -0
  34. data/lib/gems/dm-core-0.9.7/lib/dm-core/migrator.rb +29 -0
  35. data/lib/gems/dm-core-0.9.7/lib/dm-core/model.rb +488 -0
  36. data/lib/gems/dm-core-0.9.7/lib/dm-core/naming_conventions.rb +84 -0
  37. data/lib/gems/dm-core-0.9.7/lib/dm-core/property.rb +663 -0
  38. data/lib/gems/dm-core-0.9.7/lib/dm-core/property_set.rb +169 -0
  39. data/lib/gems/dm-core-0.9.7/lib/dm-core/query.rb +628 -0
  40. data/lib/gems/dm-core-0.9.7/lib/dm-core/repository.rb +159 -0
  41. data/lib/gems/dm-core-0.9.7/lib/dm-core/resource.rb +637 -0
  42. data/lib/gems/dm-core-0.9.7/lib/dm-core/scope.rb +58 -0
  43. data/lib/gems/dm-core-0.9.7/lib/dm-core/support/array.rb +13 -0
  44. data/lib/gems/dm-core-0.9.7/lib/dm-core/support/assertions.rb +8 -0
  45. data/lib/gems/dm-core-0.9.7/lib/dm-core/support/errors.rb +23 -0
  46. data/lib/gems/dm-core-0.9.7/lib/dm-core/support/kernel.rb +11 -0
  47. data/lib/gems/dm-core-0.9.7/lib/dm-core/support/symbol.rb +41 -0
  48. data/lib/gems/dm-core-0.9.7/lib/dm-core/support.rb +7 -0
  49. data/lib/gems/dm-core-0.9.7/lib/dm-core/transaction.rb +267 -0
  50. data/lib/gems/dm-core-0.9.7/lib/dm-core/type.rb +160 -0
  51. data/lib/gems/dm-core-0.9.7/lib/dm-core/type_map.rb +80 -0
  52. data/lib/gems/dm-core-0.9.7/lib/dm-core/types/boolean.rb +7 -0
  53. data/lib/gems/dm-core-0.9.7/lib/dm-core/types/discriminator.rb +34 -0
  54. data/lib/gems/dm-core-0.9.7/lib/dm-core/types/object.rb +24 -0
  55. data/lib/gems/dm-core-0.9.7/lib/dm-core/types/paranoid_boolean.rb +34 -0
  56. data/lib/gems/dm-core-0.9.7/lib/dm-core/types/paranoid_datetime.rb +33 -0
  57. data/lib/gems/dm-core-0.9.7/lib/dm-core/types/serial.rb +9 -0
  58. data/lib/gems/dm-core-0.9.7/lib/dm-core/types/text.rb +10 -0
  59. data/lib/gems/dm-core-0.9.7/lib/dm-core/types.rb +19 -0
  60. data/lib/gems/dm-core-0.9.7/lib/dm-core/version.rb +3 -0
  61. data/lib/gems/dm-core-0.9.7/lib/dm-core.rb +217 -0
  62. data/lib/gems/dm-core-0.9.7/script/all +5 -0
  63. data/lib/gems/dm-core-0.9.7/script/performance.rb +284 -0
  64. data/lib/gems/dm-core-0.9.7/script/profile.rb +87 -0
  65. data/lib/gems/dm-migrations-0.9.7/lib/dm-migrations/version.rb +5 -0
  66. data/lib/gems/dm-migrations-0.9.7/lib/dm-migrations.rb +1 -0
  67. data/lib/gems/dm-migrations-0.9.7/lib/migration.rb +215 -0
  68. data/lib/gems/dm-migrations-0.9.7/lib/migration_runner.rb +88 -0
  69. data/lib/gems/dm-migrations-0.9.7/lib/spec/example/migration_example_group.rb +73 -0
  70. data/lib/gems/dm-migrations-0.9.7/lib/spec/matchers/migration_matchers.rb +107 -0
  71. data/lib/gems/dm-migrations-0.9.7/lib/sql/column.rb +9 -0
  72. data/lib/gems/dm-migrations-0.9.7/lib/sql/mysql.rb +52 -0
  73. data/lib/gems/dm-migrations-0.9.7/lib/sql/postgresql.rb +78 -0
  74. data/lib/gems/dm-migrations-0.9.7/lib/sql/sqlite3.rb +43 -0
  75. data/lib/gems/dm-migrations-0.9.7/lib/sql/table.rb +19 -0
  76. data/lib/gems/dm-migrations-0.9.7/lib/sql/table_creator.rb +81 -0
  77. data/lib/gems/dm-migrations-0.9.7/lib/sql/table_modifier.rb +53 -0
  78. data/lib/gems/dm-migrations-0.9.7/lib/sql.rb +10 -0
  79. data/lib/gems/dm-observer-0.9.7/lib/dm-observer/version.rb +5 -0
  80. data/lib/gems/dm-observer-0.9.7/lib/dm-observer.rb +91 -0
  81. data/lib/gems/dm-serializer-0.9.7/lib/dm-serializer/version.rb +5 -0
  82. data/lib/gems/dm-serializer-0.9.7/lib/dm-serializer.rb +183 -0
  83. data/lib/gems/dm-timestamps-0.9.7/lib/dm-timestamps/version.rb +5 -0
  84. data/lib/gems/dm-timestamps-0.9.7/lib/dm-timestamps.rb +57 -0
  85. data/lib/gems/dm-types-0.9.7/lib/dm-types/bcrypt_hash.rb +31 -0
  86. data/lib/gems/dm-types-0.9.7/lib/dm-types/csv.rb +28 -0
  87. data/lib/gems/dm-types-0.9.7/lib/dm-types/enum.rb +70 -0
  88. data/lib/gems/dm-types-0.9.7/lib/dm-types/epoch_time.rb +27 -0
  89. data/lib/gems/dm-types-0.9.7/lib/dm-types/file_path.rb +27 -0
  90. data/lib/gems/dm-types-0.9.7/lib/dm-types/flag.rb +61 -0
  91. data/lib/gems/dm-types-0.9.7/lib/dm-types/ip_address.rb +30 -0
  92. data/lib/gems/dm-types-0.9.7/lib/dm-types/json.rb +40 -0
  93. data/lib/gems/dm-types-0.9.7/lib/dm-types/regexp.rb +20 -0
  94. data/lib/gems/dm-types-0.9.7/lib/dm-types/serial.rb +8 -0
  95. data/lib/gems/dm-types-0.9.7/lib/dm-types/slug.rb +37 -0
  96. data/lib/gems/dm-types-0.9.7/lib/dm-types/uri.rb +29 -0
  97. data/lib/gems/dm-types-0.9.7/lib/dm-types/uuid.rb +64 -0
  98. data/lib/gems/dm-types-0.9.7/lib/dm-types/version.rb +5 -0
  99. data/lib/gems/dm-types-0.9.7/lib/dm-types/yaml.rb +36 -0
  100. data/lib/gems/dm-types-0.9.7/lib/dm-types.rb +28 -0
  101. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/absent_field_validator.rb +60 -0
  102. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/acceptance_validator.rb +76 -0
  103. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/auto_validate.rb +153 -0
  104. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/block_validator.rb +60 -0
  105. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/confirmation_validator.rb +80 -0
  106. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/contextual_validators.rb +56 -0
  107. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/custom_validator.rb +72 -0
  108. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/format_validator.rb +97 -0
  109. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/formats/email.rb +40 -0
  110. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/formats/url.rb +20 -0
  111. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/generic_validator.rb +100 -0
  112. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/length_validator.rb +113 -0
  113. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/method_validator.rb +68 -0
  114. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/numeric_validator.rb +83 -0
  115. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/primitive_validator.rb +60 -0
  116. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/required_field_validator.rb +88 -0
  117. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/support/object.rb +5 -0
  118. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/uniqueness_validator.rb +64 -0
  119. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/validation_errors.rb +63 -0
  120. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/version.rb +5 -0
  121. data/lib/gems/dm-validations-0.9.7/lib/dm-validations/within_validator.rb +53 -0
  122. data/lib/gems/dm-validations-0.9.7/lib/dm-validations.rb +234 -0
  123. data/lib/gems/json_pure-1.1.3/GPL +340 -0
  124. data/lib/gems/json_pure-1.1.3/VERSION +1 -0
  125. data/lib/gems/json_pure-1.1.3/bin/edit_json.rb +10 -0
  126. data/lib/gems/json_pure-1.1.3/bin/prettify_json.rb +76 -0
  127. data/lib/gems/json_pure-1.1.3/lib/json/Array.xpm +21 -0
  128. data/lib/gems/json_pure-1.1.3/lib/json/FalseClass.xpm +21 -0
  129. data/lib/gems/json_pure-1.1.3/lib/json/Hash.xpm +21 -0
  130. data/lib/gems/json_pure-1.1.3/lib/json/Key.xpm +73 -0
  131. data/lib/gems/json_pure-1.1.3/lib/json/NilClass.xpm +21 -0
  132. data/lib/gems/json_pure-1.1.3/lib/json/Numeric.xpm +28 -0
  133. data/lib/gems/json_pure-1.1.3/lib/json/String.xpm +96 -0
  134. data/lib/gems/json_pure-1.1.3/lib/json/TrueClass.xpm +21 -0
  135. data/lib/gems/json_pure-1.1.3/lib/json/add/core.rb +135 -0
  136. data/lib/gems/json_pure-1.1.3/lib/json/add/rails.rb +58 -0
  137. data/lib/gems/json_pure-1.1.3/lib/json/common.rb +354 -0
  138. data/lib/gems/json_pure-1.1.3/lib/json/editor.rb +1362 -0
  139. data/lib/gems/json_pure-1.1.3/lib/json/ext.rb +13 -0
  140. data/lib/gems/json_pure-1.1.3/lib/json/json.xpm +1499 -0
  141. data/lib/gems/json_pure-1.1.3/lib/json/pure/generator.rb +394 -0
  142. data/lib/gems/json_pure-1.1.3/lib/json/pure/parser.rb +259 -0
  143. data/lib/gems/json_pure-1.1.3/lib/json/pure.rb +75 -0
  144. data/lib/gems/json_pure-1.1.3/lib/json/version.rb +9 -0
  145. data/lib/gems/json_pure-1.1.3/lib/json.rb +235 -0
  146. data/lib/gems/launchy-0.3.2/bin/launchy +12 -0
  147. data/lib/gems/launchy-0.3.2/lib/launchy/application.rb +163 -0
  148. data/lib/gems/launchy-0.3.2/lib/launchy/browser.rb +85 -0
  149. data/lib/gems/launchy-0.3.2/lib/launchy/command_line.rb +48 -0
  150. data/lib/gems/launchy-0.3.2/lib/launchy/gemspec.rb +53 -0
  151. data/lib/gems/launchy-0.3.2/lib/launchy/specification.rb +133 -0
  152. data/lib/gems/launchy-0.3.2/lib/launchy/version.rb +18 -0
  153. data/lib/gems/launchy-0.3.2/lib/launchy.rb +58 -0
  154. data/lib/gems/uuidtools-1.0.3/lib/uuidtools/version.rb +32 -0
  155. data/lib/gems/uuidtools-1.0.3/lib/uuidtools.rb +648 -0
  156. data/lib/gems.rb +13 -0
  157. data/lib/mack-data_mapper/migration_generator/migration_generator.rb +5 -0
  158. data/lib/mack-data_mapper/migration_generator/templates/db/migrations/%=@migration_name%.rb.template +1 -1
  159. data/lib/mack-data_mapper/model_generator/manifest.yml +3 -3
  160. data/lib/mack-data_mapper/model_generator/model_generator.rb +8 -1
  161. data/lib/mack-data_mapper/model_generator/templates/model.rb.template +1 -1
  162. data/lib/mack-data_mapper/model_generator/templates/rspec.rb.template +1 -1
  163. data/lib/mack-data_mapper/model_generator/templates/test_case.rb.template +1 -1
  164. data/lib/mack-data_mapper.rb +3 -2
  165. data/lib/mack-data_mapper_tasks.rb +7 -0
  166. metadata +235 -86
@@ -0,0 +1,33 @@
1
+ module DataMapper
2
+ module Types
3
+ class ParanoidDateTime < DataMapper::Type(DateTime)
4
+ primitive DateTime
5
+ lazy true
6
+
7
+ def self.bind(property)
8
+ model = property.model
9
+ repository = property.repository
10
+
11
+ model.send(:set_paranoid_property, property.name){DateTime.now}
12
+
13
+ model.class_eval <<-EOS, __FILE__, __LINE__
14
+
15
+ def self.with_deleted
16
+ with_exclusive_scope(#{property.name.inspect}.not => nil) do
17
+ yield
18
+ end
19
+ end
20
+
21
+ def destroy
22
+ self.class.paranoid_properties.each do |name, blk|
23
+ attribute_set(name, blk.call(self))
24
+ end
25
+ save
26
+ end
27
+ EOS
28
+
29
+ model.default_scope(repository.name).update(property.name => nil)
30
+ end
31
+ end # class ParanoidDateTime
32
+ end # module Types
33
+ end # module DataMapper
@@ -0,0 +1,9 @@
1
+ # FIXME: can we alias this to the class Text if it isn't already defined?
2
+ module DataMapper
3
+ module Types
4
+ class Serial < DataMapper::Type
5
+ primitive Integer
6
+ serial true
7
+ end # class Text
8
+ end # module Types
9
+ end # module DataMapper
@@ -0,0 +1,10 @@
1
+ # FIXME: can we alias this to the class Text if it isn't already defined?
2
+ module DataMapper
3
+ module Types
4
+ class Text < DataMapper::Type
5
+ primitive String
6
+ size 65535
7
+ lazy true
8
+ end # class Text
9
+ end # module Types
10
+ end # module DataMapper
@@ -0,0 +1,19 @@
1
+ dir = Pathname(__FILE__).dirname.expand_path / 'types'
2
+
3
+ require dir / 'boolean'
4
+ require dir / 'discriminator'
5
+ require dir / 'text'
6
+ require dir / 'paranoid_datetime'
7
+ require dir / 'paranoid_boolean'
8
+ require dir / 'object'
9
+ require dir / 'serial'
10
+
11
+ unless defined?(DM)
12
+ DM = DataMapper::Types
13
+ end
14
+
15
+ module DataMapper
16
+ module Resource
17
+ include Types
18
+ end # module Resource
19
+ end # module DataMapper
@@ -0,0 +1,3 @@
1
+ module DataMapper
2
+ VERSION = '0.9.7' unless defined?(DataMapper::VERSION)
3
+ end
@@ -0,0 +1,217 @@
1
+ # This file begins the loading sequence.
2
+ #
3
+ # Quick Overview:
4
+ # * Requires fastthread, support libs, and base.
5
+ # * Sets the application root and environment for compatibility with frameworks
6
+ # such as Rails or Merb.
7
+ # * Checks for the database.yml and loads it if it exists.
8
+ # * Sets up the database using the config from the Yaml file or from the
9
+ # environment.
10
+ #
11
+
12
+ require 'date'
13
+ require 'pathname'
14
+ require 'set'
15
+ require 'time'
16
+ require 'yaml'
17
+
18
+ require 'rubygems'
19
+
20
+ gem 'addressable', '~>2.0'
21
+ require 'addressable/uri'
22
+
23
+ gem 'extlib', '~>0.9.8'
24
+ require 'extlib'
25
+ require "extlib/inflection"
26
+
27
+ begin
28
+ require 'fastthread'
29
+ rescue LoadError
30
+ # fastthread not installed
31
+ end
32
+
33
+ dir = Pathname(__FILE__).dirname.expand_path / 'dm-core'
34
+
35
+ require dir / 'support'
36
+ require dir / 'resource'
37
+ require dir / 'model'
38
+
39
+ require dir / 'dependency_queue'
40
+ require dir / 'type'
41
+ require dir / 'type_map'
42
+ require dir / 'types'
43
+ require dir / 'hook'
44
+ require dir / 'associations'
45
+ require dir / 'auto_migrations'
46
+ require dir / 'identity_map'
47
+ require dir / 'logger'
48
+ require dir / 'migrator'
49
+ require dir / 'naming_conventions'
50
+ require dir / 'property_set'
51
+ require dir / 'query'
52
+ require dir / 'transaction'
53
+ require dir / 'repository'
54
+ require dir / 'scope'
55
+ require dir / 'property'
56
+ require dir / 'adapters'
57
+ require dir / 'collection'
58
+ require dir / 'is'
59
+
60
+ # == Setup and Configuration
61
+ # DataMapper uses URIs or a connection hash to connect to your data-store.
62
+ # URI connections takes the form of:
63
+ # DataMapper.setup(:default, 'protocol://username:password@localhost:port/path/to/repo')
64
+ #
65
+ # Breaking this down, the first argument is the name you wish to give this
66
+ # connection. If you do not specify one, it will be assigned :default. If you
67
+ # would like to connect to more than one data-store, simply issue this command
68
+ # again, but with a different name specified.
69
+ #
70
+ # In order to issue ORM commands without specifying the repository context, you
71
+ # must define the :default database. Otherwise, you'll need to wrap your ORM
72
+ # calls in <tt>repository(:name) { }</tt>.
73
+ #
74
+ # Second, the URI breaks down into the access protocol, the username, the
75
+ # server, the password, and whatever path information is needed to properly
76
+ # address the data-store on the server.
77
+ #
78
+ # Here's some examples
79
+ # DataMapper.setup(:default, "sqlite3://path/to/your/project/db/development.db")
80
+ # DataMapper.setup(:default, "mysql://localhost/dm_core_test")
81
+ # # no auth-info
82
+ # DataMapper.setup(:default, "postgres://root:supahsekret@127.0.0.1/dm_core_test")
83
+ # # with auth-info
84
+ #
85
+ #
86
+ # Alternatively, you can supply a hash as the second parameter, which would
87
+ # take the form:
88
+ #
89
+ # DataMapper.setup(:default, {
90
+ # :adapter => 'adapter_name_here',
91
+ # :database => "path/to/repo",
92
+ # :username => 'username',
93
+ # :password => 'password',
94
+ # :host => 'hostname'
95
+ # })
96
+ #
97
+ # === Logging
98
+ # To turn on error logging to STDOUT, issue:
99
+ #
100
+ # DataMapper::Logger.new(STDOUT, 0)
101
+ #
102
+ # You can pass a file location ("/path/to/log/file.log") in place of STDOUT.
103
+ # see DataMapper::Logger for more information.
104
+ #
105
+ module DataMapper
106
+ extend Assertions
107
+
108
+ def self.root
109
+ @root ||= Pathname(__FILE__).dirname.parent.expand_path
110
+ end
111
+
112
+ ##
113
+ # Setups up a connection to a data-store
114
+ #
115
+ # @param Symbol name a name for the context, defaults to :default
116
+ # @param [Hash{Symbol => String}, Addressable::URI, String] uri_or_options
117
+ # connection information
118
+ #
119
+ # @return Repository the resulting setup repository
120
+ #
121
+ # @raise ArgumentError "+name+ must be a Symbol, but was..." indicates that
122
+ # an invalid argument was passed for name[Symbol]
123
+ # @raise [ArgumentError] "+uri_or_options+ must be a Hash, URI or String,
124
+ # but was..." indicates that connection information could not be gleaned
125
+ # from the given uri_or_options<Hash, Addressable::URI, String>
126
+ #
127
+ # -
128
+ # @api public
129
+ def self.setup(name, uri_or_options)
130
+ assert_kind_of 'name', name, Symbol
131
+ assert_kind_of 'uri_or_options', uri_or_options, Addressable::URI, Hash, String
132
+
133
+ case uri_or_options
134
+ when Hash
135
+ adapter_name = uri_or_options[:adapter].to_s
136
+ when String, DataObjects::URI, Addressable::URI
137
+ uri_or_options = DataObjects::URI.parse(uri_or_options) if uri_or_options.kind_of?(String)
138
+ adapter_name = uri_or_options.scheme
139
+ end
140
+
141
+ class_name = Extlib::Inflection.classify(adapter_name) + 'Adapter'
142
+
143
+ unless Adapters::const_defined?(class_name)
144
+ lib_name = "#{Extlib::Inflection.underscore(adapter_name)}_adapter"
145
+ begin
146
+ require root / 'lib' / 'dm-core' / 'adapters' / lib_name
147
+ rescue LoadError => e
148
+ begin
149
+ require lib_name
150
+ rescue Exception
151
+ # library not found, raise the original error
152
+ raise e
153
+ end
154
+ end
155
+ end
156
+
157
+ Repository.adapters[name] = Adapters::const_get(class_name).new(name, uri_or_options)
158
+ end
159
+
160
+ ##
161
+ # Block Syntax
162
+ # Pushes the named repository onto the context-stack,
163
+ # yields a new session, and pops the context-stack.
164
+ #
165
+ # Non-Block Syntax
166
+ # Returns the current session, or if there is none,
167
+ # a new Session.
168
+ #
169
+ # @param [Symbol] args the name of a repository to act within or return, :default is default
170
+ # @yield [Proc] (optional) block to execute within the context of the named repository
171
+ # @demo spec/integration/repository_spec.rb
172
+ def self.repository(name = nil) # :yields: current_context
173
+ current_repository = if name
174
+ raise ArgumentError, "First optional argument must be a Symbol, but was #{args.first.inspect}" unless name.is_a?(Symbol)
175
+ Repository.context.detect { |r| r.name == name } || Repository.new(name)
176
+ else
177
+ Repository.context.last || Repository.new(Repository.default_name)
178
+ end
179
+
180
+ if block_given?
181
+ current_repository.scope { |*block_args| yield(*block_args) }
182
+ else
183
+ current_repository
184
+ end
185
+ end
186
+
187
+ # A logger should always be present. Lets be consistent with DO
188
+ Logger.new(nil, :off)
189
+
190
+ ##
191
+ # destructively migrates the repository upwards to match model definitions
192
+ #
193
+ # @param [Symbol] name repository to act on, :default is the default
194
+ def self.migrate!(name = Repository.default_name)
195
+ repository(name).migrate!
196
+ end
197
+
198
+ ##
199
+ # drops and recreates the repository upwards to match model definitions
200
+ #
201
+ # @param [Symbol] name repository to act on, :default is the default
202
+ def self.auto_migrate!(repository_name = nil)
203
+ AutoMigrator.auto_migrate(repository_name)
204
+ end
205
+
206
+ def self.auto_upgrade!(repository_name = nil)
207
+ AutoMigrator.auto_upgrade(repository_name)
208
+ end
209
+
210
+ def self.prepare(*args, &blk)
211
+ yield repository(*args)
212
+ end
213
+
214
+ def self.dependency_queue
215
+ @dependency_queue ||= DependencyQueue.new
216
+ end
217
+ end
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env sh
2
+ rake spec:unit
3
+ ADAPTER=sqlite3 rake spec:integration
4
+ ADAPTER=mysql rake spec:integration
5
+ ADAPTER=postgres rake spec:integration
@@ -0,0 +1,284 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'dm-core')
4
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'dm-core', 'version')
5
+
6
+ require 'rubygems'
7
+ require 'ftools'
8
+
9
+ # sudo gem install rbench
10
+ # OR git clone git://github.com/somebee/rbench.git , rake install
11
+ gem 'rbench', '>=0.2.2'
12
+ require 'rbench'
13
+
14
+ gem 'faker', '>=0.3.1'
15
+ require 'faker'
16
+
17
+ gem 'activerecord', '>=2.1.0'
18
+ require 'active_record'
19
+
20
+ socket_file = Pathname.glob(%w[
21
+ /opt/local/var/run/mysql5/mysqld.sock
22
+ tmp/mysqld.sock
23
+ /tmp/mysqld.sock
24
+ tmp/mysql.sock
25
+ /tmp/mysql.sock
26
+ /var/mysql/mysql.sock
27
+ /var/run/mysqld/mysqld.sock
28
+ ]).find { |path| path.socket? }
29
+
30
+ configuration_options = {
31
+ :adapter => 'mysql',
32
+ :username => 'root',
33
+ :password => '',
34
+ :database => 'data_mapper_1',
35
+ }
36
+
37
+ configuration_options[:socket] = socket_file unless socket_file.nil?
38
+
39
+ log_dir = DataMapper.root / 'log'
40
+ log_dir.mkdir unless log_dir.directory?
41
+
42
+ DataMapper::Logger.new(log_dir / 'dm.log', :off)
43
+ adapter = DataMapper.setup(:default, "mysql://root@localhost/data_mapper_1?socket=#{socket_file}")
44
+
45
+ if configuration_options[:adapter]
46
+ sqlfile = File.join(File.dirname(__FILE__),'..','tmp','performance.sql')
47
+ mysql_bin = %w[mysql mysql5].select{|bin| `which #{bin}`.length > 0 }
48
+ mysqldump_bin = %w[mysqldump mysqldump5].select{|bin| `which #{bin}`.length > 0 }
49
+ end
50
+
51
+ ActiveRecord::Base.logger = Logger.new(log_dir / 'ar.log')
52
+ ActiveRecord::Base.logger.level = 0
53
+
54
+ ActiveRecord::Base.establish_connection(configuration_options)
55
+
56
+ class ARExhibit < ActiveRecord::Base #:nodoc:
57
+ set_table_name 'exhibits'
58
+
59
+ belongs_to :user, :class_name => 'ARUser', :foreign_key => 'user_id'
60
+ end
61
+
62
+ class ARUser < ActiveRecord::Base #:nodoc:
63
+ set_table_name 'users'
64
+
65
+ has_many :exhibits, :foreign_key => 'user_id'
66
+
67
+ end
68
+
69
+ ARExhibit.find_by_sql('SELECT 1')
70
+
71
+ class Exhibit
72
+ include DataMapper::Resource
73
+
74
+ property :id, Serial
75
+ property :name, String
76
+ property :zoo_id, Integer
77
+ property :user_id, Integer
78
+ property :notes, Text, :lazy => true
79
+ property :created_on, Date
80
+
81
+ belongs_to :user
82
+ # property :updated_at, DateTime
83
+ end
84
+
85
+ class User
86
+ include DataMapper::Resource
87
+
88
+ property :id, Serial
89
+ property :name, String
90
+ property :email, String
91
+ property :about, Text, :lazy => true
92
+ property :created_on, Date
93
+
94
+ end
95
+
96
+ touch_attributes = lambda do |exhibits|
97
+ [*exhibits].each do |exhibit|
98
+ exhibit.id
99
+ exhibit.name
100
+ exhibit.created_on
101
+ end
102
+ end
103
+
104
+ touch_relationships = lambda do |exhibits|
105
+ [*exhibits].each do |exhibit|
106
+ exhibit.id
107
+ exhibit.name
108
+ exhibit.created_on
109
+ exhibit.user
110
+ end
111
+ end
112
+
113
+
114
+ c = configuration_options
115
+
116
+ if sqlfile && File.exists?(sqlfile)
117
+ puts "Found data-file. Importing from #{sqlfile}"
118
+ #adapter.execute("LOAD DATA LOCAL INFILE '#{sqlfile}' INTO TABLE exhibits")
119
+ `#{mysql_bin} -u #{c[:username]} #{"-p#{c[:password]}" unless c[:password].blank?} #{c[:database]} < #{sqlfile}`
120
+ else
121
+
122
+ puts "Generating data for benchmarking..."
123
+
124
+ User.auto_migrate!
125
+ Exhibit.auto_migrate!
126
+
127
+ users = []
128
+ exhibits = []
129
+
130
+ # pre-compute the insert statements and fake data compilation,
131
+ # so the benchmarks below show the actual runtime for the execute
132
+ # method, minus the setup steps
133
+
134
+ # Using the same paragraph for all exhibits because it is very slow
135
+ # to generate unique paragraphs for all exhibits.
136
+ paragraph = Faker::Lorem.paragraphs.join($/)
137
+
138
+ 10_000.times do |i|
139
+ users << [
140
+ 'INSERT INTO `users` (`name`,`email`,`created_on`) VALUES (?, ?, ?)',
141
+ Faker::Name.name,
142
+ Faker::Internet.email,
143
+ Date.today
144
+ ]
145
+
146
+ exhibits << [
147
+ 'INSERT INTO `exhibits` (`name`, `zoo_id`, `user_id`, `notes`, `created_on`) VALUES (?, ?, ?, ?, ?)',
148
+ Faker::Company.name,
149
+ rand(10).ceil,
150
+ i,
151
+ paragraph,#Faker::Lorem.paragraphs.join($/),
152
+ Date.today
153
+ ]
154
+ end
155
+
156
+ puts "Inserting 10,000 users..."
157
+ 10_000.times { |i| adapter.execute(*users.at(i)) }
158
+ puts "Inserting 10,000 exhibits..."
159
+ 10_000.times { |i| adapter.execute(*exhibits.at(i)) }
160
+
161
+ if sqlfile
162
+ answer = nil
163
+ until answer && answer[/^$|y|yes|n|no/]
164
+ print("Would you like to dump data into tmp/performance.sql (for faster setup)? [Yn]");
165
+ STDOUT.flush
166
+ answer = gets
167
+ end
168
+
169
+ if answer[/^$|y|yes/]
170
+ File.makedirs(File.dirname(sqlfile))
171
+ #adapter.execute("SELECT * INTO OUTFILE '#{sqlfile}' FROM exhibits;")
172
+ `#{mysqldump_bin} -u #{c[:username]} #{"-p#{c[:password]}" unless c[:password].blank?} #{c[:database]} exhibits users > #{sqlfile}`
173
+ puts "File saved\n"
174
+ end
175
+ end
176
+
177
+ end
178
+
179
+ TIMES = ENV['x'] ? ENV['x'].to_i : 10_000
180
+
181
+ puts "You can specify how many times you want to run the benchmarks with rake:perf x=(number)"
182
+ puts "Some tasks will be run 10 and 1000 times less than (number)"
183
+ puts "Benchmarks will now run #{TIMES} times"
184
+ # Inform about slow benchmark
185
+ # answer = nil
186
+ # until answer && answer[/^$|y|yes|n|no/]
187
+ # print("A slow benchmark exposing problems with SEL is newly added. It takes approx. 20s\n");
188
+ # print("you have scheduled it to run #{TIMES / 100} times.\nWould you still include the particular benchmark? [Yn]")
189
+ # STDOUT.flush
190
+ # answer = gets
191
+ # end
192
+ # run_rel_bench = answer[/^$|y|yes/] ? true : false
193
+
194
+
195
+ RBench.run(TIMES) do
196
+
197
+ column :times
198
+ column :ar, :title => "AR 2.1"
199
+ column :dm, :title => "DM #{DataMapper::VERSION}"
200
+ column :diff, :compare => [:ar,:dm]
201
+
202
+ report "Model.new (instantiation)" do
203
+ ar { ARExhibit.new }
204
+ dm { Exhibit.new }
205
+ end
206
+
207
+ report "Model.new (setting attributes)" do
208
+ attrs = {:name => 'sam', :zoo_id => 1}
209
+ ar { ARExhibit.new(attrs) }
210
+ dm { Exhibit.new(attrs) }
211
+ end
212
+
213
+ report "Model.get specific (not cached)" do
214
+ ActiveRecord::Base.uncached { ar { touch_attributes[ARExhibit.find(1)] } }
215
+ dm { touch_attributes[Exhibit.get(1)] }
216
+ end
217
+
218
+ report "Model.get specific (cached)" do
219
+ ActiveRecord::Base.cache { ar { touch_attributes[ARExhibit.find(1)] } }
220
+ Exhibit.repository(:default) { dm { touch_attributes[Exhibit.get(1)] } }
221
+ end
222
+
223
+ report "Model.first" do
224
+ ar { touch_attributes[ARExhibit.first] }
225
+ dm { touch_attributes[Exhibit.first] }
226
+ end
227
+
228
+ report "Model.all limit(100)", (TIMES / 10.0).ceil do
229
+ ar { touch_attributes[ARExhibit.find(:all, :limit => 100)] }
230
+ dm { touch_attributes[Exhibit.all(:limit => 100)] }
231
+ end
232
+
233
+ report "Model.all limit(100) with relationship", (TIMES / 10.0).ceil do
234
+ ar { touch_relationships[ARExhibit.all(:limit => 100, :include => [:user])] }
235
+ dm { touch_relationships[Exhibit.all(:limit => 100)] }
236
+ end
237
+
238
+ report "Model.all limit(10,000)", (TIMES / 1000.0).ceil do
239
+ ar { touch_attributes[ARExhibit.find(:all, :limit => 10_000)] }
240
+ dm { touch_attributes[Exhibit.all(:limit => 10_000)] }
241
+ end
242
+
243
+ create_exhibit = {
244
+ :name => Faker::Company.name,
245
+ :zoo_id => rand(10).ceil,
246
+ :notes => Faker::Lorem.paragraphs.join($/),
247
+ :created_on => Date.today
248
+ }
249
+
250
+ report "Model.create" do
251
+ ar { ARExhibit.create(create_exhibit) }
252
+ dm { Exhibit.create(create_exhibit) }
253
+ end
254
+
255
+ report "Resource#attributes" do
256
+ attrs_first = {:name => 'sam', :zoo_id => 1}
257
+ attrs_second = {:name => 'tom', :zoo_id => 1}
258
+ ar { e = ARExhibit.new(attrs_first); e.attributes = attrs_second }
259
+ dm { e = Exhibit.new(attrs_first); e.attributes = attrs_second }
260
+ end
261
+
262
+ report "Resource#update" do
263
+ ar { e = ARExhibit.find(1); e.name = 'bob'; e.save }
264
+ dm { e = Exhibit.get(1); e.name = 'bob'; e.save }
265
+ end
266
+
267
+ report "Resource#destroy" do
268
+ ar { ARExhibit.first.destroy }
269
+ dm { Exhibit.first.destroy }
270
+ end
271
+
272
+ report "Model.transaction" do
273
+ ar { ARExhibit.transaction { ARExhibit.new } }
274
+ dm { Exhibit.transaction { Exhibit.new } }
275
+ end
276
+
277
+ summary "Total"
278
+ end
279
+
280
+ connection = adapter.send(:create_connection)
281
+ command = connection.create_command("DROP TABLE exhibits")
282
+ command = connection.create_command("DROP TABLE users")
283
+ command.execute_non_query rescue nil
284
+ connection.close
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'dm-core')
4
+
5
+ require 'rubygems'
6
+
7
+ gem 'ruby-prof', '>=0.6.0'
8
+ require 'ruby-prof'
9
+
10
+ gem 'faker', '>=0.3.1'
11
+ require 'faker'
12
+
13
+ OUTPUT = DataMapper.root / 'profile_results.txt'
14
+ #OUTPUT = DataMapper.root / 'profile_results.html'
15
+
16
+ SOCKET_FILE = Pathname.glob(%w[
17
+ /opt/local/var/run/mysql5/mysqld.sock
18
+ /tmp/mysqld.sock
19
+ /tmp/mysql.sock
20
+ /var/mysql/mysql.sock
21
+ /var/run/mysqld/mysqld.sock
22
+ ]).find { |path| path.socket? }
23
+
24
+ DataMapper::Logger.new(DataMapper.root / 'log' / 'dm.log', :debug)
25
+ DataMapper.setup(:default, "mysql://root@localhost/data_mapper_1?socket=#{SOCKET_FILE}")
26
+
27
+ class Exhibit
28
+ include DataMapper::Resource
29
+
30
+ property :id, Serial
31
+ property :name, String
32
+ property :zoo_id, Integer
33
+ property :notes, Text, :lazy => true
34
+ property :created_on, Date
35
+ # property :updated_at, DateTime
36
+
37
+ auto_migrate!
38
+ create # create one row for testing
39
+ end
40
+
41
+ touch_attributes = lambda do |exhibits|
42
+ [*exhibits].each do |exhibit|
43
+ exhibit.id
44
+ exhibit.name
45
+ exhibit.created_on
46
+ exhibit.updated_at
47
+ end
48
+ end
49
+
50
+ # RubyProf, making profiling Ruby pretty since 1899!
51
+ def profile(&b)
52
+ result = RubyProf.profile &b
53
+ printer = RubyProf::FlatPrinter.new(result)
54
+ #printer = RubyProf::GraphHtmlPrinter.new(result)
55
+ printer.print(OUTPUT.open('w+'))
56
+ end
57
+
58
+ profile do
59
+ # 10_000.times { touch_attributes[Exhibit.get(1)] }
60
+ #
61
+ # repository(:default) do
62
+ # 10_000.times { touch_attributes[Exhibit.get(1)] }
63
+ # end
64
+ #
65
+ # 1000.times { touch_attributes[Exhibit.all(:limit => 100)] }
66
+ #
67
+ # repository(:default) do
68
+ # 1000.times { touch_attributes[Exhibit.all(:limit => 100)] }
69
+ # end
70
+ #
71
+ # 10.times { touch_attributes[Exhibit.all(:limit => 10_000)] }
72
+ #
73
+ # repository(:default) do
74
+ # 10.times { touch_attributes[Exhibit.all(:limit => 10_000)] }
75
+ # end
76
+
77
+ create_exhibit = {
78
+ :name => Faker::Company.name,
79
+ :zoo_id => rand(10).ceil,
80
+ :notes => Faker::Lorem.paragraphs.join($/),
81
+ :created_on => Date.today
82
+ }
83
+
84
+ 1000.times { Exhibit.create(create_exhibit) }
85
+ end
86
+
87
+ puts "Done!"
@@ -0,0 +1,5 @@
1
+ module DataMapper
2
+ class Migration
3
+ VERSION = "0.9.7"
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + '/migration'