dm-core 0.9.11 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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