Решение на Пета задача - DataModel от Иво Яков

Обратно към всички решения

Към профила на Иво Яков

Резултати

  • 0 точки от тестове
  • 0 бонус точки
  • 0 точки общо
  • 1 успешни тест(а)
  • 24 неуспешни тест(а)

Код

class HashStore
end
class ArrayStore
def create(data)
combined_data = {}
combined_data[:id] = @id
data = data.reduce {}, :merge
combined_data = combined_data.merge(data)
@arrstore << combined_data
@id += 1
end
def initialize
@id = 0
@arrstore = []
end
end
class DataModel
def self.attributes(*new_attr)
new_attr.each do |name|
instance_variable_set('@' + name.to_s, nil)
attr_accessor name.to_sym
end
end
def self.data_store(new_store)
@dt_store = new_store
end
def data_store
@store
end
def initialize
@store = @dt_store
end
def save
variables =
instance_variables.map do |attribute|
{ attribute => self.instance_variable_get(attribute) }
end
variables[0] = {'objectID' => self.object_id}
@store.create(variables)
end
end

Лог от изпълнението

.FFFFFFFFFFFFFFFFFFFFFFFF

Failures:

  1) DataModel has attributes and data_model getters
     Failure/Error: expect(user_model.attributes).to include :first_name
       expected [] to include :first_name
       Diff:
       @@ -1,2 +1,2 @@
       -[:first_name]
       +[]
     # /tmp/d20161202-15620-ppii8z/spec.rb:22:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  2) DataModel accepts attributes when initializing
     Failure/Error: record = user_model.new(
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # /tmp/d20161202-15620-ppii8z/solution.rb:36:in `initialize'
     # /tmp/d20161202-15620-ppii8z/spec.rb:28:in `new'
     # /tmp/d20161202-15620-ppii8z/spec.rb:28:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  3) DataModel has #find_by_<attribute> methods
     Failure/Error: record = user_model.new(first_name: 'Ivan', last_name: 'Ivanov')
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # /tmp/d20161202-15620-ppii8z/solution.rb:36:in `initialize'
     # /tmp/d20161202-15620-ppii8z/spec.rb:40:in `new'
     # /tmp/d20161202-15620-ppii8z/spec.rb:40:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  4) DataModel id generation creates id on first save and does not change it
     Failure/Error: record = user_model.new(first_name: 'Ivan', last_name: 'Ivanov')
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # /tmp/d20161202-15620-ppii8z/solution.rb:36:in `initialize'
     # /tmp/d20161202-15620-ppii8z/spec.rb:49:in `new'
     # /tmp/d20161202-15620-ppii8z/spec.rb:49:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  5) DataModel id generation does not reuse ids
     Failure/Error: ivan = user_model.new(first_name: 'Ivan')
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # /tmp/d20161202-15620-ppii8z/solution.rb:36:in `initialize'
     # /tmp/d20161202-15620-ppii8z/spec.rb:63:in `new'
     # /tmp/d20161202-15620-ppii8z/spec.rb:63:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  6) DataModel id generation does not break when there are two models with the same store
     Failure/Error: ivan = user_model.new(first_name: 'Ivan')
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # /tmp/d20161202-15620-ppii8z/solution.rb:36:in `initialize'
     # /tmp/d20161202-15620-ppii8z/spec.rb:81:in `new'
     # /tmp/d20161202-15620-ppii8z/spec.rb:81:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  7) DataModel equality comparison compares by id if both records are saved
     Failure/Error: ivan = user_model.new(first_name: 'Ivan')
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # /tmp/d20161202-15620-ppii8z/solution.rb:36:in `initialize'
     # /tmp/d20161202-15620-ppii8z/spec.rb:93:in `new'
     # /tmp/d20161202-15620-ppii8z/spec.rb:93:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  8) DataModel equality comparison uses #equal? if there are no ids
     Failure/Error: first_user  = user_model.new(first_name: 'Ivan')
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # /tmp/d20161202-15620-ppii8z/solution.rb:36:in `initialize'
     # /tmp/d20161202-15620-ppii8z/spec.rb:109:in `new'
     # /tmp/d20161202-15620-ppii8z/spec.rb:109:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  9) DataModel.where finds records by attributes
     Failure/Error: user_model.new(first_name: 'Ivan', last_name: 'Ivanov').save
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # /tmp/d20161202-15620-ppii8z/solution.rb:36:in `initialize'
     # /tmp/d20161202-15620-ppii8z/spec.rb:119:in `new'
     # /tmp/d20161202-15620-ppii8z/spec.rb:119:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  10) DataModel.where finds records by multiple attributes
     Failure/Error: user_model.new(first_name: 'Ivan', last_name: 'Ivanov').save
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # /tmp/d20161202-15620-ppii8z/solution.rb:36:in `initialize'
     # /tmp/d20161202-15620-ppii8z/spec.rb:119:in `new'
     # /tmp/d20161202-15620-ppii8z/spec.rb:119:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  11) DataModel.where returns empty collection when nothing is found
     Failure/Error: user_model.new(first_name: 'Ivan', last_name: 'Ivanov').save
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # /tmp/d20161202-15620-ppii8z/solution.rb:36:in `initialize'
     # /tmp/d20161202-15620-ppii8z/spec.rb:119:in `new'
     # /tmp/d20161202-15620-ppii8z/spec.rb:119:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  12) DataModel.where raises an error if the query is by an unknown key
     Failure/Error: user_model.new(first_name: 'Ivan', last_name: 'Ivanov').save
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # /tmp/d20161202-15620-ppii8z/solution.rb:36:in `initialize'
     # /tmp/d20161202-15620-ppii8z/spec.rb:119:in `new'
     # /tmp/d20161202-15620-ppii8z/spec.rb:119:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  13) DataModel#delete deletes only the record for which it is called
     Failure/Error: ivan = user_model.new(first_name: 'Ivan').save
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # /tmp/d20161202-15620-ppii8z/solution.rb:36:in `initialize'
     # /tmp/d20161202-15620-ppii8z/spec.rb:152:in `new'
     # /tmp/d20161202-15620-ppii8z/spec.rb:152:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  14) DataModel#delete raises an error if the record is not saved
     Failure/Error: DataModel::DeleteUnsavedRecordError
     NameError:
       uninitialized constant DataModel::DeleteUnsavedRecordError
     # /tmp/d20161202-15620-ppii8z/spec.rb:164:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  15) HashStore behaves like a data store #create saves a new record
     Failure/Error: store.create(user)
     NoMethodError:
       undefined method `create' for #<HashStore:0x007fd17a9dfa28>
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-ppii8z/spec.rb:235
     # /tmp/d20161202-15620-ppii8z/spec.rb:176:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  16) HashStore behaves like a data store #find can find elements by attributes
     Failure/Error: store.create(user)
     NoMethodError:
       undefined method `create' for #<HashStore:0x007fd17a9d63b0>
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-ppii8z/spec.rb:235
     # /tmp/d20161202-15620-ppii8z/spec.rb:185:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  17) HashStore behaves like a data store #update updates the attributes of a record with a given ID
     Failure/Error: store.create(user)
     NoMethodError:
       undefined method `create' for #<HashStore:0x007fd17a9d1ea0>
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-ppii8z/spec.rb:235
     # /tmp/d20161202-15620-ppii8z/spec.rb:198:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  18) HashStore behaves like a data store #update only updates records with the correct IDs
     Failure/Error: store.create(georgi)
     NoMethodError:
       undefined method `create' for #<HashStore:0x007fd17a9c61b8>
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-ppii8z/spec.rb:235
     # /tmp/d20161202-15620-ppii8z/spec.rb:207:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  19) HashStore behaves like a data store #delete can delete multiple records with a single query
     Failure/Error: store.create(first_pesho)
     NoMethodError:
       undefined method `create' for #<HashStore:0x007fd17a9b7ac8>
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-ppii8z/spec.rb:235
     # /tmp/d20161202-15620-ppii8z/spec.rb:223:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  20) ArrayStore behaves like a data store #create saves a new record
     Failure/Error: store.create(user)
     TypeError:
       no implicit conversion of Array into Hash
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-ppii8z/spec.rb:239
     # /tmp/d20161202-15620-ppii8z/solution.rb:9:in `merge'
     # /tmp/d20161202-15620-ppii8z/solution.rb:9:in `create'
     # /tmp/d20161202-15620-ppii8z/spec.rb:176:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  21) ArrayStore behaves like a data store #find can find elements by attributes
     Failure/Error: store.create(user)
     TypeError:
       no implicit conversion of Array into Hash
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-ppii8z/spec.rb:239
     # /tmp/d20161202-15620-ppii8z/solution.rb:9:in `merge'
     # /tmp/d20161202-15620-ppii8z/solution.rb:9:in `create'
     # /tmp/d20161202-15620-ppii8z/spec.rb:185:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  22) ArrayStore behaves like a data store #update updates the attributes of a record with a given ID
     Failure/Error: store.create(user)
     TypeError:
       no implicit conversion of Array into Hash
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-ppii8z/spec.rb:239
     # /tmp/d20161202-15620-ppii8z/solution.rb:9:in `merge'
     # /tmp/d20161202-15620-ppii8z/solution.rb:9:in `create'
     # /tmp/d20161202-15620-ppii8z/spec.rb:198:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  23) ArrayStore behaves like a data store #update only updates records with the correct IDs
     Failure/Error: store.create(georgi)
     TypeError:
       no implicit conversion of Array into Hash
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-ppii8z/spec.rb:239
     # /tmp/d20161202-15620-ppii8z/solution.rb:9:in `merge'
     # /tmp/d20161202-15620-ppii8z/solution.rb:9:in `create'
     # /tmp/d20161202-15620-ppii8z/spec.rb:207:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  24) ArrayStore behaves like a data store #delete can delete multiple records with a single query
     Failure/Error: store.create(first_pesho)
     TypeError:
       no implicit conversion of Array into Hash
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-ppii8z/spec.rb:239
     # /tmp/d20161202-15620-ppii8z/solution.rb:9:in `merge'
     # /tmp/d20161202-15620-ppii8z/solution.rb:9:in `create'
     # /tmp/d20161202-15620-ppii8z/spec.rb:223:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

Finished in 0.01896 seconds
25 examples, 24 failures

Failed examples:

rspec /tmp/d20161202-15620-ppii8z/spec.rb:21 # DataModel has attributes and data_model getters
rspec /tmp/d20161202-15620-ppii8z/spec.rb:27 # DataModel accepts attributes when initializing
rspec /tmp/d20161202-15620-ppii8z/spec.rb:39 # DataModel has #find_by_<attribute> methods
rspec /tmp/d20161202-15620-ppii8z/spec.rb:48 # DataModel id generation creates id on first save and does not change it
rspec /tmp/d20161202-15620-ppii8z/spec.rb:62 # DataModel id generation does not reuse ids
rspec /tmp/d20161202-15620-ppii8z/spec.rb:74 # DataModel id generation does not break when there are two models with the same store
rspec /tmp/d20161202-15620-ppii8z/spec.rb:92 # DataModel equality comparison compares by id if both records are saved
rspec /tmp/d20161202-15620-ppii8z/spec.rb:108 # DataModel equality comparison uses #equal? if there are no ids
rspec /tmp/d20161202-15620-ppii8z/spec.rb:124 # DataModel.where finds records by attributes
rspec /tmp/d20161202-15620-ppii8z/spec.rb:129 # DataModel.where finds records by multiple attributes
rspec /tmp/d20161202-15620-ppii8z/spec.rb:138 # DataModel.where returns empty collection when nothing is found
rspec /tmp/d20161202-15620-ppii8z/spec.rb:142 # DataModel.where raises an error if the query is by an unknown key
rspec /tmp/d20161202-15620-ppii8z/spec.rb:151 # DataModel#delete deletes only the record for which it is called
rspec /tmp/d20161202-15620-ppii8z/spec.rb:162 # DataModel#delete raises an error if the record is not saved
rspec /tmp/d20161202-15620-ppii8z/spec.rb:174 # HashStore behaves like a data store #create saves a new record
rspec /tmp/d20161202-15620-ppii8z/spec.rb:183 # HashStore behaves like a data store #find can find elements by attributes
rspec /tmp/d20161202-15620-ppii8z/spec.rb:196 # HashStore behaves like a data store #update updates the attributes of a record with a given ID
rspec /tmp/d20161202-15620-ppii8z/spec.rb:204 # HashStore behaves like a data store #update only updates records with the correct IDs
rspec /tmp/d20161202-15620-ppii8z/spec.rb:218 # HashStore behaves like a data store #delete can delete multiple records with a single query
rspec /tmp/d20161202-15620-ppii8z/spec.rb:174 # ArrayStore behaves like a data store #create saves a new record
rspec /tmp/d20161202-15620-ppii8z/spec.rb:183 # ArrayStore behaves like a data store #find can find elements by attributes
rspec /tmp/d20161202-15620-ppii8z/spec.rb:196 # ArrayStore behaves like a data store #update updates the attributes of a record with a given ID
rspec /tmp/d20161202-15620-ppii8z/spec.rb:204 # ArrayStore behaves like a data store #update only updates records with the correct IDs
rspec /tmp/d20161202-15620-ppii8z/spec.rb:218 # ArrayStore behaves like a data store #delete can delete multiple records with a single query

История (1 версия и 0 коментара)

Иво обнови решението на 01.12.2016 18:28 (преди около 8 години)

+
+class HashStore
+end
+class ArrayStore
+ def create(data)
+ combined_data = {}
+ combined_data[:id] = @id
+ data = data.reduce {}, :merge
+ combined_data = combined_data.merge(data)
+ @arrstore << combined_data
+ @id += 1
+ end
+
+ def initialize
+ @id = 0
+ @arrstore = []
+ end
+end
+
+class DataModel
+ def self.attributes(*new_attr)
+ new_attr.each do |name|
+ instance_variable_set('@' + name.to_s, nil)
+ attr_accessor name.to_sym
+ end
+ end
+
+ def self.data_store(new_store)
+ @dt_store = new_store
+ end
+
+ def data_store
+ @store
+ end
+
+ def initialize
+ @store = @dt_store
+ end
+
+ def save
+ variables =
+ instance_variables.map do |attribute|
+ { attribute => self.instance_variable_get(attribute) }
+ end
+
+ variables[0] = {'objectID' => self.object_id}
+ @store.create(variables)
+ end
+end