Class: ActiveMocker::Base
- Inherits:
-
Object
- Object
- ActiveMocker::Base
- Extended by:
- AliasAttribute, MockableMethod, Queries
- Defined in:
- lib/active_mocker/mock/base.rb,
lib/active_mocker/mock/compatibility/base/ar51.rb
Defined Under Namespace
Modules: AR51, PropertiesGetterAndSetter, Scopes Classes: ScopeRelation
Instance Attribute Summary collapse
- #_create_caller_locations ⇒ Object
-
#associations ⇒ Object
readonly
Returns the value of attribute associations.
-
#attributes ⇒ Object
readonly
Returns the value of attribute attributes.
-
#types ⇒ Object
readonly
Returns the value of attribute types.
Class Method Summary collapse
- .__active_record_build_version__ ⇒ Object
-
.__new_relation__(collection) ⇒ ScopeRelation
For the given mock so that it will include any scoped methods.
- ._find_associations_by_class(klass_name) ⇒ Object
- .abstract_class? ⇒ Boolean
- .build_type(type) ⇒ Object
- .classes(klass, fail_hard = false) ⇒ Object
- .clear_mock ⇒ Object deprecated Deprecated.
-
.create(attributes = {}, &block) ⇒ Object
(also: create!)
Creates an object (or multiple objects) and saves it to memory.
-
.delete(id) ⇒ Object
Delete an object (or multiple objects) that has the given id.
-
.delete_all(conditions = nil) ⇒ Object
(also: destroy_all)
Deletes the records matching
conditions. -
.destroy ⇒ Object
Delete an object (or multiple objects) that has the given id.
- .from_limit? ⇒ Boolean private
- .inherited(subclass) ⇒ Object
- .records ⇒ Object
-
.reflections ⇒ Object
Not fully Implemented Returns association reflections names with nil values.
Instance Method Summary collapse
- #_assign_attribute(k, v) ⇒ Object private
-
#assign_attributes(new_attributes) {|_self| ... } ⇒ Object
(also: #attributes=)
Allows you to set all the attributes by passing in a hash of attributes with keys matching the attribute names (which again matches the column names).
-
#attribute_names ⇒ Object
Returns an array of names for the attributes available on this object.
-
#attribute_present?(attribute) ⇒ Boolean
Returns
trueif the specifiedattributehas been set and is neithernilnorempty?(the latter only applies to objects that respond toempty?, most notably Strings). - #delete ⇒ Object (also: #destroy)
-
#freeze ⇒ Object
Will not allow attributes to be changed.
-
#has_attribute?(attr_name) ⇒ Boolean
Returns
trueif the given attribute is in the attributes hash, otherwisefalse. -
#initialize(attributes = {}, &block) ⇒ Base
constructor
New objects can be instantiated as either empty (pass no construction parameter) or pre-set with attributes.
- #inspect ⇒ Object
-
#new_record? ⇒ Boolean
Returns true if this object hasn’t been saved yet; otherwise, returns false.
-
#persisted? ⇒ Boolean
Indicates if the model is persisted.
- #save(*_args) ⇒ Object (also: #save!)
-
#slice(*methods) ⇒ Object
Returns a hash of the given methods with their names as keys and returned values as values.
- #touch(*names) ⇒ Object
- #update(attributes = {}) ⇒ Object
Methods included from Queries
all, average, count, delete_all, find, find_by, find_by!, find_or_create_by, find_or_initialize_by, first_or_create, first_or_create!, first_or_initialize, limit, maximum, minimum, none, order, reverse_order, sum, update_all, where
Methods included from LateInclusion
#__extended_onto__, #__included_onto__, #extended, #included
Methods included from AliasAttribute
attribute_alias, attribute_alias?
Methods included from PropertiesGetterAndSetter
#read_attribute, #write_attribute
Methods included from TemplateMethods
Methods included from DoNothingActiveRecordMethods
#destroyed?, #errors, included, #marked_for_destruction?, #readonly?, #reload, #valid?
Constructor Details
#initialize(attributes = {}, &block) ⇒ Base
New objects can be instantiated as either empty (pass no construction parameter) or pre-set with attributes.
Example:
# Instantiates a single new object
UserMock.new(first_name: 'Jamie')
190 191 192 193 194 195 196 |
# File 'lib/active_mocker/mock/base.rb', line 190 def initialize(attributes = {}, &block) if self.class.abstract_class? raise NotImplementedError, "#{self.class.name} is an abstract class and cannot be instantiated." end setup_instance_variables assign_attributes(attributes, &block) end |
Instance Attribute Details
#_create_caller_locations ⇒ Object
182 183 184 |
# File 'lib/active_mocker/mock/base.rb', line 182 def _create_caller_locations @_create_caller_locations end |
#associations ⇒ Object (readonly)
Returns the value of attribute associations.
180 181 182 |
# File 'lib/active_mocker/mock/base.rb', line 180 def associations @associations end |
#attributes ⇒ Object (readonly)
Returns the value of attribute attributes.
180 181 182 |
# File 'lib/active_mocker/mock/base.rb', line 180 def attributes @attributes end |
#types ⇒ Object (readonly)
Returns the value of attribute types.
180 181 182 |
# File 'lib/active_mocker/mock/base.rb', line 180 def types @types end |
Class Method Details
.__active_record_build_version__ ⇒ Object
146 147 148 |
# File 'lib/active_mocker/mock/base.rb', line 146 def __active_record_build_version__ @active_record_build_version end |
.__new_relation__(collection) ⇒ ScopeRelation
Returns for the given mock so that it will include any scoped methods.
121 122 123 |
# File 'lib/active_mocker/mock/base.rb', line 121 def __new_relation__(collection) ScopeRelation.new(collection) end |
._find_associations_by_class(klass_name) ⇒ Object
134 135 136 |
# File 'lib/active_mocker/mock/base.rb', line 134 def _find_associations_by_class(klass_name) associations_by_class[klass_name.to_s] end |
.abstract_class? ⇒ Boolean
103 104 105 |
# File 'lib/active_mocker/mock/base.rb', line 103 def abstract_class? true end |
.build_type(type) ⇒ Object
107 108 109 110 |
# File 'lib/active_mocker/mock/base.rb', line 107 def build_type(type) @@built_types ||= {} @@built_types[type] ||= Virtus::Attribute.build(type) end |
.classes(klass, fail_hard = false) ⇒ Object
112 113 114 115 116 117 |
# File 'lib/active_mocker/mock/base.rb', line 112 def classes(klass, fail_hard=false) ActiveMocker::LoadedMocks.find(klass).tap do |found_class| raise MockNotLoaded, "The ActiveMocker version of #{klass} is not required." if fail_hard && !found_class found_class end end |
.clear_mock ⇒ Object
130 131 132 |
# File 'lib/active_mocker/mock/base.rb', line 130 def clear_mock delete_all end |
.create(attributes = {}, &block) ⇒ Object Also known as: create!
Creates an object (or multiple objects) and saves it to memory.
The attributes parameter can be either a Hash or an Array of Hashes. These Hashes describe the attributes on the objects that are to be created.
Examples
# Create a single new object
User.create(first_name: 'Jamie')
# Create an Array of new objects
User.create([{ first_name: 'Jamie' }, { first_name: 'Jeremy' }])
# Create a single object and pass it into a block to set other attributes.
User.create(first_name: 'Jamie') do |u|
u.is_admin = false
end
# Creating an Array of new objects using a block, where the block is executed for each object:
User.create([{ first_name: 'Jamie' }, { first_name: 'Jeremy' }]) do |u|
u.is_admin = false
end
37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/active_mocker/mock/base.rb', line 37 def create(attributes = {}, &block) if attributes.is_a?(Array) attributes.collect { |attr| create(attr, &block) } else record = new(id: attributes.delete(:id) || attributes.delete("id")) record.save record.touch(:created_at, :created_on) if ActiveMocker::LoadedMocks.features[:timestamps] record.assign_attributes(attributes, &block) record._create_caller_locations = caller_locations record end end |
.delete(id) ⇒ Object
Delete an object (or multiple objects) that has the given id.
This essentially finds the object (or multiple objects) with the given id and then calls delete on it.
Parameters
-
id- Can be either an Integer or an Array of Integers.
Examples
# Destroy a single object
TodoMock.delete(1)
# Destroy multiple objects
todos = [1,2,3]
TodoMock.delete(todos)
78 79 80 81 82 83 84 |
# File 'lib/active_mocker/mock/base.rb', line 78 def delete(id) if id.is_a?(Array) id.map { |one_id| delete(one_id) } else find(id).delete end end |
.delete_all(conditions = nil) ⇒ Object Also known as: destroy_all
Deletes the records matching conditions.
Post.where(person_id: 5).where(category: ['Something', 'Else']).delete_all
91 92 93 94 |
# File 'lib/active_mocker/mock/base.rb', line 91 def delete_all(conditions = nil) return records.reset if conditions.nil? super end |
.destroy ⇒ Object
Delete an object (or multiple objects) that has the given id.
This essentially finds the object (or multiple objects) with the given id and then calls delete on it.
Parameters
-
id- Can be either an Integer or an Array of Integers.
Examples
# Destroy a single object
TodoMock.delete(1)
# Destroy multiple objects
todos = [1,2,3]
TodoMock.delete(todos)
86 87 88 89 90 91 92 |
# File 'lib/active_mocker/mock/base.rb', line 86 def delete(id) if id.is_a?(Array) id.map { |one_id| delete(one_id) } else find(id).delete end end |
.from_limit? ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
99 100 101 |
# File 'lib/active_mocker/mock/base.rb', line 99 def from_limit? false end |
.inherited(subclass) ⇒ Object
11 12 13 |
# File 'lib/active_mocker/mock/base.rb', line 11 def self.inherited(subclass) ActiveMocker::LoadedMocks.send(:add, subclass) end |
.records ⇒ Object
53 54 55 |
# File 'lib/active_mocker/mock/base.rb', line 53 def records @records ||= Records.new end |
.reflections ⇒ Object
Not fully Implemented Returns association reflections names with nil values
#=> { "user" => nil, "order" => nil }
142 143 144 |
# File 'lib/active_mocker/mock/base.rb', line 142 def reflections associations.each_with_object({}) { |(k, _), h| h[k.to_s] = nil } end |
Instance Method Details
#_assign_attribute(k, v) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
235 236 237 238 239 240 241 242 243 |
# File 'lib/active_mocker/mock/base.rb', line 235 def _assign_attribute(k, v) public_send("#{k}=", v) rescue NoMethodError if respond_to?("#{k}=") raise else raise UnknownAttributeError.new(self, k) end end |
#assign_attributes(new_attributes) {|_self| ... } ⇒ Object Also known as: attributes=
Allows you to set all the attributes by passing in a hash of attributes with keys matching the attribute names (which again matches the column names).
cat = Cat.new(name: "Gorby", status: "yawning")
cat.attributes # => { "name" => "Gorby", "status" => "yawning", "created_at" => nil, "updated_at" => nil}
cat.assign_attributes(status: "sleeping")
cat.attributes # => { "name" => "Gorby", "status" => "sleeping", "created_at" => nil, "updated_at" => nil }
Aliased to attributes=.
220 221 222 223 224 225 226 227 228 229 230 |
# File 'lib/active_mocker/mock/base.rb', line 220 def assign_attributes(new_attributes) yield self if block_given? unless new_attributes.respond_to?(:stringify_keys) raise ArgumentError, "When assigning attributes, you must pass a hash as an argument." end return nil if new_attributes.blank? attributes = new_attributes.stringify_keys attributes.each do |k, v| _assign_attribute(k, v) end end |
#attribute_names ⇒ Object
Returns an array of names for the attributes available on this object.
person = Person.new
person.attribute_names
# => ["id", "created_at", "updated_at", "name", "age"]
331 332 333 |
# File 'lib/active_mocker/mock/base.rb', line 331 def attribute_names self.class.attribute_names end |
#attribute_present?(attribute) ⇒ Boolean
Returns true if the specified attribute has been set and is neither nil nor empty? (the latter only applies to objects that respond to empty?, most notably Strings). Otherwise, false. Note that it always returns true with boolean attributes.
person = Task.new(title: '', is_done: false)
person.attribute_present?(:title) # => false
person.attribute_present?(:is_done) # => true
person.name = 'Francesco'
person.is_done = true
person.attribute_present?(:title) # => true
person.attribute_present?(:is_done) # => true
316 317 318 319 |
# File 'lib/active_mocker/mock/base.rb', line 316 def attribute_present?(attribute) value = read_attribute(attribute) !value.nil? && !(value.respond_to?(:empty?) && value.empty?) end |
#delete ⇒ Object Also known as: destroy
274 275 276 |
# File 'lib/active_mocker/mock/base.rb', line 274 def delete records.delete(self) end |
#freeze ⇒ Object
Will not allow attributes to be changed
Will freeze attributes forever. Querying for the record again will not unfreeze it because records exist in memory and are not initialized upon a query. This behaviour differs from ActiveRecord, beware of any side effect this may have when using this method.
344 345 346 |
# File 'lib/active_mocker/mock/base.rb', line 344 def freeze @attributes.freeze; self end |
#has_attribute?(attr_name) ⇒ Boolean
Returns true if the given attribute is in the attributes hash, otherwise false.
person = Person.new
person.has_attribute?(:name) # => true
person.has_attribute?('age') # => true
person.has_attribute?(:nothing) # => false
301 302 303 |
# File 'lib/active_mocker/mock/base.rb', line 301 def has_attribute?(attr_name) @attributes.key?(attr_name.to_s) end |
#inspect ⇒ Object
335 336 337 |
# File 'lib/active_mocker/mock/base.rb', line 335 def inspect ObjectInspect.new(name, attributes).to_s end |
#new_record? ⇒ Boolean
Returns true if this object hasn’t been saved yet; otherwise, returns false.
283 284 285 |
# File 'lib/active_mocker/mock/base.rb', line 283 def new_record? records.new_record?(self) end |
#persisted? ⇒ Boolean
Indicates if the model is persisted. Default is false.
person = Person.new(id: 1, name: 'bob')
person.persisted? # => false
291 292 293 |
# File 'lib/active_mocker/mock/base.rb', line 291 def persisted? records.persisted?(id) end |
#save(*_args) ⇒ Object Also known as: save!
245 246 247 248 249 |
# File 'lib/active_mocker/mock/base.rb', line 245 def save(*_args) self.class.send(:insert, self) unless self.class.exists?(self) touch if ActiveMocker::LoadedMocks.features[:timestamps] true end |
#slice(*methods) ⇒ Object
Returns a hash of the given methods with their names as keys and returned values as values.
322 323 324 |
# File 'lib/active_mocker/mock/base.rb', line 322 def slice(*methods) Hash[methods.map! { |method| [method, public_send(method)] }].with_indifferent_access end |
#touch(*names) ⇒ Object
253 254 255 256 257 258 259 260 261 262 263 264 265 266 |
# File 'lib/active_mocker/mock/base.rb', line 253 def touch(*names) raise ActiveMocker::Error, "cannot touch on a new record object" unless persisted? attributes = [:updated_at, :update_on] attributes.concat(names) current_time = Time.now.utc attributes.each do |column| column = column.to_s write_attribute(column, current_time) if self.class.attribute_names.include?(column) end true end |
#update(attributes = {}) ⇒ Object
206 207 208 209 |
# File 'lib/active_mocker/mock/base.rb', line 206 def update(attributes = {}) assign_attributes(attributes) save end |