ardm 0.0.1

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 (179) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +35 -0
  3. data/Gemfile +13 -0
  4. data/LICENSE +21 -0
  5. data/README.md +70 -0
  6. data/Rakefile +4 -0
  7. data/ardm.gemspec +29 -0
  8. data/db/.gitignore +1 -0
  9. data/lib/ardm/active_record/associations.rb +80 -0
  10. data/lib/ardm/active_record/base.rb +49 -0
  11. data/lib/ardm/active_record/dirty.rb +25 -0
  12. data/lib/ardm/active_record/hooks.rb +31 -0
  13. data/lib/ardm/active_record/inheritance.rb +37 -0
  14. data/lib/ardm/active_record/is/state_machine.rb +21 -0
  15. data/lib/ardm/active_record/is.rb +22 -0
  16. data/lib/ardm/active_record/not_found.rb +7 -0
  17. data/lib/ardm/active_record/predicate_builder/array_handler.rb +31 -0
  18. data/lib/ardm/active_record/predicate_builder/rails3.rb +147 -0
  19. data/lib/ardm/active_record/predicate_builder/rails4.rb +139 -0
  20. data/lib/ardm/active_record/predicate_builder/relation_handler.rb +15 -0
  21. data/lib/ardm/active_record/predicate_builder.rb +19 -0
  22. data/lib/ardm/active_record/property.rb +357 -0
  23. data/lib/ardm/active_record/query.rb +108 -0
  24. data/lib/ardm/active_record/record.rb +70 -0
  25. data/lib/ardm/active_record/relation.rb +83 -0
  26. data/lib/ardm/active_record/repository.rb +38 -0
  27. data/lib/ardm/active_record/serialization.rb +164 -0
  28. data/lib/ardm/active_record/storage_names.rb +28 -0
  29. data/lib/ardm/active_record/validations.rb +111 -0
  30. data/lib/ardm/active_record.rb +43 -0
  31. data/lib/ardm/data_mapper/not_found.rb +5 -0
  32. data/lib/ardm/data_mapper/record.rb +41 -0
  33. data/lib/ardm/data_mapper.rb +5 -0
  34. data/lib/ardm/env.rb +5 -0
  35. data/lib/ardm/property/api_key.rb +30 -0
  36. data/lib/ardm/property/bcrypt_hash.rb +31 -0
  37. data/lib/ardm/property/binary.rb +23 -0
  38. data/lib/ardm/property/boolean.rb +29 -0
  39. data/lib/ardm/property/class.rb +19 -0
  40. data/lib/ardm/property/comma_separated_list.rb +28 -0
  41. data/lib/ardm/property/csv.rb +35 -0
  42. data/lib/ardm/property/date.rb +12 -0
  43. data/lib/ardm/property/datetime.rb +12 -0
  44. data/lib/ardm/property/decimal.rb +38 -0
  45. data/lib/ardm/property/discriminator.rb +65 -0
  46. data/lib/ardm/property/enum.rb +51 -0
  47. data/lib/ardm/property/epoch_time.rb +38 -0
  48. data/lib/ardm/property/file_path.rb +25 -0
  49. data/lib/ardm/property/flag.rb +65 -0
  50. data/lib/ardm/property/float.rb +18 -0
  51. data/lib/ardm/property/integer.rb +24 -0
  52. data/lib/ardm/property/invalid_value_error.rb +22 -0
  53. data/lib/ardm/property/ip_address.rb +35 -0
  54. data/lib/ardm/property/json.rb +49 -0
  55. data/lib/ardm/property/lookup.rb +29 -0
  56. data/lib/ardm/property/numeric.rb +40 -0
  57. data/lib/ardm/property/object.rb +36 -0
  58. data/lib/ardm/property/paranoid_boolean.rb +18 -0
  59. data/lib/ardm/property/paranoid_datetime.rb +17 -0
  60. data/lib/ardm/property/regexp.rb +22 -0
  61. data/lib/ardm/property/serial.rb +16 -0
  62. data/lib/ardm/property/slug.rb +29 -0
  63. data/lib/ardm/property/string.rb +40 -0
  64. data/lib/ardm/property/support/dirty_minder.rb +169 -0
  65. data/lib/ardm/property/support/flags.rb +41 -0
  66. data/lib/ardm/property/support/paranoid_base.rb +78 -0
  67. data/lib/ardm/property/text.rb +11 -0
  68. data/lib/ardm/property/time.rb +12 -0
  69. data/lib/ardm/property/uri.rb +27 -0
  70. data/lib/ardm/property/uuid.rb +65 -0
  71. data/lib/ardm/property/validation.rb +208 -0
  72. data/lib/ardm/property/yaml.rb +38 -0
  73. data/lib/ardm/property.rb +891 -0
  74. data/lib/ardm/property_set.rb +152 -0
  75. data/lib/ardm/query/expression.rb +85 -0
  76. data/lib/ardm/query/ext/symbol.rb +37 -0
  77. data/lib/ardm/query/operator.rb +64 -0
  78. data/lib/ardm/record.rb +1 -0
  79. data/lib/ardm/support/assertions.rb +8 -0
  80. data/lib/ardm/support/deprecate.rb +12 -0
  81. data/lib/ardm/support/descendant_set.rb +89 -0
  82. data/lib/ardm/support/equalizer.rb +48 -0
  83. data/lib/ardm/support/ext/array.rb +22 -0
  84. data/lib/ardm/support/ext/blank.rb +25 -0
  85. data/lib/ardm/support/ext/hash.rb +67 -0
  86. data/lib/ardm/support/ext/module.rb +47 -0
  87. data/lib/ardm/support/ext/object.rb +57 -0
  88. data/lib/ardm/support/ext/string.rb +24 -0
  89. data/lib/ardm/support/ext/try_dup.rb +12 -0
  90. data/lib/ardm/support/hook.rb +405 -0
  91. data/lib/ardm/support/lazy_array.rb +451 -0
  92. data/lib/ardm/support/local_object_space.rb +13 -0
  93. data/lib/ardm/support/logger.rb +201 -0
  94. data/lib/ardm/support/mash.rb +176 -0
  95. data/lib/ardm/support/naming_conventions.rb +90 -0
  96. data/lib/ardm/support/ordered_set.rb +380 -0
  97. data/lib/ardm/support/subject.rb +33 -0
  98. data/lib/ardm/support/subject_set.rb +250 -0
  99. data/lib/ardm/version.rb +3 -0
  100. data/lib/ardm.rb +56 -0
  101. data/spec/fixtures/api_user.rb +11 -0
  102. data/spec/fixtures/article.rb +22 -0
  103. data/spec/fixtures/bookmark.rb +14 -0
  104. data/spec/fixtures/invention.rb +5 -0
  105. data/spec/fixtures/network_node.rb +23 -0
  106. data/spec/fixtures/person.rb +17 -0
  107. data/spec/fixtures/software_package.rb +22 -0
  108. data/spec/fixtures/ticket.rb +12 -0
  109. data/spec/fixtures/tshirt.rb +15 -0
  110. data/spec/integration/api_key_spec.rb +25 -0
  111. data/spec/integration/bcrypt_hash_spec.rb +45 -0
  112. data/spec/integration/comma_separated_list_spec.rb +85 -0
  113. data/spec/integration/dirty_minder_spec.rb +197 -0
  114. data/spec/integration/enum_spec.rb +79 -0
  115. data/spec/integration/epoch_time_spec.rb +59 -0
  116. data/spec/integration/file_path_spec.rb +158 -0
  117. data/spec/integration/flag_spec.rb +72 -0
  118. data/spec/integration/ip_address_spec.rb +151 -0
  119. data/spec/integration/json_spec.rb +70 -0
  120. data/spec/integration/slug_spec.rb +65 -0
  121. data/spec/integration/uri_spec.rb +136 -0
  122. data/spec/integration/uuid_spec.rb +102 -0
  123. data/spec/integration/yaml_spec.rb +85 -0
  124. data/spec/public/property/binary_spec.rb +41 -0
  125. data/spec/public/property/boolean_spec.rb +30 -0
  126. data/spec/public/property/class_spec.rb +28 -0
  127. data/spec/public/property/date_spec.rb +22 -0
  128. data/spec/public/property/date_time_spec.rb +22 -0
  129. data/spec/public/property/decimal_spec.rb +23 -0
  130. data/spec/public/property/discriminator_spec.rb +133 -0
  131. data/spec/public/property/float_spec.rb +22 -0
  132. data/spec/public/property/integer_spec.rb +22 -0
  133. data/spec/public/property/object_spec.rb +103 -0
  134. data/spec/public/property/serial_spec.rb +22 -0
  135. data/spec/public/property/string_spec.rb +22 -0
  136. data/spec/public/property/text_spec.rb +23 -0
  137. data/spec/public/property/time_spec.rb +22 -0
  138. data/spec/public/property_spec.rb +316 -0
  139. data/spec/rcov.opts +6 -0
  140. data/spec/schema.rb +86 -0
  141. data/spec/semipublic/property/binary_spec.rb +14 -0
  142. data/spec/semipublic/property/boolean_spec.rb +48 -0
  143. data/spec/semipublic/property/class_spec.rb +36 -0
  144. data/spec/semipublic/property/date_spec.rb +44 -0
  145. data/spec/semipublic/property/date_time_spec.rb +47 -0
  146. data/spec/semipublic/property/decimal_spec.rb +83 -0
  147. data/spec/semipublic/property/discriminator_spec.rb +22 -0
  148. data/spec/semipublic/property/float_spec.rb +83 -0
  149. data/spec/semipublic/property/integer_spec.rb +83 -0
  150. data/spec/semipublic/property/lookup_spec.rb +27 -0
  151. data/spec/semipublic/property/serial_spec.rb +14 -0
  152. data/spec/semipublic/property/string_spec.rb +14 -0
  153. data/spec/semipublic/property/text_spec.rb +30 -0
  154. data/spec/semipublic/property/time_spec.rb +49 -0
  155. data/spec/semipublic/property_spec.rb +51 -0
  156. data/spec/shared/flags_shared_spec.rb +36 -0
  157. data/spec/shared/identity_function_group.rb +5 -0
  158. data/spec/shared/public_property_spec.rb +229 -0
  159. data/spec/shared/semipublic_property_spec.rb +159 -0
  160. data/spec/spec.opts +4 -0
  161. data/spec/spec_helper.rb +58 -0
  162. data/spec/unit/bcrypt_hash_spec.rb +154 -0
  163. data/spec/unit/csv_spec.rb +139 -0
  164. data/spec/unit/dirty_minder_spec.rb +64 -0
  165. data/spec/unit/enum_spec.rb +125 -0
  166. data/spec/unit/epoch_time_spec.rb +72 -0
  167. data/spec/unit/file_path_spec.rb +75 -0
  168. data/spec/unit/flag_spec.rb +114 -0
  169. data/spec/unit/ip_address_spec.rb +109 -0
  170. data/spec/unit/json_spec.rb +127 -0
  171. data/spec/unit/paranoid_boolean_spec.rb +142 -0
  172. data/spec/unit/paranoid_datetime_spec.rb +149 -0
  173. data/spec/unit/regexp_spec.rb +62 -0
  174. data/spec/unit/uri_spec.rb +64 -0
  175. data/spec/unit/yaml_spec.rb +111 -0
  176. data/tasks/spec.rake +40 -0
  177. data/tasks/yard.rake +9 -0
  178. data/tasks/yardstick.rake +19 -0
  179. metadata +350 -0
@@ -0,0 +1,83 @@
1
+ require 'active_support/concern'
2
+ require 'active_record'
3
+
4
+ module Ardm
5
+ module ActiveRecord
6
+ module Relation
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ alias_method :destory_without_ardm, :destroy
11
+ alias_method :update_without_ardm, :update
12
+
13
+ # we need to overrite the implementation in the class
14
+ class_eval do
15
+ def update(*a)
16
+ if a.size == 1
17
+ # need to translate attributes
18
+ options = @klass.send(:dump_properties_hash, a.first)
19
+ update_all(options)
20
+ else
21
+ update_without_ardm(*a)
22
+ end
23
+ end
24
+
25
+ def destroy(id = nil)
26
+ if id
27
+ destroy_without_ardm(id)
28
+ else
29
+ destroy_all
30
+ end
31
+ end
32
+
33
+ def first_or_create(attributes = nil, options = {}, &block)
34
+ first(attributes) || create(attributes, options, &block)
35
+ end
36
+
37
+ def first_or_create!(attributes = nil, options = {}, &block)
38
+ first(attributes) || create!(attributes, options, &block)
39
+ end
40
+
41
+ def first_or_initialize(attributes = nil, options = {}, &block)
42
+ first(attributes) || create(attributes, options, &block)
43
+ end
44
+ end
45
+ end
46
+
47
+ def all(options={})
48
+ apply_finder_options(options)
49
+ end
50
+
51
+ def apply_finder_options(options)
52
+ return super if options.nil? || options.empty?
53
+ options = options.dup
54
+ conditions = options.slice!(*::ActiveRecord::SpawnMethods::VALID_FIND_OPTIONS)
55
+ super(options).where(conditions)
56
+ end
57
+
58
+ def calculate(operation, column_name, options={})
59
+ if property = properties[column_name]
60
+ column_name = property.field
61
+ end
62
+ super(operation, column_name, options)
63
+ end
64
+
65
+ def method_missing(meth, *a, &b)
66
+ if a.empty? && association = reflect_on_association(meth.to_sym)
67
+ case association.macro
68
+ when :belongs_to
69
+ association.klass.where(klass.primary_key => self.select(association.foreign_key))
70
+ when :has_many, :has_one
71
+ association.klass.where(association.foreign_key => self.clone)
72
+ end
73
+ else
74
+ super
75
+ end
76
+ end
77
+
78
+ def destroy!
79
+ delete_all
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,38 @@
1
+ require 'active_support/concern'
2
+
3
+ module Ardm
4
+ module ActiveRecord
5
+ module Repository
6
+ extend ActiveSupport::Concern
7
+
8
+ def repository
9
+ self.class.repository
10
+ end
11
+
12
+ module ClassMethods
13
+ def repository
14
+ if block_given?
15
+ yield
16
+ else
17
+ Ardm::ActiveRecord::Repository::Proxy.new self
18
+ end
19
+ end
20
+ end
21
+
22
+ class Proxy
23
+ def initialize(model)
24
+ @model = model
25
+ end
26
+
27
+ def adapter
28
+ self
29
+ end
30
+
31
+ def select(*args)
32
+ array_of_hashes = @model.connection.select_all(@model.send(:sanitize_sql_array, args))
33
+ array_of_hashes.map { |h| Hashie::Mash.new(h) }
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,164 @@
1
+ require 'active_support/concern'
2
+
3
+ module Ardm
4
+ module ActiveRecord
5
+ module Serialization
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ # Returns a hash of all the attributes that have been specified for
10
+ # serialization as keys and their class restriction as values.
11
+ class_attribute :serialized_attributes, instance_accessor: false
12
+ self.serialized_attributes = {}
13
+ end
14
+
15
+ module ClassMethods
16
+ ##
17
+ # :method: serialized_attributes
18
+ #
19
+ # Returns a hash of all the attributes that have been specified for
20
+ # serialization as keys and their class restriction as values.
21
+
22
+ # If you have an attribute that needs to be saved to the database as an
23
+ # object, and retrieved as the same object, then specify the name of that
24
+ # attribute using this method and it will be handled automatically. The
25
+ # serialization is done through YAML. If +class_name+ is specified, the
26
+ # serialized object must be of that class on retrieval or
27
+ # <tt>SerializationTypeMismatch</tt> will be raised.
28
+ #
29
+ # ==== Parameters
30
+ #
31
+ # * +attr_name+ - The field name that should be serialized.
32
+ # * +class_name+ - Optional, class name that the object type should be equal to.
33
+ #
34
+ # ==== Example
35
+ #
36
+ # # Serialize a preferences attribute.
37
+ # class User < ActiveRecord::Base
38
+ # serialize :preferences
39
+ # end
40
+ def serialize(attr_name, class_name = Object)
41
+ include Behavior
42
+
43
+ coder = if [:load, :dump].all? { |x| class_name.respond_to?(x) }
44
+ class_name
45
+ else
46
+ Coders::YAMLColumn.new(class_name)
47
+ end
48
+
49
+ # merge new serialized attribute and create new hash to ensure that each class in inheritance hierarchy
50
+ # has its own hash of own serialized attributes
51
+ self.serialized_attributes = serialized_attributes.merge(attr_name.to_s => coder)
52
+ end
53
+ end
54
+
55
+ # *DEPRECATED*: Use ActiveRecord::AttributeMethods::Serialization::ClassMethods#serialized_attributes class level method instead.
56
+ def serialized_attributes
57
+ message = "Instance level serialized_attributes method is deprecated, please use class level method."
58
+ ActiveSupport::Deprecation.warn message
59
+ defined?(@serialized_attributes) ? @serialized_attributes : self.class.serialized_attributes
60
+ end
61
+
62
+ class Type # :nodoc:
63
+ def initialize(column)
64
+ @column = column
65
+ end
66
+
67
+ def type_cast(value)
68
+ if value.state == :serialized
69
+ value.unserialized_value @column.type_cast value.value
70
+ else
71
+ value.unserialized_value
72
+ end
73
+ end
74
+
75
+ def type
76
+ @column.type
77
+ end
78
+ end
79
+
80
+ class Attribute < Struct.new(:coder, :value, :state) # :nodoc:
81
+ def unserialized_value(v = value)
82
+ state == :serialized ? unserialize(v) : value
83
+ end
84
+
85
+ def serialized_value
86
+ state == :unserialized ? serialize : value
87
+ end
88
+
89
+ def unserialize(v)
90
+ self.state = :unserialized
91
+ self.value = coder.load(v)
92
+ end
93
+
94
+ def serialize
95
+ self.state = :serialized
96
+ self.value = coder.dump(value)
97
+ end
98
+ end
99
+
100
+ # This is only added to the model when serialize is called, which
101
+ # ensures we do not make things slower when serialization is not used.
102
+ module Behavior # :nodoc:
103
+ extend ActiveSupport::Concern
104
+
105
+ module ClassMethods # :nodoc:
106
+ def initialize_attributes(attributes, options = {})
107
+ serialized = (options.delete(:serialized) { true }) ? :serialized : :unserialized
108
+ super(attributes, options)
109
+
110
+ serialized_attributes.each do |key, coder|
111
+ if attributes.key?(key)
112
+ attributes[key] = Attribute.new(coder, attributes[key], serialized)
113
+ end
114
+ end
115
+
116
+ attributes
117
+ end
118
+ end
119
+
120
+ def type_cast_attribute_for_write(column, value)
121
+ if column && coder = self.class.serialized_attributes[column.name]
122
+ Attribute.new(coder, value, :unserialized)
123
+ else
124
+ super
125
+ end
126
+ end
127
+
128
+ def _field_changed?(attr, old, value)
129
+ if self.class.serialized_attributes.include?(attr)
130
+ old != value
131
+ else
132
+ super
133
+ end
134
+ end
135
+
136
+ def read_attribute_before_type_cast(attr_name)
137
+ if self.class.serialized_attributes.include?(attr_name)
138
+ super.unserialized_value
139
+ else
140
+ super
141
+ end
142
+ end
143
+
144
+ def attributes_before_type_cast
145
+ super.dup.tap do |attributes|
146
+ self.class.serialized_attributes.each_key do |key|
147
+ if attributes.key?(key)
148
+ attributes[key] = attributes[key].unserialized_value
149
+ end
150
+ end
151
+ end
152
+ end
153
+
154
+ def typecasted_attribute_value(name)
155
+ if self.class.serialized_attributes.include?(name)
156
+ @attributes[name].serialized_value
157
+ else
158
+ super
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,28 @@
1
+ require 'active_support/concern'
2
+
3
+ module Ardm
4
+ module ActiveRecord
5
+ module StorageNames
6
+ extend ActiveSupport::Concern
7
+
8
+ module ClassMethods
9
+ def storage_names
10
+ Ardm::ActiveRecord::StorageNames::Proxy.new(self)
11
+ end
12
+ end
13
+
14
+ class Proxy
15
+ def initialize(model)
16
+ @model = model
17
+ end
18
+
19
+ def []=(repo, table_name)
20
+ unless repo == :default
21
+ raise ArgumentError, "repositories other than :default not supported."
22
+ end
23
+ @model.table_name = table_name
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,111 @@
1
+ require 'active_support/concern'
2
+ require 'active_model/validations'
3
+
4
+ module Ardm
5
+ module ActiveRecord
6
+ # Extend ActiveRecord to support DataMapper validations
7
+ module Validations
8
+ extend ActiveSupport::Concern
9
+
10
+ include ActiveModel::Validations
11
+
12
+ # Extract and convert options from DM style to AR style
13
+ def self.extract_options(fields, *keep)
14
+ keep += [:on, :message, :if, :unless]
15
+
16
+ if Hash === fields.last
17
+ ar = fields.pop.dup
18
+ ar[:on] = ar.delete(:when) if ar[:when] && [:create, :update].include?(ar[:when])
19
+ ar[:maximum] = ar.delete(:max) if ar[:max]
20
+ ar[:in] = ar.delete(:set) if ar[:set]
21
+
22
+ removed = ar.slice!(*keep)
23
+ unless removed.empty?
24
+ $stderr.puts "WARNING validation options not handled: #{removed.inspect} in:"
25
+ $stderr.puts caller[0..1]
26
+ end
27
+ else
28
+ ar = {}
29
+ end
30
+
31
+ [fields, ar]
32
+ end
33
+
34
+ module ClassMethods
35
+
36
+ def validates_belongs_to(*fields)
37
+ fields, options = Ardm::ActiveRecord::Validations.extract_options(fields)
38
+ validates *fields, presence: options
39
+ end
40
+
41
+ def validates_presence_of(*fields)
42
+ fields, options = Ardm::ActiveRecord::Validations.extract_options(fields)
43
+ validates *fields, presence: options
44
+ end
45
+
46
+ def validates_length_of(*fields)
47
+ fields, options = Ardm::ActiveRecord::Validations.extract_options(fields, :in, :within, :maximum, :minimum, :is)
48
+ validates *fields, length: options
49
+ end
50
+
51
+ def validates_uniqueness_of(*fields)
52
+ fields, options = Ardm::ActiveRecord::Validations.extract_options(fields, :scope)
53
+ fields = fields.map do |field|
54
+ if property = properties[field]
55
+ property.field
56
+ elsif assoc = reflect_on_association(field)
57
+ assoc.foreign_key
58
+ else
59
+ field
60
+ end
61
+ end
62
+
63
+ if options[:scope]
64
+ options[:scope] = Array(options[:scope]).map do |scope|
65
+ assoc = reflect_on_association(scope)
66
+ assoc ? assoc.foreign_key : scope
67
+ end
68
+ end
69
+
70
+ validates *fields, uniqueness: options
71
+ end
72
+
73
+ def validates_within(*fields)
74
+ fields, options = Ardm::ActiveRecord::Validations.extract_options(fields, :in)
75
+ validates *fields, inclusion: options
76
+ end
77
+
78
+ # Possible formats:
79
+ #
80
+ # validates_with_method :attr, :method_name
81
+ # validates_with_method :attr, method: :method_name
82
+ # validates_with_method :method_name, options: "here"
83
+ def validates_with_method(*fields)
84
+ fields, options = Ardm::ActiveRecord::Validations.extract_options(fields, :method)
85
+
86
+ # validates_with_method :attr, :method_name
87
+ att, meth = *fields
88
+
89
+ # validates_with_method :attr, method: :method_name
90
+ meth = options[:method] if options[:method]
91
+
92
+ # validates_with_method :method_name
93
+ att, meth = :base, att if !meth
94
+
95
+ validates_with_block(att) do
96
+ self.send(meth)
97
+ end
98
+ end
99
+
100
+ def validates_with_block(att=nil, &block)
101
+ validate do |record|
102
+ val, message = instance_eval(&block)
103
+ unless val
104
+ errors.add(att, message)
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,43 @@
1
+ puts __FILE__
2
+ require 'ardm'
3
+
4
+ # only load support libs in active record mode (dm will supply its own libs)
5
+ require 'ardm/support/ext/blank'
6
+ require 'ardm/support/ext/hash'
7
+ require 'ardm/support/ext/object'
8
+ require 'ardm/support/ext/string'
9
+
10
+ require 'ardm/support/ext/module'
11
+ require 'ardm/support/ext/array'
12
+ require 'ardm/support/ext/try_dup'
13
+
14
+ require 'ardm/support/mash'
15
+ require 'ardm/support/deprecate'
16
+ require 'ardm/support/descendant_set'
17
+ require 'ardm/support/equalizer'
18
+ require 'ardm/support/assertions'
19
+ require 'ardm/support/lazy_array'
20
+ require 'ardm/support/local_object_space'
21
+ require 'ardm/support/hook'
22
+ require 'ardm/support/subject'
23
+ require 'ardm/support/ordered_set'
24
+ require 'ardm/support/subject_set'
25
+ require 'ardm/support/descendant_set'
26
+
27
+ require 'active_record'
28
+ require 'active_record/relation'
29
+
30
+ require 'ardm/active_record/record'
31
+ require 'ardm/active_record/relation'
32
+
33
+ module Ardm
34
+ Record = Ardm::ActiveRecord::Record
35
+ end
36
+
37
+ #::ActiveRecord::Base.class_eval do
38
+ # include Ardm::ActiveRecord::Base
39
+ #end
40
+
41
+ ::ActiveRecord::Relation.class_eval do
42
+ include Ardm::ActiveRecord::Relation
43
+ end
@@ -0,0 +1,5 @@
1
+ module Ardm
2
+ class Record
3
+ NotFound = DataMapper::ObjectNotFoundError
4
+ end
5
+ end
@@ -0,0 +1,41 @@
1
+ require 'awsm/resource'
2
+
3
+ module Ardm
4
+ module DataMapper
5
+ module Record
6
+ extend ActiveSupport::Concern
7
+
8
+ NotFound = DataMapper::ObjectNotFoundError
9
+
10
+ module ClassMethods
11
+ def inherited(base)
12
+ base.send(:include, DataMapper::Resource)
13
+ base.send(:include, Awsm::Resource)
14
+ #base.send(:extend, DataMapper::CollectionRaise)
15
+
16
+ unless %w[Alert Association Nonce Account::Cancellation::Handler].include?(base.name)
17
+ base.timestamps :at
18
+ end
19
+ end
20
+
21
+ extend Forwardable
22
+ def datamapper() DataMapper end
23
+ def_delegators :datamapper, :repository, :finalize, :logger, :logger=
24
+
25
+ def execute_sql(sql)
26
+ DataMapper.repository.adapter.execute(sql)
27
+ end
28
+
29
+ def alias_attribute(new, old)
30
+ alias_method new, old
31
+ end
32
+
33
+ def attr_accessible(*attrs)
34
+ end
35
+
36
+ def abstract_class=(val)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,5 @@
1
+ require 'ardm/data_mapper/record'
2
+
3
+ module Ardm
4
+ Record = Ardm::DataMapper::Record
5
+ end
data/lib/ardm/env.rb ADDED
@@ -0,0 +1,5 @@
1
+ # Load Ardm based on the $ORM environment variable.
2
+ #
3
+ require 'ardm'
4
+ Ardm.orm = ENV['ORM']
5
+ require Ardm.lib
@@ -0,0 +1,30 @@
1
+ require 'ardm/property/string'
2
+
3
+ require 'digest/sha1'
4
+
5
+ module Ardm
6
+ class Property
7
+ class APIKey < String
8
+
9
+ # The amount of random seed data to use to generate tha API Key
10
+ PADDING = 256
11
+
12
+ length 40
13
+ unique true
14
+ default proc { APIKey.generate }
15
+
16
+ #
17
+ # Generates a new API Key.
18
+ #
19
+ # @return [String]
20
+ # The new API Key.
21
+ #
22
+ def self.generate
23
+ sha1 = Digest::SHA1.new
24
+
25
+ PADDING.times { sha1 << rand(256).chr }
26
+ return sha1.hexdigest
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+ require 'ardm/property/string'
2
+ require 'bcrypt'
3
+
4
+ module Ardm
5
+ class Property
6
+ class BCryptHash < String
7
+ load_as BCrypt::Password
8
+
9
+ length 60
10
+
11
+ def load(value)
12
+ unless value.nil?
13
+ begin
14
+ value_loaded?(value) ? value : BCrypt::Password.new(value)
15
+ rescue BCrypt::Errors::InvalidHash
16
+ BCrypt::Password.create(value, :cost => BCrypt::Engine::DEFAULT_COST)
17
+ end
18
+ end
19
+ end
20
+
21
+ def dump(value)
22
+ load(value)
23
+ end
24
+
25
+ def typecast(value)
26
+ load(value)
27
+ end
28
+
29
+ end # class BCryptHash
30
+ end # class Property
31
+ end # module Ardm
@@ -0,0 +1,23 @@
1
+ require 'ardm/property/string'
2
+
3
+ module Ardm
4
+ class Property
5
+ class Binary < String
6
+
7
+ if RUBY_VERSION >= "1.9"
8
+
9
+ def load(value)
10
+ super.dup.force_encoding("BINARY") unless value.nil?
11
+ end
12
+
13
+ def dump(value)
14
+ value.dup.force_encoding("BINARY") unless value.nil?
15
+ rescue
16
+ value
17
+ end
18
+
19
+ end
20
+
21
+ end # class Binary
22
+ end # class Property
23
+ end # module Ardm
@@ -0,0 +1,29 @@
1
+ require 'ardm/property/object'
2
+
3
+ module Ardm
4
+ class Property
5
+ class Boolean < Object
6
+ load_as ::TrueClass
7
+ dump_as ::TrueClass
8
+ coercion_method :to_boolean
9
+
10
+ def initialize(model, name, options = {})
11
+ # validates presence in rails fails for false.
12
+ # Boolean must therefore behave like a set.
13
+ options[:set] = [true, false]
14
+ super model, name, options
15
+ end
16
+
17
+ # @api semipublic
18
+ def value_dumped?(value)
19
+ value_loaded?(value)
20
+ end
21
+
22
+ # @api semipublic
23
+ def value_loaded?(value)
24
+ value == true || value == false
25
+ end
26
+
27
+ end # class Boolean
28
+ end # class Property
29
+ end # module Ardm
@@ -0,0 +1,19 @@
1
+ require 'ardm/property/object'
2
+
3
+ module Ardm
4
+ class Property
5
+ class Class < Object
6
+ load_as ::Class
7
+ dump_as ::Class
8
+ coercion_method :to_constant
9
+
10
+ # @api semipublic
11
+ def typecast(value)
12
+ Ardm::Ext::Module.find_const(model, value.to_s) unless value.nil?
13
+ rescue NameError
14
+ value
15
+ end
16
+
17
+ end # class Class
18
+ end # class Property
19
+ end # module Ardm
@@ -0,0 +1,28 @@
1
+ require 'ardm/property/yaml'
2
+
3
+ module Ardm
4
+ class Property
5
+ class CommaSeparatedList < Yaml
6
+
7
+ def dump(value)
8
+ if value.nil?
9
+ nil
10
+ elsif value.kind_of?(::Array)
11
+ super(value)
12
+ elsif value.kind_of?(::String)
13
+ v = []
14
+
15
+ value.split(',').each do |element|
16
+ element.strip!
17
+ v << element unless element.empty?
18
+ end
19
+
20
+ super(v)
21
+ else
22
+ raise ArgumentError, "+value+ of CommaSeparatedList must be a string, an array or nil, but given #{value.inspect}"
23
+ end
24
+ end # dump
25
+
26
+ end # CommaSeparatedList
27
+ end # Property
28
+ end # Ardm