ghost_dm-core 1.3.0.beta
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.
- data/.autotest +29 -0
- data/.document +5 -0
- data/.gitignore +35 -0
- data/.yardopts +1 -0
- data/Gemfile +65 -0
- data/LICENSE +20 -0
- data/README.md +269 -0
- data/Rakefile +4 -0
- data/dm-core.gemspec +24 -0
- data/lib/dm-core.rb +292 -0
- data/lib/dm-core/adapters.rb +222 -0
- data/lib/dm-core/adapters/abstract_adapter.rb +237 -0
- data/lib/dm-core/adapters/in_memory_adapter.rb +113 -0
- data/lib/dm-core/associations/many_to_many.rb +499 -0
- data/lib/dm-core/associations/many_to_one.rb +290 -0
- data/lib/dm-core/associations/one_to_many.rb +348 -0
- data/lib/dm-core/associations/one_to_one.rb +86 -0
- data/lib/dm-core/associations/relationship.rb +663 -0
- data/lib/dm-core/backwards.rb +13 -0
- data/lib/dm-core/collection.rb +1515 -0
- data/lib/dm-core/core_ext/kernel.rb +23 -0
- data/lib/dm-core/core_ext/pathname.rb +6 -0
- data/lib/dm-core/core_ext/symbol.rb +10 -0
- data/lib/dm-core/identity_map.rb +7 -0
- data/lib/dm-core/model.rb +874 -0
- data/lib/dm-core/model/hook.rb +103 -0
- data/lib/dm-core/model/is.rb +32 -0
- data/lib/dm-core/model/property.rb +249 -0
- data/lib/dm-core/model/relationship.rb +378 -0
- data/lib/dm-core/model/scope.rb +89 -0
- data/lib/dm-core/property.rb +866 -0
- data/lib/dm-core/property/binary.rb +21 -0
- data/lib/dm-core/property/boolean.rb +20 -0
- data/lib/dm-core/property/class.rb +17 -0
- data/lib/dm-core/property/date.rb +10 -0
- data/lib/dm-core/property/date_time.rb +10 -0
- data/lib/dm-core/property/decimal.rb +36 -0
- data/lib/dm-core/property/discriminator.rb +44 -0
- data/lib/dm-core/property/float.rb +16 -0
- data/lib/dm-core/property/integer.rb +22 -0
- data/lib/dm-core/property/invalid_value_error.rb +22 -0
- data/lib/dm-core/property/lookup.rb +27 -0
- data/lib/dm-core/property/numeric.rb +38 -0
- data/lib/dm-core/property/object.rb +34 -0
- data/lib/dm-core/property/serial.rb +14 -0
- data/lib/dm-core/property/string.rb +38 -0
- data/lib/dm-core/property/text.rb +9 -0
- data/lib/dm-core/property/time.rb +10 -0
- data/lib/dm-core/property_set.rb +177 -0
- data/lib/dm-core/query.rb +1366 -0
- data/lib/dm-core/query/conditions/comparison.rb +911 -0
- data/lib/dm-core/query/conditions/operation.rb +721 -0
- data/lib/dm-core/query/direction.rb +36 -0
- data/lib/dm-core/query/operator.rb +35 -0
- data/lib/dm-core/query/path.rb +114 -0
- data/lib/dm-core/query/sort.rb +39 -0
- data/lib/dm-core/relationship_set.rb +72 -0
- data/lib/dm-core/repository.rb +226 -0
- data/lib/dm-core/resource.rb +1214 -0
- data/lib/dm-core/resource/persistence_state.rb +75 -0
- data/lib/dm-core/resource/persistence_state/clean.rb +40 -0
- data/lib/dm-core/resource/persistence_state/deleted.rb +30 -0
- data/lib/dm-core/resource/persistence_state/dirty.rb +96 -0
- data/lib/dm-core/resource/persistence_state/immutable.rb +34 -0
- data/lib/dm-core/resource/persistence_state/persisted.rb +29 -0
- data/lib/dm-core/resource/persistence_state/transient.rb +80 -0
- data/lib/dm-core/spec/lib/adapter_helpers.rb +64 -0
- data/lib/dm-core/spec/lib/collection_helpers.rb +21 -0
- data/lib/dm-core/spec/lib/counter_adapter.rb +38 -0
- data/lib/dm-core/spec/lib/pending_helpers.rb +50 -0
- data/lib/dm-core/spec/lib/spec_helper.rb +74 -0
- data/lib/dm-core/spec/setup.rb +174 -0
- data/lib/dm-core/spec/shared/adapter_spec.rb +341 -0
- data/lib/dm-core/spec/shared/public/property_spec.rb +229 -0
- data/lib/dm-core/spec/shared/resource_spec.rb +1232 -0
- data/lib/dm-core/spec/shared/sel_spec.rb +111 -0
- data/lib/dm-core/spec/shared/semipublic/property_spec.rb +176 -0
- data/lib/dm-core/spec/shared/semipublic/query/conditions/abstract_comparison_spec.rb +261 -0
- data/lib/dm-core/support/assertions.rb +8 -0
- data/lib/dm-core/support/chainable.rb +18 -0
- data/lib/dm-core/support/deprecate.rb +12 -0
- data/lib/dm-core/support/descendant_set.rb +89 -0
- data/lib/dm-core/support/equalizer.rb +48 -0
- data/lib/dm-core/support/ext/array.rb +22 -0
- data/lib/dm-core/support/ext/blank.rb +25 -0
- data/lib/dm-core/support/ext/hash.rb +67 -0
- data/lib/dm-core/support/ext/module.rb +47 -0
- data/lib/dm-core/support/ext/object.rb +57 -0
- data/lib/dm-core/support/ext/string.rb +24 -0
- data/lib/dm-core/support/ext/try_dup.rb +12 -0
- data/lib/dm-core/support/hook.rb +405 -0
- data/lib/dm-core/support/inflections.rb +60 -0
- data/lib/dm-core/support/inflector/inflections.rb +211 -0
- data/lib/dm-core/support/inflector/methods.rb +151 -0
- data/lib/dm-core/support/lazy_array.rb +451 -0
- data/lib/dm-core/support/local_object_space.rb +13 -0
- data/lib/dm-core/support/logger.rb +201 -0
- data/lib/dm-core/support/mash.rb +176 -0
- data/lib/dm-core/support/naming_conventions.rb +90 -0
- data/lib/dm-core/support/ordered_set.rb +380 -0
- data/lib/dm-core/support/subject.rb +33 -0
- data/lib/dm-core/support/subject_set.rb +250 -0
- data/lib/dm-core/version.rb +3 -0
- data/script/performance.rb +275 -0
- data/script/profile.rb +218 -0
- data/spec/lib/rspec_immediate_feedback_formatter.rb +54 -0
- data/spec/public/associations/many_to_many/read_multiple_join_spec.rb +68 -0
- data/spec/public/associations/many_to_many_spec.rb +197 -0
- data/spec/public/associations/many_to_one_spec.rb +83 -0
- data/spec/public/associations/many_to_one_with_boolean_cpk_spec.rb +40 -0
- data/spec/public/associations/many_to_one_with_custom_fk_spec.rb +49 -0
- data/spec/public/associations/one_to_many_spec.rb +81 -0
- data/spec/public/associations/one_to_one_spec.rb +176 -0
- data/spec/public/associations/one_to_one_with_boolean_cpk_spec.rb +46 -0
- data/spec/public/collection_spec.rb +69 -0
- data/spec/public/finalize_spec.rb +76 -0
- data/spec/public/model/hook_spec.rb +246 -0
- data/spec/public/model/property_spec.rb +88 -0
- data/spec/public/model/relationship_spec.rb +1040 -0
- data/spec/public/model_spec.rb +462 -0
- data/spec/public/property/binary_spec.rb +41 -0
- data/spec/public/property/boolean_spec.rb +22 -0
- data/spec/public/property/class_spec.rb +28 -0
- data/spec/public/property/date_spec.rb +22 -0
- data/spec/public/property/date_time_spec.rb +22 -0
- data/spec/public/property/decimal_spec.rb +23 -0
- data/spec/public/property/discriminator_spec.rb +135 -0
- data/spec/public/property/float_spec.rb +22 -0
- data/spec/public/property/integer_spec.rb +22 -0
- data/spec/public/property/object_spec.rb +107 -0
- data/spec/public/property/serial_spec.rb +22 -0
- data/spec/public/property/string_spec.rb +22 -0
- data/spec/public/property/text_spec.rb +63 -0
- data/spec/public/property/time_spec.rb +22 -0
- data/spec/public/property_spec.rb +341 -0
- data/spec/public/resource_spec.rb +288 -0
- data/spec/public/sel_spec.rb +53 -0
- data/spec/public/setup_spec.rb +145 -0
- data/spec/public/shared/association_collection_shared_spec.rb +309 -0
- data/spec/public/shared/collection_finder_shared_spec.rb +267 -0
- data/spec/public/shared/collection_shared_spec.rb +1667 -0
- data/spec/public/shared/finder_shared_spec.rb +1629 -0
- data/spec/rcov.opts +6 -0
- data/spec/semipublic/adapters/abstract_adapter_spec.rb +30 -0
- data/spec/semipublic/adapters/in_memory_adapter_spec.rb +13 -0
- data/spec/semipublic/associations/many_to_many_spec.rb +94 -0
- data/spec/semipublic/associations/many_to_one_spec.rb +63 -0
- data/spec/semipublic/associations/one_to_many_spec.rb +55 -0
- data/spec/semipublic/associations/one_to_one_spec.rb +53 -0
- data/spec/semipublic/associations/relationship_spec.rb +200 -0
- data/spec/semipublic/associations_spec.rb +177 -0
- data/spec/semipublic/collection_spec.rb +110 -0
- data/spec/semipublic/model_spec.rb +96 -0
- data/spec/semipublic/property/binary_spec.rb +13 -0
- data/spec/semipublic/property/boolean_spec.rb +47 -0
- data/spec/semipublic/property/class_spec.rb +33 -0
- data/spec/semipublic/property/date_spec.rb +43 -0
- data/spec/semipublic/property/date_time_spec.rb +46 -0
- data/spec/semipublic/property/decimal_spec.rb +83 -0
- data/spec/semipublic/property/discriminator_spec.rb +19 -0
- data/spec/semipublic/property/float_spec.rb +82 -0
- data/spec/semipublic/property/integer_spec.rb +82 -0
- data/spec/semipublic/property/lookup_spec.rb +29 -0
- data/spec/semipublic/property/serial_spec.rb +13 -0
- data/spec/semipublic/property/string_spec.rb +13 -0
- data/spec/semipublic/property/text_spec.rb +31 -0
- data/spec/semipublic/property/time_spec.rb +50 -0
- data/spec/semipublic/property_spec.rb +114 -0
- data/spec/semipublic/query/conditions/comparison_spec.rb +1501 -0
- data/spec/semipublic/query/conditions/operation_spec.rb +1294 -0
- data/spec/semipublic/query/path_spec.rb +471 -0
- data/spec/semipublic/query_spec.rb +3682 -0
- data/spec/semipublic/resource/state/clean_spec.rb +88 -0
- data/spec/semipublic/resource/state/deleted_spec.rb +78 -0
- data/spec/semipublic/resource/state/dirty_spec.rb +162 -0
- data/spec/semipublic/resource/state/immutable_spec.rb +105 -0
- data/spec/semipublic/resource/state/transient_spec.rb +162 -0
- data/spec/semipublic/resource/state_spec.rb +230 -0
- data/spec/semipublic/resource_spec.rb +23 -0
- data/spec/semipublic/shared/condition_shared_spec.rb +9 -0
- data/spec/semipublic/shared/resource_shared_spec.rb +199 -0
- data/spec/semipublic/shared/resource_state_shared_spec.rb +79 -0
- data/spec/semipublic/shared/subject_shared_spec.rb +79 -0
- data/spec/spec.opts +5 -0
- data/spec/spec_helper.rb +38 -0
- data/spec/support/core_ext/hash.rb +10 -0
- data/spec/support/core_ext/inheritable_attributes.rb +46 -0
- data/spec/support/properties/huge_integer.rb +17 -0
- data/spec/unit/array_spec.rb +23 -0
- data/spec/unit/blank_spec.rb +73 -0
- data/spec/unit/data_mapper/ordered_set/append_spec.rb +26 -0
- data/spec/unit/data_mapper/ordered_set/clear_spec.rb +24 -0
- data/spec/unit/data_mapper/ordered_set/delete_spec.rb +28 -0
- data/spec/unit/data_mapper/ordered_set/each_spec.rb +19 -0
- data/spec/unit/data_mapper/ordered_set/empty_spec.rb +20 -0
- data/spec/unit/data_mapper/ordered_set/entries_spec.rb +22 -0
- data/spec/unit/data_mapper/ordered_set/eql_spec.rb +51 -0
- data/spec/unit/data_mapper/ordered_set/equal_value_spec.rb +84 -0
- data/spec/unit/data_mapper/ordered_set/hash_spec.rb +12 -0
- data/spec/unit/data_mapper/ordered_set/include_spec.rb +23 -0
- data/spec/unit/data_mapper/ordered_set/index_spec.rb +28 -0
- data/spec/unit/data_mapper/ordered_set/initialize_spec.rb +32 -0
- data/spec/unit/data_mapper/ordered_set/merge_spec.rb +36 -0
- data/spec/unit/data_mapper/ordered_set/shared/append_spec.rb +24 -0
- data/spec/unit/data_mapper/ordered_set/shared/clear_spec.rb +9 -0
- data/spec/unit/data_mapper/ordered_set/shared/delete_spec.rb +25 -0
- data/spec/unit/data_mapper/ordered_set/shared/each_spec.rb +17 -0
- data/spec/unit/data_mapper/ordered_set/shared/empty_spec.rb +9 -0
- data/spec/unit/data_mapper/ordered_set/shared/entries_spec.rb +9 -0
- data/spec/unit/data_mapper/ordered_set/shared/include_spec.rb +9 -0
- data/spec/unit/data_mapper/ordered_set/shared/index_spec.rb +13 -0
- data/spec/unit/data_mapper/ordered_set/shared/initialize_spec.rb +28 -0
- data/spec/unit/data_mapper/ordered_set/shared/merge_spec.rb +28 -0
- data/spec/unit/data_mapper/ordered_set/shared/size_spec.rb +13 -0
- data/spec/unit/data_mapper/ordered_set/shared/to_ary_spec.rb +11 -0
- data/spec/unit/data_mapper/ordered_set/size_spec.rb +27 -0
- data/spec/unit/data_mapper/ordered_set/to_ary_spec.rb +23 -0
- data/spec/unit/data_mapper/subject_set/append_spec.rb +47 -0
- data/spec/unit/data_mapper/subject_set/clear_spec.rb +34 -0
- data/spec/unit/data_mapper/subject_set/delete_spec.rb +40 -0
- data/spec/unit/data_mapper/subject_set/each_spec.rb +30 -0
- data/spec/unit/data_mapper/subject_set/empty_spec.rb +31 -0
- data/spec/unit/data_mapper/subject_set/entries_spec.rb +31 -0
- data/spec/unit/data_mapper/subject_set/get_spec.rb +34 -0
- data/spec/unit/data_mapper/subject_set/include_spec.rb +32 -0
- data/spec/unit/data_mapper/subject_set/named_spec.rb +33 -0
- data/spec/unit/data_mapper/subject_set/shared/append_spec.rb +18 -0
- data/spec/unit/data_mapper/subject_set/shared/clear_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/delete_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/each_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/empty_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/entries_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/get_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/include_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/named_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/size_spec.rb +13 -0
- data/spec/unit/data_mapper/subject_set/shared/to_ary_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/values_at_spec.rb +44 -0
- data/spec/unit/data_mapper/subject_set/size_spec.rb +42 -0
- data/spec/unit/data_mapper/subject_set/to_ary_spec.rb +34 -0
- data/spec/unit/data_mapper/subject_set/values_at_spec.rb +57 -0
- data/spec/unit/hash_spec.rb +28 -0
- data/spec/unit/hook_spec.rb +1235 -0
- data/spec/unit/inflections_spec.rb +16 -0
- data/spec/unit/lazy_array_spec.rb +1949 -0
- data/spec/unit/mash_spec.rb +312 -0
- data/spec/unit/module_spec.rb +71 -0
- data/spec/unit/object_spec.rb +38 -0
- data/spec/unit/try_dup_spec.rb +46 -0
- data/tasks/ci.rake +1 -0
- data/tasks/spec.rake +38 -0
- data/tasks/yard.rake +9 -0
- data/tasks/yardstick.rake +19 -0
- metadata +365 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module DataMapper
|
|
2
|
+
module LocalObjectSpace
|
|
3
|
+
def self.extended(klass)
|
|
4
|
+
(class << klass; self; end).send :attr_accessor, :hook_scopes
|
|
5
|
+
klass.hook_scopes = []
|
|
6
|
+
super
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def object_by_id(object_id)
|
|
10
|
+
self.hook_scopes.detect { |object| object.object_id == object_id }
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# ==== Public DataMapper Logger API
|
|
2
|
+
#
|
|
3
|
+
# To replace an existing logger with a new one:
|
|
4
|
+
# DataMapper::Logger.set_log(log{String, IO},level{Symbol, String})
|
|
5
|
+
#
|
|
6
|
+
# Available logging levels are
|
|
7
|
+
# DataMapper::Logger::{ Fatal, Error, Warn, Info, Debug }
|
|
8
|
+
#
|
|
9
|
+
# Logging via:
|
|
10
|
+
# DataMapper.logger.fatal(message<String>,&block)
|
|
11
|
+
# DataMapper.logger.error(message<String>,&block)
|
|
12
|
+
# DataMapper.logger.warn(message<String>,&block)
|
|
13
|
+
# DataMapper.logger.info(message<String>,&block)
|
|
14
|
+
# DataMapper.logger.debug(message<String>,&block)
|
|
15
|
+
#
|
|
16
|
+
# Logging with autoflush:
|
|
17
|
+
# DataMapper.logger.fatal!(message<String>,&block)
|
|
18
|
+
# DataMapper.logger.error!(message<String>,&block)
|
|
19
|
+
# DataMapper.logger.warn!(message<String>,&block)
|
|
20
|
+
# DataMapper.logger.info!(message<String>,&block)
|
|
21
|
+
# DataMapper.logger.debug!(message<String>,&block)
|
|
22
|
+
#
|
|
23
|
+
# Flush the buffer to
|
|
24
|
+
# DataMapper.logger.flush
|
|
25
|
+
#
|
|
26
|
+
# Remove the current log object
|
|
27
|
+
# DataMapper.logger.close
|
|
28
|
+
#
|
|
29
|
+
# ==== Private DataMapper Logger API
|
|
30
|
+
#
|
|
31
|
+
# To initialize the logger you create a new object, proxies to set_log.
|
|
32
|
+
# DataMapper::Logger.new(log{String, IO},level{Symbol, String})
|
|
33
|
+
module DataMapper
|
|
34
|
+
|
|
35
|
+
class << self
|
|
36
|
+
attr_accessor :logger
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class Logger
|
|
40
|
+
|
|
41
|
+
attr_accessor :level
|
|
42
|
+
attr_accessor :delimiter
|
|
43
|
+
attr_accessor :auto_flush
|
|
44
|
+
attr_reader :buffer
|
|
45
|
+
attr_reader :log
|
|
46
|
+
attr_reader :init_args
|
|
47
|
+
|
|
48
|
+
# ==== Notes
|
|
49
|
+
# Ruby (standard) logger levels:
|
|
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
|
+
Levels =
|
|
56
|
+
{
|
|
57
|
+
:fatal => 7,
|
|
58
|
+
:error => 6,
|
|
59
|
+
:warn => 4,
|
|
60
|
+
:info => 3,
|
|
61
|
+
:debug => 0
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private
|
|
65
|
+
|
|
66
|
+
# Readies a log for writing.
|
|
67
|
+
#
|
|
68
|
+
# ==== Parameters
|
|
69
|
+
# log<IO, String>:: Either an IO object or a name of a logfile.
|
|
70
|
+
def initialize_log(log)
|
|
71
|
+
close if @log # be sure that we don't leave open files laying around.
|
|
72
|
+
|
|
73
|
+
if log.respond_to?(:write)
|
|
74
|
+
@log = log
|
|
75
|
+
elsif File.exist?(log)
|
|
76
|
+
@log = open(log, (File::WRONLY | File::APPEND))
|
|
77
|
+
@log.sync = true
|
|
78
|
+
else
|
|
79
|
+
FileUtils.mkdir_p(File.dirname(log)) unless File.directory?(File.dirname(log))
|
|
80
|
+
@log = open(log, (File::WRONLY | File::APPEND | File::CREAT))
|
|
81
|
+
@log.sync = true
|
|
82
|
+
@log.write("#{Time.now.httpdate} #{delimiter} info #{delimiter} Logfile created\n")
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
public
|
|
87
|
+
|
|
88
|
+
# To initialize the logger you create a new object, proxies to set_log.
|
|
89
|
+
#
|
|
90
|
+
# ==== Parameters
|
|
91
|
+
# *args:: Arguments to create the log from. See set_logs for specifics.
|
|
92
|
+
def initialize(*args)
|
|
93
|
+
@init_args = args
|
|
94
|
+
set_log(*args)
|
|
95
|
+
self.auto_flush = true
|
|
96
|
+
DataMapper.logger = self
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Replaces an existing logger with a new one.
|
|
100
|
+
#
|
|
101
|
+
# ==== Parameters
|
|
102
|
+
# log<IO, String>:: Either an IO object or a name of a logfile.
|
|
103
|
+
# log_level<~to_sym>::
|
|
104
|
+
# The log level from, e.g. :fatal or :info. Defaults to :error in the
|
|
105
|
+
# production environment and :debug otherwise.
|
|
106
|
+
# delimiter<String>::
|
|
107
|
+
# Delimiter to use between message sections. Defaults to " ~ ".
|
|
108
|
+
# auto_flush<Boolean>::
|
|
109
|
+
# Whether the log should automatically flush after new messages are
|
|
110
|
+
# added. Defaults to false.
|
|
111
|
+
def set_log(log, log_level = nil, delimiter = " ~ ", auto_flush = false)
|
|
112
|
+
if log_level && Levels[log_level.to_sym]
|
|
113
|
+
@level = Levels[log_level.to_sym]
|
|
114
|
+
else
|
|
115
|
+
@level = Levels[:debug]
|
|
116
|
+
end
|
|
117
|
+
@buffer = []
|
|
118
|
+
@delimiter = delimiter
|
|
119
|
+
@auto_flush = auto_flush
|
|
120
|
+
|
|
121
|
+
initialize_log(log)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Flush the entire buffer to the log object.
|
|
125
|
+
def flush
|
|
126
|
+
return unless @buffer.size > 0
|
|
127
|
+
to_flush = @buffer
|
|
128
|
+
@buffer = []
|
|
129
|
+
@log.write(to_flush.join)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Close and remove the current log object.
|
|
133
|
+
def close
|
|
134
|
+
flush
|
|
135
|
+
@log.close if @log.respond_to?(:close) && !@log.tty?
|
|
136
|
+
@log = nil
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Appends a message to the log. The methods yield to an optional block and
|
|
140
|
+
# the output of this block will be appended to the message.
|
|
141
|
+
#
|
|
142
|
+
# ==== Parameters
|
|
143
|
+
# string<String>:: The message to be logged. Defaults to nil.
|
|
144
|
+
#
|
|
145
|
+
# ==== Returns
|
|
146
|
+
# String:: The resulting message added to the log file.
|
|
147
|
+
def <<(string = nil)
|
|
148
|
+
message = ""
|
|
149
|
+
message << delimiter
|
|
150
|
+
message << string if string
|
|
151
|
+
message << "\n" unless message[-1] == ?\n
|
|
152
|
+
@buffer << message
|
|
153
|
+
flush if @auto_flush
|
|
154
|
+
|
|
155
|
+
message
|
|
156
|
+
end
|
|
157
|
+
alias_method :push, :<<
|
|
158
|
+
|
|
159
|
+
# Generate the logging methods for DataMapper.logger for each log level.
|
|
160
|
+
Levels.each_pair do |name, number|
|
|
161
|
+
class_eval <<-LEVELMETHODS, __FILE__, __LINE__
|
|
162
|
+
|
|
163
|
+
# Appends a message to the log if the log level is at least as high as
|
|
164
|
+
# the log level of the logger.
|
|
165
|
+
#
|
|
166
|
+
# ==== Parameters
|
|
167
|
+
# string<String>:: The message to be logged. Defaults to nil.
|
|
168
|
+
#
|
|
169
|
+
# ==== Returns
|
|
170
|
+
# self:: The logger object for chaining.
|
|
171
|
+
def #{name}(message = nil)
|
|
172
|
+
self << message if #{number} >= level
|
|
173
|
+
self
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# Appends a message to the log if the log level is at least as high as
|
|
177
|
+
# the log level of the logger. The bang! version of the method also auto
|
|
178
|
+
# flushes the log buffer to disk.
|
|
179
|
+
#
|
|
180
|
+
# ==== Parameters
|
|
181
|
+
# string<String>:: The message to be logged. Defaults to nil.
|
|
182
|
+
#
|
|
183
|
+
# ==== Returns
|
|
184
|
+
# self:: The logger object for chaining.
|
|
185
|
+
def #{name}!(message = nil)
|
|
186
|
+
self << message if #{number} >= level
|
|
187
|
+
flush if #{number} >= level
|
|
188
|
+
self
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# ==== Returns
|
|
192
|
+
# Boolean:: True if this level will be logged by this logger.
|
|
193
|
+
def #{name}?
|
|
194
|
+
#{number} >= level
|
|
195
|
+
end
|
|
196
|
+
LEVELMETHODS
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
end
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
module DataMapper
|
|
2
|
+
# This class has dubious semantics and we only have it so that people can write
|
|
3
|
+
# params[:key] instead of params['key'].
|
|
4
|
+
class Mash < Hash
|
|
5
|
+
|
|
6
|
+
# Initializes a new mash.
|
|
7
|
+
#
|
|
8
|
+
# @param [Hash, Object] constructor
|
|
9
|
+
# The default value for the mash. If +constructor+ is a Hash, a new mash
|
|
10
|
+
# will be created based on the keys of the hash and no default value will
|
|
11
|
+
# be set.
|
|
12
|
+
def initialize(constructor = {})
|
|
13
|
+
if constructor.is_a?(Hash)
|
|
14
|
+
super()
|
|
15
|
+
update(constructor)
|
|
16
|
+
else
|
|
17
|
+
super(constructor)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Gets the default value for the mash.
|
|
22
|
+
#
|
|
23
|
+
# @param [Object] key
|
|
24
|
+
# The default value for the mash. If +key+ is a Symbol and it is a key in
|
|
25
|
+
# the mash, then the default value will be set to the value matching the
|
|
26
|
+
# key.
|
|
27
|
+
def default(key = nil)
|
|
28
|
+
if key.is_a?(Symbol) && include?(key = key.to_s)
|
|
29
|
+
self[key]
|
|
30
|
+
else
|
|
31
|
+
super
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
alias_method :regular_writer, :[]= unless method_defined?(:regular_writer)
|
|
36
|
+
alias_method :regular_update, :update unless method_defined?(:regular_update)
|
|
37
|
+
|
|
38
|
+
# Sets the +value+ associated with the specified +key+.
|
|
39
|
+
#
|
|
40
|
+
# @param [Object] key The key to set.
|
|
41
|
+
# @param [Object] value The value to set the key to.
|
|
42
|
+
def []=(key, value)
|
|
43
|
+
regular_writer(convert_key(key), convert_value(value))
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Updates the mash with the key/value pairs from the specified hash.
|
|
47
|
+
#
|
|
48
|
+
# @param [Hash] other_hash
|
|
49
|
+
# A hash to update values in the mash with. The keys and the values will be
|
|
50
|
+
# converted to Mash format.
|
|
51
|
+
#
|
|
52
|
+
# @return [Mash] The updated mash.
|
|
53
|
+
def update(other_hash)
|
|
54
|
+
other_hash.each_pair { |key, value| regular_writer(convert_key(key), convert_value(value)) }
|
|
55
|
+
self
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
alias_method :merge!, :update
|
|
59
|
+
|
|
60
|
+
# Determines whether the mash contains the specified +key+.
|
|
61
|
+
#
|
|
62
|
+
# @param [Object] key The key to check for.
|
|
63
|
+
# @return [Boolean] True if the key exists in the mash.
|
|
64
|
+
def key?(key)
|
|
65
|
+
super(convert_key(key))
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
alias_method :include?, :key?
|
|
69
|
+
alias_method :has_key?, :key?
|
|
70
|
+
alias_method :member?, :key?
|
|
71
|
+
|
|
72
|
+
# @param [Object] key The key to fetch.
|
|
73
|
+
# @param [Array] *extras Default value.
|
|
74
|
+
#
|
|
75
|
+
# @return [Object] The value at key or the default value.
|
|
76
|
+
def fetch(key, *extras)
|
|
77
|
+
super(convert_key(key), *extras)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# @param [Array] *indices
|
|
81
|
+
# The keys to retrieve values for.
|
|
82
|
+
#
|
|
83
|
+
# @return [Array] The values at each of the provided keys.
|
|
84
|
+
def values_at(*indices)
|
|
85
|
+
indices.collect {|key| self[convert_key(key)]}
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# @param [Hash] hash The hash to merge with the mash.
|
|
89
|
+
#
|
|
90
|
+
# @return [Mash] A new mash with the hash values merged in.
|
|
91
|
+
def merge(hash)
|
|
92
|
+
self.dup.update(hash)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# @param [Object] key The key to delete from the mash.
|
|
96
|
+
def delete(key)
|
|
97
|
+
super(convert_key(key))
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Returns a mash that includes everything but the given +keys+.
|
|
101
|
+
#
|
|
102
|
+
# @param [Array<String, Symbol>] *keys The mash keys to exclude.
|
|
103
|
+
#
|
|
104
|
+
# @return [Mash] A new mash without the selected keys.
|
|
105
|
+
#
|
|
106
|
+
# @example
|
|
107
|
+
# { :one => 1, :two => 2, :three => 3 }.except(:one)
|
|
108
|
+
# #=> { "two" => 2, "three" => 3 }
|
|
109
|
+
def except(*keys)
|
|
110
|
+
self.dup.except!(*keys.map {|k| convert_key(k)})
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Removes the specified +keys+ from the mash.
|
|
114
|
+
#
|
|
115
|
+
# @param [Array] *keys The mash keys to exclude.
|
|
116
|
+
#
|
|
117
|
+
# @return [Hash] +hash+
|
|
118
|
+
#
|
|
119
|
+
# @example
|
|
120
|
+
# mash = { :one => 1, :two => 2, :three => 3 }
|
|
121
|
+
# mash.except!(:one, :two)
|
|
122
|
+
# mash # => { :three => 3 }
|
|
123
|
+
def except!(*keys)
|
|
124
|
+
keys.each { |key| delete(key) }
|
|
125
|
+
self
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Used to provide the same interface as Hash.
|
|
129
|
+
#
|
|
130
|
+
# @return [Mash] This mash unchanged.
|
|
131
|
+
def stringify_keys!; self end
|
|
132
|
+
|
|
133
|
+
# @return [Hash] The mash as a Hash with symbolized keys.
|
|
134
|
+
def symbolize_keys
|
|
135
|
+
h = Hash.new(default)
|
|
136
|
+
each { |key, val| h[key.to_sym] = val }
|
|
137
|
+
h
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# @return [Hash] The mash as a Hash with string keys.
|
|
141
|
+
def to_hash
|
|
142
|
+
Hash.new(default).merge(self)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
protected
|
|
146
|
+
# @param [Object] key The key to convert.
|
|
147
|
+
#
|
|
148
|
+
# @param [Object]
|
|
149
|
+
# The converted key. If the key was a symbol, it will be converted to a
|
|
150
|
+
# string.
|
|
151
|
+
#
|
|
152
|
+
# @api private
|
|
153
|
+
def convert_key(key)
|
|
154
|
+
key.kind_of?(Symbol) ? key.to_s : key
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# @param [Object] value The value to convert.
|
|
158
|
+
#
|
|
159
|
+
# @return [Object]
|
|
160
|
+
# The converted value. A Hash or an Array of hashes, will be converted to
|
|
161
|
+
# their Mash equivalents.
|
|
162
|
+
#
|
|
163
|
+
# @api private
|
|
164
|
+
def convert_value(value)
|
|
165
|
+
if value.class == Hash
|
|
166
|
+
mash = Mash.new(value)
|
|
167
|
+
mash.default = value.default
|
|
168
|
+
mash
|
|
169
|
+
elsif value.is_a?(Array)
|
|
170
|
+
value.collect { |e| convert_value(e) }
|
|
171
|
+
else
|
|
172
|
+
value
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
module DataMapper
|
|
2
|
+
|
|
3
|
+
# Use these modules to establish naming conventions.
|
|
4
|
+
# The default is UnderscoredAndPluralized.
|
|
5
|
+
# You assign a naming convention like so:
|
|
6
|
+
#
|
|
7
|
+
# repository(:default).adapter.resource_naming_convention = NamingConventions::Resource::Underscored
|
|
8
|
+
#
|
|
9
|
+
# You can also easily assign a custom convention with a Proc:
|
|
10
|
+
#
|
|
11
|
+
# repository(:default).adapter.resource_naming_convention = lambda do |value|
|
|
12
|
+
# 'tbl' + value.camelize(true)
|
|
13
|
+
# end
|
|
14
|
+
#
|
|
15
|
+
# Or by simply defining your own module in NamingConventions that responds to
|
|
16
|
+
# ::call.
|
|
17
|
+
#
|
|
18
|
+
# NOTE: It's important to set the convention before accessing your models
|
|
19
|
+
# since the resource_names are cached after first accessed.
|
|
20
|
+
# DataMapper.setup(name, uri) returns the Adapter for convenience, so you can
|
|
21
|
+
# use code like this:
|
|
22
|
+
#
|
|
23
|
+
# adapter = DataMapper.setup(:default, 'mock://localhost/mock')
|
|
24
|
+
# adapter.resource_naming_convention = NamingConventions::Resource::Underscored
|
|
25
|
+
module NamingConventions
|
|
26
|
+
|
|
27
|
+
module Resource
|
|
28
|
+
|
|
29
|
+
module UnderscoredAndPluralized
|
|
30
|
+
def self.call(name)
|
|
31
|
+
DataMapper::Inflector.pluralize(DataMapper::Inflector.underscore(name)).gsub('/', '_')
|
|
32
|
+
end
|
|
33
|
+
end # module UnderscoredAndPluralized
|
|
34
|
+
|
|
35
|
+
module UnderscoredAndPluralizedWithoutModule
|
|
36
|
+
def self.call(name)
|
|
37
|
+
DataMapper::Inflector.pluralize(DataMapper::Inflector.underscore(DataMapper::Inflector.demodulize(name)))
|
|
38
|
+
end
|
|
39
|
+
end # module UnderscoredAndPluralizedWithoutModule
|
|
40
|
+
|
|
41
|
+
module UnderscoredAndPluralizedWithoutLeadingModule
|
|
42
|
+
def self.call(name)
|
|
43
|
+
UnderscoredAndPluralized.call(name.to_s.gsub(/^[^:]*::/,''))
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
module Underscored
|
|
48
|
+
def self.call(name)
|
|
49
|
+
DataMapper::Inflector.underscore(name)
|
|
50
|
+
end
|
|
51
|
+
end # module Underscored
|
|
52
|
+
|
|
53
|
+
module Yaml
|
|
54
|
+
def self.call(name)
|
|
55
|
+
"#{DataMapper::Inflector.pluralize(DataMapper::Inflector.underscore(name))}.yaml"
|
|
56
|
+
end
|
|
57
|
+
end # module Yaml
|
|
58
|
+
|
|
59
|
+
end # module Resource
|
|
60
|
+
|
|
61
|
+
module Field
|
|
62
|
+
|
|
63
|
+
module UnderscoredAndPluralized
|
|
64
|
+
def self.call(property)
|
|
65
|
+
DataMapper::Inflector.pluralize(DataMapper::Inflector.underscore(property.name.to_s)).gsub('/', '_')
|
|
66
|
+
end
|
|
67
|
+
end # module UnderscoredAndPluralized
|
|
68
|
+
|
|
69
|
+
module UnderscoredAndPluralizedWithoutModule
|
|
70
|
+
def self.call(property)
|
|
71
|
+
DataMapper::Inflector.pluralize(DataMapper::Inflector.underscore(DataMapper::Inflector.demodulize(property.name.to_s)))
|
|
72
|
+
end
|
|
73
|
+
end # module UnderscoredAndPluralizedWithoutModule
|
|
74
|
+
|
|
75
|
+
module Underscored
|
|
76
|
+
def self.call(property)
|
|
77
|
+
DataMapper::Inflector.underscore(property.name.to_s)
|
|
78
|
+
end
|
|
79
|
+
end # module Underscored
|
|
80
|
+
|
|
81
|
+
module Yaml
|
|
82
|
+
def self.call(property)
|
|
83
|
+
"#{DataMapper::Inflector.pluralize(DataMapper::Inflector.underscore(property.name.to_s))}.yaml"
|
|
84
|
+
end
|
|
85
|
+
end # module Yaml
|
|
86
|
+
|
|
87
|
+
end # module Field
|
|
88
|
+
|
|
89
|
+
end # module NamingConventions
|
|
90
|
+
end # module DataMapper
|