Решение на Пета задача - DataModel от Цветан Христов

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

Към профила на Цветан Христов

Резултати

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

Код

# => Not enough time :(
# => To-do: write solution
class DataModel
def initialize(attrs = {})
end
def save
end
def delete
end
class << self
def data_store(storage)
end
def attributes(*attrs)
hash = {}
attrs.each do |attribute|
define_method "#{attribute}=" do |arg|
hash[attribute] = arg
end
define_method attribute do
hash[attribute]
end
end
hash
end
def where
end
end
end
class ArrayStore
attr_accessor :id
attr_reader :storage
def initialize
@id
@storage = []
end
def create
end
def find
end
def update
end
def delete
end
end
class HashStore
attr_accessor :id
attr_reader :storage
def initialize
@id
@storage = {}
end
def create
end
def find
end
def update
end
def delete
end
end

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

.FFFFFFF.FFFFFFFFFFFFFFFF

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 @@
       -[:first_name]
     # /tmp/d20161202-15620-6kropn/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: expect(record.first_name).to eq 'Pesho'
       
       expected: "Pesho"
            got: nil
       
       (compared using ==)
     # /tmp/d20161202-15620-6kropn/spec.rb:34: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: expect(user_model.find_by_first_name('Ivan').map(&:id)).to eq [record.id]
     NoMethodError:
       undefined method `find_by_first_name' for #<Class:0x007f0deaf74758>
     # /tmp/d20161202-15620-6kropn/spec.rb:43: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: expect(record.id).to be nil
     NoMethodError:
       undefined method `id' for #<#<Class:0x007f0deaf6e470>:0x007f0deaf6da70>
     # /tmp/d20161202-15620-6kropn/spec.rb:50: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: expect(ivan.id).to eq 1
     NoMethodError:
       undefined method `id' for #<#<Class:0x007f0deaf68cc8>:0x007f0deaf67aa8>
     # /tmp/d20161202-15620-6kropn/spec.rb:65: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: expect(ivan.id).to eq 1
     NoMethodError:
       undefined method `id' for #<#<Class:0x007f0deaee2ce0>:0x007f0deaee1020>
     # /tmp/d20161202-15620-6kropn/spec.rb:83: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: modified_ivan = user_model.where(id: ivan.id).first
     NoMethodError:
       undefined method `id' for #<#<Class:0x007f0deaf49be8>:0x007f0deaf429b0>
     # /tmp/d20161202-15620-6kropn/spec.rb:102: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.where finds records by attributes
     Failure/Error: records = user_model.where(first_name: 'Ivan').map(&:last_name)
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # /tmp/d20161202-15620-6kropn/solution.rb:30:in `where'
     # /tmp/d20161202-15620-6kropn/spec.rb:125: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 multiple attributes
     Failure/Error: records = user_model.where(
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # /tmp/d20161202-15620-6kropn/solution.rb:30:in `where'
     # /tmp/d20161202-15620-6kropn/spec.rb:130: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 returns empty collection when nothing is found
     Failure/Error: expect(user_model.where(first_name: 'Petar')).to be_empty
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # /tmp/d20161202-15620-6kropn/solution.rb:30:in `where'
     # /tmp/d20161202-15620-6kropn/spec.rb:139: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 raises an error if the query is by an unknown key
     Failure/Error: DataModel::UnknownAttributeError,
     NameError:
       uninitialized constant DataModel::UnknownAttributeError
     # /tmp/d20161202-15620-6kropn/spec.rb:144: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#delete deletes only the record for which it is called
     Failure/Error: ivan.delete
     NoMethodError:
       undefined method `delete' for nil:NilClass
     # /tmp/d20161202-15620-6kropn/spec.rb:156: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 raises an error if the record is not saved
     Failure/Error: DataModel::DeleteUnsavedRecordError
     NameError:
       uninitialized constant DataModel::DeleteUnsavedRecordError
     # /tmp/d20161202-15620-6kropn/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)>'

  14) HashStore behaves like a data store #create saves a new record
     Failure/Error: store.create(user)
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-6kropn/spec.rb:235
     # /tmp/d20161202-15620-6kropn/solution.rb:66:in `create'
     # /tmp/d20161202-15620-6kropn/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)>'

  15) HashStore behaves like a data store #find can find elements by attributes
     Failure/Error: store.create(user)
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-6kropn/spec.rb:235
     # /tmp/d20161202-15620-6kropn/solution.rb:66:in `create'
     # /tmp/d20161202-15620-6kropn/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)>'

  16) HashStore behaves like a data store #update updates the attributes of a record with a given ID
     Failure/Error: store.create(user)
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-6kropn/spec.rb:235
     # /tmp/d20161202-15620-6kropn/solution.rb:66:in `create'
     # /tmp/d20161202-15620-6kropn/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)>'

  17) HashStore behaves like a data store #update only updates records with the correct IDs
     Failure/Error: store.create(georgi)
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-6kropn/spec.rb:235
     # /tmp/d20161202-15620-6kropn/solution.rb:66:in `create'
     # /tmp/d20161202-15620-6kropn/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)>'

  18) HashStore behaves like a data store #delete can delete multiple records with a single query
     Failure/Error: store.create(first_pesho)
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-6kropn/spec.rb:235
     # /tmp/d20161202-15620-6kropn/solution.rb:66:in `create'
     # /tmp/d20161202-15620-6kropn/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)>'

  19) ArrayStore behaves like a data store #create saves a new record
     Failure/Error: store.create(user)
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-6kropn/spec.rb:239
     # /tmp/d20161202-15620-6kropn/solution.rb:44:in `create'
     # /tmp/d20161202-15620-6kropn/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)>'

  20) ArrayStore behaves like a data store #find can find elements by attributes
     Failure/Error: store.create(user)
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-6kropn/spec.rb:239
     # /tmp/d20161202-15620-6kropn/solution.rb:44:in `create'
     # /tmp/d20161202-15620-6kropn/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)>'

  21) ArrayStore behaves like a data store #update updates the attributes of a record with a given ID
     Failure/Error: store.create(user)
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-6kropn/spec.rb:239
     # /tmp/d20161202-15620-6kropn/solution.rb:44:in `create'
     # /tmp/d20161202-15620-6kropn/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)>'

  22) ArrayStore behaves like a data store #update only updates records with the correct IDs
     Failure/Error: store.create(georgi)
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-6kropn/spec.rb:239
     # /tmp/d20161202-15620-6kropn/solution.rb:44:in `create'
     # /tmp/d20161202-15620-6kropn/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)>'

  23) ArrayStore behaves like a data store #delete can delete multiple records with a single query
     Failure/Error: store.create(first_pesho)
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     Shared Example Group: "a data store" called from /tmp/d20161202-15620-6kropn/spec.rb:239
     # /tmp/d20161202-15620-6kropn/solution.rb:44:in `create'
     # /tmp/d20161202-15620-6kropn/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.02032 seconds
25 examples, 23 failures

Failed examples:

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

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

Цветан обнови решението на 01.12.2016 23:26 (преди над 7 години)

+# => Not enough time :(
+# => To-do: write solution
+class DataModel
+ def initialize(attrs = {})
+ end
+
+ def save
+ end
+
+ def delete
+ end
+
+ class << self
+ def data_store(storage)
+ end
+
+ def attributes(*attrs)
+ hash = {}
+ attrs.each do |attribute|
+ define_method "#{attribute}=" do |arg|
+ hash[attribute] = arg
+ end
+ define_method attribute do
+ hash[attribute]
+ end
+ end
+ hash
+ end
+
+ def where
+ end
+ end
+end
+
+class ArrayStore
+ attr_accessor :id
+ attr_reader :storage
+
+ def initialize
+ @id
+ @storage = []
+ end
+
+ def create
+ end
+
+ def find
+ end
+
+ def update
+ end
+
+ def delete
+ end
+end
+
+class HashStore
+ attr_accessor :id
+ attr_reader :storage
+
+ def initialize
+ @id
+ @storage = {}
+ end
+
+ def create
+ end
+
+ def find
+ end
+
+ def update
+ end
+
+ def delete
+ end
+end