dm-core 0.9.11 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. data/.autotest +17 -14
  2. data/.gitignore +3 -1
  3. data/FAQ +6 -5
  4. data/History.txt +5 -50
  5. data/Manifest.txt +66 -76
  6. data/QUICKLINKS +1 -1
  7. data/README.txt +21 -15
  8. data/Rakefile +6 -7
  9. data/SPECS +2 -29
  10. data/TODO +1 -1
  11. data/deps.rip +2 -0
  12. data/dm-core.gemspec +11 -15
  13. data/lib/dm-core.rb +105 -110
  14. data/lib/dm-core/adapters.rb +135 -16
  15. data/lib/dm-core/adapters/abstract_adapter.rb +251 -181
  16. data/lib/dm-core/adapters/data_objects_adapter.rb +482 -534
  17. data/lib/dm-core/adapters/in_memory_adapter.rb +90 -69
  18. data/lib/dm-core/adapters/mysql_adapter.rb +22 -115
  19. data/lib/dm-core/adapters/oracle_adapter.rb +249 -0
  20. data/lib/dm-core/adapters/postgres_adapter.rb +7 -173
  21. data/lib/dm-core/adapters/sqlite3_adapter.rb +4 -97
  22. data/lib/dm-core/adapters/yaml_adapter.rb +116 -0
  23. data/lib/dm-core/associations/many_to_many.rb +372 -90
  24. data/lib/dm-core/associations/many_to_one.rb +220 -73
  25. data/lib/dm-core/associations/one_to_many.rb +319 -255
  26. data/lib/dm-core/associations/one_to_one.rb +66 -53
  27. data/lib/dm-core/associations/relationship.rb +561 -156
  28. data/lib/dm-core/collection.rb +1101 -379
  29. data/lib/dm-core/core_ext/kernel.rb +12 -0
  30. data/lib/dm-core/core_ext/symbol.rb +10 -0
  31. data/lib/dm-core/identity_map.rb +4 -34
  32. data/lib/dm-core/migrations.rb +1283 -0
  33. data/lib/dm-core/model.rb +570 -369
  34. data/lib/dm-core/model/descendant_set.rb +81 -0
  35. data/lib/dm-core/model/hook.rb +45 -0
  36. data/lib/dm-core/model/is.rb +32 -0
  37. data/lib/dm-core/model/property.rb +247 -0
  38. data/lib/dm-core/model/relationship.rb +335 -0
  39. data/lib/dm-core/model/scope.rb +90 -0
  40. data/lib/dm-core/property.rb +808 -273
  41. data/lib/dm-core/property_set.rb +141 -98
  42. data/lib/dm-core/query.rb +1037 -483
  43. data/lib/dm-core/query/conditions/comparison.rb +872 -0
  44. data/lib/dm-core/query/conditions/operation.rb +221 -0
  45. data/lib/dm-core/query/direction.rb +43 -0
  46. data/lib/dm-core/query/operator.rb +84 -0
  47. data/lib/dm-core/query/path.rb +138 -0
  48. data/lib/dm-core/query/sort.rb +45 -0
  49. data/lib/dm-core/repository.rb +210 -94
  50. data/lib/dm-core/resource.rb +641 -421
  51. data/lib/dm-core/spec/adapter_shared_spec.rb +294 -0
  52. data/lib/dm-core/spec/data_objects_adapter_shared_spec.rb +106 -0
  53. data/lib/dm-core/support/chainable.rb +22 -0
  54. data/lib/dm-core/support/deprecate.rb +12 -0
  55. data/lib/dm-core/support/logger.rb +13 -0
  56. data/lib/dm-core/{naming_conventions.rb → support/naming_conventions.rb} +6 -6
  57. data/lib/dm-core/transaction.rb +333 -92
  58. data/lib/dm-core/type.rb +98 -60
  59. data/lib/dm-core/types/boolean.rb +1 -1
  60. data/lib/dm-core/types/discriminator.rb +34 -20
  61. data/lib/dm-core/types/object.rb +7 -4
  62. data/lib/dm-core/types/paranoid_boolean.rb +11 -9
  63. data/lib/dm-core/types/paranoid_datetime.rb +11 -9
  64. data/lib/dm-core/types/serial.rb +3 -3
  65. data/lib/dm-core/types/text.rb +3 -4
  66. data/lib/dm-core/version.rb +1 -1
  67. data/script/performance.rb +102 -109
  68. data/script/profile.rb +169 -38
  69. data/spec/lib/adapter_helpers.rb +105 -0
  70. data/spec/lib/collection_helpers.rb +18 -0
  71. data/spec/lib/counter_adapter.rb +34 -0
  72. data/spec/lib/pending_helpers.rb +27 -0
  73. data/spec/lib/rspec_immediate_feedback_formatter.rb +53 -0
  74. data/spec/public/associations/many_to_many_spec.rb +193 -0
  75. data/spec/public/associations/many_to_one_spec.rb +73 -0
  76. data/spec/public/associations/one_to_many_spec.rb +77 -0
  77. data/spec/public/associations/one_to_one_spec.rb +156 -0
  78. data/spec/public/collection_spec.rb +65 -0
  79. data/spec/public/migrations_spec.rb +359 -0
  80. data/spec/public/model/relationship_spec.rb +924 -0
  81. data/spec/public/model_spec.rb +159 -0
  82. data/spec/public/property_spec.rb +829 -0
  83. data/spec/public/resource_spec.rb +71 -0
  84. data/spec/public/sel_spec.rb +44 -0
  85. data/spec/public/setup_spec.rb +145 -0
  86. data/spec/public/shared/association_collection_shared_spec.rb +317 -0
  87. data/spec/public/shared/collection_shared_spec.rb +1670 -0
  88. data/spec/public/shared/finder_shared_spec.rb +1619 -0
  89. data/spec/public/shared/resource_shared_spec.rb +924 -0
  90. data/spec/public/shared/sel_shared_spec.rb +112 -0
  91. data/spec/public/transaction_spec.rb +129 -0
  92. data/spec/public/types/discriminator_spec.rb +130 -0
  93. data/spec/semipublic/adapters/abstract_adapter_spec.rb +30 -0
  94. data/spec/semipublic/adapters/in_memory_adapter_spec.rb +12 -0
  95. data/spec/semipublic/adapters/mysql_adapter_spec.rb +17 -0
  96. data/spec/semipublic/adapters/oracle_adapter_spec.rb +194 -0
  97. data/spec/semipublic/adapters/postgres_adapter_spec.rb +17 -0
  98. data/spec/semipublic/adapters/sqlite3_adapter_spec.rb +17 -0
  99. data/spec/semipublic/adapters/yaml_adapter_spec.rb +12 -0
  100. data/spec/semipublic/associations/many_to_one_spec.rb +53 -0
  101. data/spec/semipublic/associations/relationship_spec.rb +194 -0
  102. data/spec/semipublic/associations_spec.rb +177 -0
  103. data/spec/semipublic/collection_spec.rb +142 -0
  104. data/spec/semipublic/property_spec.rb +61 -0
  105. data/spec/semipublic/query/conditions_spec.rb +528 -0
  106. data/spec/semipublic/query/path_spec.rb +443 -0
  107. data/spec/semipublic/query_spec.rb +2626 -0
  108. data/spec/semipublic/resource_spec.rb +47 -0
  109. data/spec/semipublic/shared/condition_shared_spec.rb +9 -0
  110. data/spec/semipublic/shared/resource_shared_spec.rb +126 -0
  111. data/spec/spec.opts +3 -1
  112. data/spec/spec_helper.rb +80 -57
  113. data/tasks/ci.rb +19 -31
  114. data/tasks/dm.rb +43 -48
  115. data/tasks/doc.rb +8 -11
  116. data/tasks/gemspec.rb +5 -5
  117. data/tasks/hoe.rb +15 -16
  118. data/tasks/install.rb +8 -10
  119. metadata +74 -111
  120. data/lib/dm-core/associations.rb +0 -207
  121. data/lib/dm-core/associations/relationship_chain.rb +0 -81
  122. data/lib/dm-core/auto_migrations.rb +0 -105
  123. data/lib/dm-core/dependency_queue.rb +0 -32
  124. data/lib/dm-core/hook.rb +0 -11
  125. data/lib/dm-core/is.rb +0 -16
  126. data/lib/dm-core/logger.rb +0 -232
  127. data/lib/dm-core/migrations/destructive_migrations.rb +0 -17
  128. data/lib/dm-core/migrator.rb +0 -29
  129. data/lib/dm-core/scope.rb +0 -58
  130. data/lib/dm-core/support.rb +0 -7
  131. data/lib/dm-core/support/array.rb +0 -13
  132. data/lib/dm-core/support/assertions.rb +0 -8
  133. data/lib/dm-core/support/errors.rb +0 -23
  134. data/lib/dm-core/support/kernel.rb +0 -11
  135. data/lib/dm-core/support/symbol.rb +0 -41
  136. data/lib/dm-core/type_map.rb +0 -80
  137. data/lib/dm-core/types.rb +0 -19
  138. data/script/all +0 -4
  139. data/spec/integration/association_spec.rb +0 -1382
  140. data/spec/integration/association_through_spec.rb +0 -203
  141. data/spec/integration/associations/many_to_many_spec.rb +0 -449
  142. data/spec/integration/associations/many_to_one_spec.rb +0 -163
  143. data/spec/integration/associations/one_to_many_spec.rb +0 -188
  144. data/spec/integration/auto_migrations_spec.rb +0 -413
  145. data/spec/integration/collection_spec.rb +0 -1073
  146. data/spec/integration/data_objects_adapter_spec.rb +0 -32
  147. data/spec/integration/dependency_queue_spec.rb +0 -46
  148. data/spec/integration/model_spec.rb +0 -197
  149. data/spec/integration/mysql_adapter_spec.rb +0 -85
  150. data/spec/integration/postgres_adapter_spec.rb +0 -731
  151. data/spec/integration/property_spec.rb +0 -253
  152. data/spec/integration/query_spec.rb +0 -514
  153. data/spec/integration/repository_spec.rb +0 -61
  154. data/spec/integration/resource_spec.rb +0 -513
  155. data/spec/integration/sqlite3_adapter_spec.rb +0 -352
  156. data/spec/integration/sti_spec.rb +0 -273
  157. data/spec/integration/strategic_eager_loading_spec.rb +0 -156
  158. data/spec/integration/transaction_spec.rb +0 -75
  159. data/spec/integration/type_spec.rb +0 -275
  160. data/spec/lib/logging_helper.rb +0 -18
  161. data/spec/lib/mock_adapter.rb +0 -27
  162. data/spec/lib/model_loader.rb +0 -100
  163. data/spec/lib/publicize_methods.rb +0 -28
  164. data/spec/models/content.rb +0 -16
  165. data/spec/models/vehicles.rb +0 -34
  166. data/spec/models/zoo.rb +0 -48
  167. data/spec/unit/adapters/abstract_adapter_spec.rb +0 -133
  168. data/spec/unit/adapters/adapter_shared_spec.rb +0 -15
  169. data/spec/unit/adapters/data_objects_adapter_spec.rb +0 -632
  170. data/spec/unit/adapters/in_memory_adapter_spec.rb +0 -98
  171. data/spec/unit/adapters/postgres_adapter_spec.rb +0 -133
  172. data/spec/unit/associations/many_to_many_spec.rb +0 -32
  173. data/spec/unit/associations/many_to_one_spec.rb +0 -159
  174. data/spec/unit/associations/one_to_many_spec.rb +0 -393
  175. data/spec/unit/associations/one_to_one_spec.rb +0 -7
  176. data/spec/unit/associations/relationship_spec.rb +0 -71
  177. data/spec/unit/associations_spec.rb +0 -242
  178. data/spec/unit/auto_migrations_spec.rb +0 -111
  179. data/spec/unit/collection_spec.rb +0 -182
  180. data/spec/unit/data_mapper_spec.rb +0 -35
  181. data/spec/unit/identity_map_spec.rb +0 -126
  182. data/spec/unit/is_spec.rb +0 -80
  183. data/spec/unit/migrator_spec.rb +0 -33
  184. data/spec/unit/model_spec.rb +0 -321
  185. data/spec/unit/naming_conventions_spec.rb +0 -36
  186. data/spec/unit/property_set_spec.rb +0 -90
  187. data/spec/unit/property_spec.rb +0 -753
  188. data/spec/unit/query_spec.rb +0 -571
  189. data/spec/unit/repository_spec.rb +0 -93
  190. data/spec/unit/resource_spec.rb +0 -649
  191. data/spec/unit/scope_spec.rb +0 -142
  192. data/spec/unit/transaction_spec.rb +0 -493
  193. data/spec/unit/type_map_spec.rb +0 -114
  194. data/spec/unit/type_spec.rb +0 -119
@@ -1,81 +0,0 @@
1
- module DataMapper
2
- module Associations
3
- class RelationshipChain < Relationship
4
- OPTIONS = [
5
- :repository_name, :near_relationship_name, :remote_relationship_name,
6
- :child_model, :parent_model, :parent_key, :child_key,
7
- :min, :max
8
- ]
9
-
10
- undef_method :get_parent
11
- undef_method :attach_parent
12
-
13
- # @api private
14
- def child_model
15
- near_relationship.child_model
16
- end
17
-
18
- # @api private
19
- def get_children(parent, options = {}, finder = :all, *args)
20
- query = @query.merge(options).merge(child_key.to_query(parent_key.get(parent)))
21
-
22
- query[:links] = links
23
- query[:unique] = true
24
-
25
- with_repository(parent) do
26
- results = grandchild_model.send(finder, *(args << query))
27
- # FIXME: remove the need for the uniq.freeze
28
- finder == :all ? (@mutable ? results : results.freeze) : results
29
- end
30
- end
31
-
32
- private
33
-
34
- # @api private
35
- def initialize(options)
36
- if (missing_options = OPTIONS - [ :min, :max ] - options.keys ).any?
37
- raise ArgumentError, "The options #{missing_options * ', '} are required", caller
38
- end
39
-
40
- @repository_name = options.fetch(:repository_name)
41
- @near_relationship_name = options.fetch(:near_relationship_name)
42
- @remote_relationship_name = options.fetch(:remote_relationship_name)
43
- @child_model = options.fetch(:child_model)
44
- @parent_model = options.fetch(:parent_model)
45
- @parent_properties = options.fetch(:parent_key)
46
- @child_properties = options.fetch(:child_key)
47
- @mutable = options.delete(:mutable) || false
48
-
49
- @name = near_relationship.name
50
- @query = options.reject{ |key,val| OPTIONS.include?(key) }
51
- @extra_links = []
52
- @options = options
53
- end
54
-
55
- # @api private
56
- def near_relationship
57
- parent_model.relationships[@near_relationship_name]
58
- end
59
-
60
- # @api private
61
- def links
62
- if remote_relationship.kind_of?(RelationshipChain)
63
- remote_relationship.send(:links) + [ remote_relationship.send(:near_relationship) ]
64
- else
65
- [ remote_relationship ]
66
- end
67
- end
68
-
69
- # @api private
70
- def remote_relationship
71
- near_relationship.child_model.relationships[@remote_relationship_name] ||
72
- near_relationship.child_model.relationships[@remote_relationship_name.to_s.singularize.to_sym]
73
- end
74
-
75
- # @api private
76
- def grandchild_model
77
- Class === @child_model ? @child_model : (Class === @parent_model ? @parent_model.find_const(@child_model) : Object.find_const(@child_model))
78
- end
79
- end # class Relationship
80
- end # module Associations
81
- end # module DataMapper
@@ -1,105 +0,0 @@
1
- # TODO: move to dm-more/dm-migrations
2
-
3
- module DataMapper
4
- class AutoMigrator
5
- ##
6
- # Destructively automigrates the data-store to match the model.
7
- # First migrates all models down and then up.
8
- # REPEAT: THIS IS DESTRUCTIVE
9
- #
10
- # @param Symbol repository_name the repository to be migrated
11
- def self.auto_migrate(repository_name = nil, *descendants)
12
- auto_migrate_down(repository_name, *descendants)
13
- auto_migrate_up(repository_name, *descendants)
14
- end
15
-
16
- ##
17
- # Destructively automigrates the data-store down
18
- # REPEAT: THIS IS DESTRUCTIVE
19
- #
20
- # @param Symbol repository_name the repository to be migrated
21
- # @calls DataMapper::Resource#auto_migrate_down!
22
- # @api private
23
- def self.auto_migrate_down(repository_name = nil, *descendants)
24
- descendants = DataMapper::Resource.descendants.to_a if descendants.empty?
25
- descendants.reverse.each do |model|
26
- model.auto_migrate_down!(repository_name)
27
- end
28
- end
29
-
30
- ##
31
- # Automigrates the data-store up
32
- #
33
- # @param Symbol repository_name the repository to be migrated
34
- # @calls DataMapper::Resource#auto_migrate_up!
35
- # @api private
36
- def self.auto_migrate_up(repository_name = nil, *descendants)
37
- descendants = DataMapper::Resource.descendants.to_a if descendants.empty?
38
- descendants.each do |model|
39
- model.auto_migrate_up!(repository_name)
40
- end
41
- end
42
-
43
- ##
44
- # Safely migrates the data-store to match the model
45
- # preserving data already in the data-store
46
- #
47
- # @param Symbol repository_name the repository to be migrated
48
- # @calls DataMapper::Resource#auto_upgrade!
49
- def self.auto_upgrade(repository_name = nil)
50
- DataMapper::Resource.descendants.each do |model|
51
- model.auto_upgrade!(repository_name)
52
- end
53
- end
54
- end # class AutoMigrator
55
-
56
- module AutoMigrations
57
- ##
58
- # Destructively automigrates the data-store to match the model
59
- # REPEAT: THIS IS DESTRUCTIVE
60
- #
61
- # @param Symbol repository_name the repository to be migrated
62
- def auto_migrate!(repository_name = self.repository_name)
63
- auto_migrate_down!(repository_name)
64
- auto_migrate_up!(repository_name)
65
- end
66
-
67
- ##
68
- # Destructively migrates the data-store down, which basically
69
- # deletes all the models.
70
- # REPEAT: THIS IS DESTRUCTIVE
71
- #
72
- # @param Symbol repository_name the repository to be migrated
73
- # @api private
74
- def auto_migrate_down!(repository_name = self.repository_name)
75
- # repository_name ||= default_repository_name
76
- repository(repository_name) do |r|
77
- r.adapter.destroy_model_storage(r, self.base_model)
78
- end
79
- end
80
-
81
- ##
82
- # Auto migrates the data-store to match the model
83
- #
84
- # @param Symbol repository_name the repository to be migrated
85
- # @api private
86
- def auto_migrate_up!(repository_name = self.repository_name)
87
- repository(repository_name) do |r|
88
- r.adapter.create_model_storage(r, self.base_model)
89
- end
90
- end
91
-
92
- ##
93
- # Safely migrates the data-store to match the model
94
- # preserving data already in the data-store
95
- #
96
- # @param Symbol repository_name the repository to be migrated
97
- def auto_upgrade!(repository_name = self.repository_name)
98
- repository(repository_name) do |r|
99
- r.adapter.upgrade_model_storage(r, self)
100
- end
101
- end
102
-
103
- Model.send(:include, self)
104
- end # module AutoMigrations
105
- end # module DataMapper
@@ -1,32 +0,0 @@
1
- module DataMapper
2
- ##
3
- #
4
- # DataMapper's DependencyQueue is used to store callbacks for classes which
5
- # may or may not be loaded already.
6
- #
7
- class DependencyQueue
8
- def initialize
9
- @dependencies = {}
10
- end
11
-
12
- def add(class_name, &callback)
13
- @dependencies[class_name] ||= []
14
- @dependencies[class_name] << callback
15
- resolve!
16
- end
17
-
18
- def resolve!
19
- @dependencies.each do |class_name, callbacks|
20
- begin
21
- klass = Object.find_const(class_name)
22
- callbacks.each do |callback|
23
- callback.call(klass)
24
- end
25
- callbacks.clear
26
- rescue NameError
27
- end
28
- end
29
- end
30
-
31
- end # class DependencyQueue
32
- end # module DataMapper
@@ -1,11 +0,0 @@
1
- module DataMapper
2
- module Hook
3
- def self.included(model)
4
- model.class_eval <<-EOS, __FILE__, __LINE__
5
- include Extlib::Hook
6
- register_instance_hooks :save, :create, :update, :destroy
7
- EOS
8
- end
9
- end
10
- DataMapper::Resource.append_inclusions Hook
11
- end # module DataMapper
@@ -1,16 +0,0 @@
1
- module DataMapper
2
- module Is
3
-
4
- def is(plugin, *pars, &block)
5
- generator_method = "is_#{plugin}".to_sym
6
-
7
- if self.respond_to?(generator_method)
8
- self.send(generator_method, *pars, &block)
9
- else
10
- raise PluginNotFoundError, "could not find plugin named #{plugin}"
11
- end
12
- end
13
-
14
- Model.send(:include, self)
15
- end # module Is
16
- end # module DataMapper
@@ -1,232 +0,0 @@
1
- require "time" # httpdate
2
- # ==== Public DataMapper Logger API
3
- #
4
- # Logger taken from Merb :)
5
- #
6
- # To replace an existing logger with a new one:
7
- # DataMapper.logger.set_log(log{String, IO},level{Symbol, String})
8
- #
9
- # Available logging levels are:
10
- # :off, :fatal, :error, :warn, :info, :debug
11
- #
12
- # Logging via:
13
- # DataMapper.logger.fatal(message<String>)
14
- # DataMapper.logger.error(message<String>)
15
- # DataMapper.logger.warn(message<String>)
16
- # DataMapper.logger.info(message<String>)
17
- # DataMapper.logger.debug(message<String>)
18
- #
19
- # Flush the buffer to
20
- # DataMapper.logger.flush
21
- #
22
- # Remove the current log object
23
- # DataMapper.logger.close
24
- #
25
- # ==== Private DataMapper Logger API
26
- #
27
- # To initialize the logger you create a new object, proxies to set_log.
28
- # DataMapper::Logger.new(log{String, IO}, level{Symbol, String})
29
- #
30
- # Logger will not create the file until something is actually logged
31
- # This avoids file creation on DataMapper init when it creates the
32
- # default logger.
33
- module DataMapper
34
-
35
- class << self #:nodoc:
36
- attr_accessor :logger
37
- end
38
-
39
- class Logger
40
-
41
- attr_accessor :aio
42
- attr_accessor :delimiter
43
- attr_reader :level
44
- attr_reader :buffer
45
- attr_reader :log
46
-
47
- # @note
48
- # Ruby (standard) logger levels:
49
- # off: absolutely nothing
50
- # fatal: an unhandleable error that results in a program crash
51
- # error: a handleable error condition
52
- # warn: a warning
53
- # info: generic (useful) information about system operation
54
- # debug: low-level information for developers
55
- #
56
- # DataMapper::Logger::LEVELS[:off, :fatal, :error, :warn, :info, :debug]
57
- LEVELS =
58
- {
59
- :off => 99999,
60
- :fatal => 7,
61
- :error => 6,
62
- :warn => 4,
63
- :info => 3,
64
- :debug => 0
65
- }
66
-
67
- def level=(new_level)
68
- @level = LEVELS[new_level.to_sym]
69
- reset_methods(:close)
70
- end
71
-
72
- private
73
-
74
- # The idea here is that instead of performing an 'if' conditional check on
75
- # each logging we do it once when the log object is setup
76
- def set_write_method
77
- @log.instance_eval do
78
-
79
- # Determine if asynchronous IO can be used
80
- def aio?
81
- @aio = !RUBY_PLATFORM.match(/java|mswin/) &&
82
- !(@log == STDOUT) &&
83
- @log.respond_to?(:write_nonblock)
84
- end
85
-
86
- # Define the write method based on if aio an be used
87
- undef write_method if defined? write_method
88
- if aio?
89
- alias :write_method :write_nonblock
90
- else
91
- alias :write_method :write
92
- end
93
- end
94
- end
95
-
96
- def initialize_log(log)
97
- close if @log # be sure that we don't leave open files laying around.
98
- @log = log || "log/dm.log"
99
- end
100
-
101
- def reset_methods(o_or_c)
102
- if o_or_c == :open
103
- alias internal_push push_opened
104
- elsif o_or_c == :close
105
- alias internal_push push_closed
106
- end
107
- end
108
-
109
- def push_opened(string)
110
- message = Time.now.httpdate
111
- message << delimiter
112
- message << string
113
- message << "\n" unless message[-1] == ?\n
114
- @buffer << message
115
- flush # Force a flush for now until we figure out where we want to use the buffering.
116
- end
117
-
118
- def push_closed(string)
119
- unless @log.respond_to?(:write)
120
- log = Pathname(@log)
121
- log.dirname.mkpath
122
- @log = log.open('a')
123
- @log.sync = true
124
- end
125
- set_write_method
126
- reset_methods(:open)
127
- push(string)
128
- end
129
-
130
- alias internal_push push_closed
131
-
132
- def prep_msg(message, level)
133
- level << delimiter << message
134
- end
135
-
136
- public
137
-
138
- # To initialize the logger you create a new object, proxies to set_log.
139
- # DataMapper::Logger.new(log{String, IO},level{Symbol, String})
140
- #
141
- # @param log<IO,String> either an IO object or a name of a logfile.
142
- # @param log_level<String> the message string to be logged
143
- # @param delimiter<String> delimiter to use between message sections
144
- # @param log_creation<Boolean> log that the file is being created
145
- def initialize(*args)
146
- set_log(*args)
147
- end
148
-
149
- # To replace an existing logger with a new one:
150
- # DataMapper.logger.set_log(log{String, IO},level{Symbol, String})
151
- #
152
- # @param log<IO,String> either an IO object or a name of a logfile.
153
- # @param log_level<Symbol> a symbol representing the log level from
154
- # {:off, :fatal, :error, :warn, :info, :debug}
155
- # @param delimiter<String> delimiter to use between message sections
156
- # @param log_creation<Boolean> log that the file is being created
157
- def set_log(log, log_level = :off, delimiter = " ~ ", log_creation = false)
158
- delimiter ||= " ~ "
159
-
160
- if log_level && LEVELS[log_level.to_sym]
161
- self.level = log_level.to_sym
162
- else
163
- self.level = :debug
164
- end
165
-
166
- @buffer = []
167
- @delimiter = delimiter
168
-
169
- initialize_log(log)
170
-
171
- DataMapper.logger = self
172
-
173
- self.info("Logfile created") if log_creation
174
- end
175
-
176
- # Flush the entire buffer to the log object.
177
- # DataMapper.logger.flush
178
- #
179
- def flush
180
- return unless @buffer.size > 0
181
- @log.write_method(@buffer.slice!(0..-1).join)
182
- end
183
-
184
- # Close and remove the current log object.
185
- # DataMapper.logger.close
186
- #
187
- def close
188
- flush
189
- @log.close if @log.respond_to?(:close)
190
- @log = nil
191
- end
192
-
193
- # Appends a string and log level to logger's buffer.
194
-
195
- # @note
196
- # Note that the string is discarded if the string's log level less than the
197
- # logger's log level.
198
- # @note
199
- # Note that if the logger is aio capable then the logger will use
200
- # non-blocking asynchronous writes.
201
- #
202
- # @param level<Fixnum> the logging level as an integer
203
- # @param string<String> the message string to be logged
204
- def push(string)
205
- internal_push(string)
206
- end
207
- alias << push
208
-
209
- # Generate the following logging methods for DataMapper.logger as described
210
- # in the API:
211
- # :fatal, :error, :warn, :info, :debug
212
- # :off only gets a off? method
213
- LEVELS.each_pair do |name, number|
214
- unless name.to_s == 'off'
215
- class_eval <<-EOS, __FILE__, __LINE__
216
- # DOC
217
- def #{name}(message)
218
- self.<<( prep_msg(message, "#{name}") ) if #{name}?
219
- end
220
- EOS
221
- end
222
-
223
- class_eval <<-EOS, __FILE__, __LINE__
224
- # DOC
225
- def #{name}?
226
- #{number} >= level
227
- end
228
- EOS
229
- end
230
-
231
- end # class Logger
232
- end # module DataMapper