Решение на Пета задача от Марк Андонов

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

Към профила на Марк Андонов

Резултати

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

Код

require 'digest/sha1'
class ReturnCommitObject
attr_accessor :date, :name, :objects, :store
def initialize()
@object = {}
@objects_to_remove = []
end
def message
message = "Nothing to commit, working directory clean."
success? ? "#{@name}" + "\n" + "\t#{ count } objects changed" : message
end
def count
@object.length + @objects_to_remove.size
end
def time
message = ""
message = "#{ @date.strftime("%a") } " + "#{ @date.strftime("%b") } "
message << "#{ @date.strftime("%d") } " + "#{ @date.strftime("%H") }"
message << ":#{ @date.strftime("%M") } " + "#{ @date.strftime("%Y") } "
message << "#{ @date.strftime('%z') }"
end
def hash
Digest::SHA1.hexdigest "#{time}#{name}"
end
def add(name,object)
@object[name] = object
end
def remove(name)
@objects_to_remove << name
end
def object
@object
end
def result
self
end
def find(name,object)
@object.each { |key,value| object = value if key == name }
end
def objects_to_remove
@objects_to_remove
end
def objects
@store.last.objects = @store.map {
|commit| commit.object.map { |key, value| value }
}.flatten
end
def success?
count > 0
end
def remove_objects
@objects_to_remove.each do |name|
remove_object(name)
end
end
def remove_object(name)
@store.each do |commit|
commit.object.delete_if { |key,value| key == name }
end
end
def error?
count == 0
end
end
class ObjectStore
def initialize ()
@store = []
@current_commit = ReturnCommitObject.new
@branch = Branch.new(@store)
end
def self.init(&block)
object = self.new
object.instance_eval &block if block_given?
object
end
def add(name, object)
@current_commit.add(name,object)
ReturnAddObject.new(name, object)
end
def commit(message)
@current_commit.store = @store
@current_commit.remove_objects
if (@current_commit.count != 0)
@current_commit.date, @current_commit.name = Time.now, message
@store << @current_commit.clone
@current_commit = ReturnCommitObject.new()
@store.last
else
ReturnCommitObject.new()
end
end
def remove(name)
condition = @store.any? do |commit|
commit.object.any? { |key,value| key == name }
end
@current_commit.remove(name) if condition
object = nil
@store.each do |commit|
commit.find(name, object)
end
ReturnRemoveObject.new(name, object)
end
def checkout(commit_hash)
if (@store.any? { |elem| elem.hash == commit_hash} )
while(@store.last.hash != commit_hash)
@store.pop
end
puts @store.last
ReturnCheckoutObject.new(@store.last, commit_hash)
else
ReturnCheckoutObject.new(nil, commit_hash)
end
end
def remove_object(name)
@store.each do |commit|
commit.object.delete_if { |key,value| key == name }
end
end
def log
ReturnLogObject.new(@store,branch.current_name)
end
def head
ReturnHeadObject.new(branch.current_name, @store)
end
def get(name)
object = nil
@store.each do |commit|
commit.find(name, object)
end
ReturnGetObject.new(name, object)
end
def branch
@branch
end
def to_s
@store.each { |commit| puts commit.object }
end
end
class ReturnGetObject
def initialize(name, object)
@name = name
@object = object
end
def message
success? ? "Found object #{@name}." : "Object #{@name} is not committed."
end
def result
@object
end
def success?
@object != nil
end
def error?
@object == nil
end
end
class ReturnLogObject
def initialize(store, name)
@store = store.clone
@name = name
end
def message
if(success?)
messages = @store.reverse.map do |commit|
message = "Commit #{commit.hash}\nDate: #{commit.time}\n\n\t#{commit.name}"
end
messages.join("\n\n")
else
"Branch #{@name} does not have any commits yet."
end
end
def success?
@store != []
end
def error?
@store == []
end
end
class ReturnHeadObject
def initialize(name,store)
@name = name
@store = store.clone
end
def message
message = "Branch #{@name} does not have any commits yet."
success? ? "#{@store.last.name}" : message
end
def result
result = @store.last
end
def success?
@store != []
end
def error?
@store == []
end
end
class ReturnAddObject
def initialize(name, object)
@name = name
@object = object
end
def message
"Added #{@name} to stage."
end
def result
@object
end
def success?
true
end
def error?
false
end
end
class ReturnRemoveObject
def initialize(name, object)
@name = name
@object = object
end
def message
message = "Object #{@name} is not committed."
success? ? "Added #{@name} for removal." : message
end
def result
@object
end
def success?
@object != nil
end
def error?
@object == nil
end
end
class ReturnCheckoutObject
def initialize(commit, commit_hash)
@commit = commit
@commit_hash = commit_hash
end
def message
message = "Commit #{@commit_hash} does not exist."
success? ? "HEAD is now at #{@commit_hash}." : message
end
def result
@commit
end
def success?
@commit != nil
end
def error?
@commit == nil
end
end
class BranchCreateObject
def initialize(flag, branch_name)
@name = branch_name
@flag = flag
end
def message
message = "Branch #{ @name } already exists."
success? ? "Created branch #{ @name }." : message
end
def success?
@flag == true
end
def error?
@flag != true
end
end
class BranchChechoutObject
def initialize(flag, store, branch_name)
@name = branch_name
@store = store.clone
@flag = flag
end
def message
message = "Branch #{ @name } does not exist."
success? ? "Switched to branch #{ @name }." : message
end
def result
@store
end
def success?
@flag == true
end
def error?
@flag != true
end
end
class BranchRemoveObject
def initialize(message, branch_name)
@name = branch_name
@message = message
end
def message
case @message
when 1
"Removed branch #{@name}."
when 2
"Cannot remove current branch."
when 3
"Branch #{@name} does not exist."
end
end
def success?
@message == 1
end
def error?
@message != 1
end
end
class BranchListObject
def initialize(branches, current_name)
@branches = branches.clone
@current_name = current_name
end
def message
message = ""
@branches.keys.sort.each do |elem|
elem == @current_name ? message << "* #{elem}\n" : message << " #{elem}\n"
end
message.chomp
end
def result
@branches
end
def success?
true
end
def error?
false
end
end
class Branch
attr_accessor :current_name
def initialize(store)
@current_store = store
@current_name = "master"
@branches = { "master" => store }
end
def create(branch_name)
if (@branches.has_key?(branch_name))
BranchCreateObject.new(false, branch_name)
else
@branches[branch_name] = @current_store.clone
BranchCreateObject.new(true, branch_name)
end
end
def checkout(branch_name)
if (@branches.has_key?(branch_name))
@branches[@current_name] = @current_store.clone
@current_name = branch_name
@current_store.replace(@branches[branch_name])
BranchChechoutObject.new(true, @current_store, branch_name)
else
BranchChechoutObject.new(false, @current_name, branch_name)
end
end
def remove(branch_name)
if(@branches.has_key?(branch_name))
if(branch_name == @current_name)
BranchRemoveObject.new(2, branch_name)
else
@branches.delete(branch_name)
BranchRemoveObject.new(1, branch_name)
end
else
BranchRemoveObject.new(3, branch_name)
end
end
def list()
BranchListObject.new(@branches, @current_name)
end
def to_s
@branches.each { |key,value|
puts "#{key}"
value.each { |commit| puts commit.object } }
end
def to_sto
puts @current_name
@current_store.each { |commit| puts commit.object }
end
end

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

...F....FFFF..........F..#<ReturnCommitObject:0x007f0267a69008>
...F.

Failures:

  1) ObjectStore can remove objects
     Failure/Error: expect(repo.remove("object1")).to be_success("Added object1 for removal.", "content1")
       expected #<ReturnRemoveObject:0x007f0266f8ebb0 @name="object1", @object=nil> to be success "Added object1 for removal." and "content1"
     # /tmp/d20160111-5693-vtj2mh/spec.rb:43:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) ObjectStore can show log of changes for a single commit
     Failure/Error: expect(repo.log).to be_success("Commit #{commit_hash}\nDate: #{Time.now.strftime("%a %b %d %H:%M %Y %z")}\n\n\tSo cool!")
       expected #<ReturnLogObject:0x007f0266edc050 @store=[#<ReturnCommitObject:0x007f0266edd518 @object={"object1"=>"content1", "object2"=>"content2"}, @objects_to_remove=[], @store=[#<ReturnCommitObject:0x007f0266edd518 ...>], @date=2016-01-11 11:54:50 +0200, @name="So cool!">], @name="master"> to be success "Commit b63d7849721e9725a10be0c13bc3d9e904bbc6a5\nDate: Mon Jan 11 11:54 2016 +0200\n\n\tSo cool!"
     # /tmp/d20160111-5693-vtj2mh/spec.rb:83:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  3) ObjectStore can show log of changes for a single commit
     Failure/Error: expect(repo.log).to be_success("Commit #{commit_hash}\nDate: #{Time.now.strftime("%a %b %d %H:%M %Y %z")}\n\n\tSo cool!")
       expected #<ReturnLogObject:0x007f0266ec94a0 @store=[#<ReturnCommitObject:0x007f0266ec9d88 @object={"object1"=>"content1", "object2"=>"content2"}, @objects_to_remove=[], @store=[#<ReturnCommitObject:0x007f0266ec9d88 ...>], @date=2016-01-11 11:54:50 +0200, @name="So cool!">], @name="master"> to be success "Commit b63d7849721e9725a10be0c13bc3d9e904bbc6a5\nDate: Mon Jan 11 11:54 2016 +0200\n\n\tSo cool!"
     # /tmp/d20160111-5693-vtj2mh/spec.rb:92:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  4) ObjectStore can show log of changes for multiple commits
     Failure/Error: expect(repo.log).to be_success("Commit #{commit2_hash}\nDate: #{current_time}\n\n\tSecond commit\n\nCommit #{commit1_hash}\nDate: #{current_time}\n\n\tFirst commit")
       expected #<ReturnLogObject:0x007f0266e2f170 @store=[#<ReturnCommitObject:0x007f0266e37ca8 @object={"object1"=>"content1"}, @objects_to_remove=[], @store=[#<ReturnCommitObject:0x007f0266e37ca8 ...>, #<ReturnCommitObject:0x007f0266e36448 @object={"object2"=>"content2"}, @objects_to_remove=[], @store=[...], @date=2016-01-11 11:54:50 +0200, @name="Second commit">], @date=2016-01-11 11:54:50 +0200, @name="First commit">, #<ReturnCommitObject:0x007f0266e36448 @object={"object2"=>"content2"}, @objects_to_remove=[], @store=[#<ReturnCommitObject:0x007f0266e37ca8 @object={"object1"=>"content1"}, @objects_to_remove=[], @store=[...], @date=2016-01-11 11:54:50 +0200, @name="First commit">, #<ReturnCommitObject:0x007f0266e36448 ...>], @date=2016-01-11 11:54:50 +0200, @name="Second commit">], @name="master"> to be success "Commit 6881e42186535ba1e13d64e313ae59f1bb2f4473\nDate: Mon Jan 11 11:54 2016 +0200\n\n\tSecond commit\n\nCommit 97127a3fcc9cade1747ef2d930ff0b4739b086b2\nDate: Mon Jan 11 11:54 2016 +0200\n\n\tFirst commit"
     # /tmp/d20160111-5693-vtj2mh/spec.rb:108:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  5) ObjectStore shows the log for the current branch only
     Failure/Error: expect(repo.log).to be_success("Commit #{commit1_hash}\nDate: #{current_time}\n\n\tFirst commit")
       expected #<ReturnLogObject:0x007f0266e06ba8 @store=[#<ReturnCommitObject:0x007f0266e08868 @object={"object1"=>"content1"}, @objects_to_remove=[], @store=[#<ReturnCommitObject:0x007f0266e08868 ...>], @date=2016-01-11 11:54:50 +0200, @name="First commit">], @name="develop"> to be success "Commit 97127a3fcc9cade1747ef2d930ff0b4739b086b2\nDate: Mon Jan 11 11:54 2016 +0200\n\n\tFirst commit"
     # /tmp/d20160111-5693-vtj2mh/spec.rb:128:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  6) ObjectStore can return objects
     Failure/Error: expect(repo.get("number")).to be_success("Found object number.", 21)
       expected #<ReturnGetObject:0x007f0267a73058 @name="number", @object=nil> to be success "Found object number." and 21
     # /tmp/d20160111-5693-vtj2mh/spec.rb:202:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  7) ObjectStore can show the objects in a repo after overwriting an object
     Failure/Error: expect(second_commit.objects).to match_array(["content2", "content3"])
       expected collection contained:  ["content2", "content3"]
       actual collection contained:    ["content1", "content2", "content3"]
       the extra elements were:        ["content1"]
     # /tmp/d20160111-5693-vtj2mh/spec.rb:248:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.03295 seconds
30 examples, 7 failures

Failed examples:

rspec /tmp/d20160111-5693-vtj2mh/spec.rb:38 # ObjectStore can remove objects
rspec /tmp/d20160111-5693-vtj2mh/spec.rb:77 # ObjectStore can show log of changes for a single commit
rspec /tmp/d20160111-5693-vtj2mh/spec.rb:86 # ObjectStore can show log of changes for a single commit
rspec /tmp/d20160111-5693-vtj2mh/spec.rb:95 # ObjectStore can show log of changes for multiple commits
rspec /tmp/d20160111-5693-vtj2mh/spec.rb:111 # ObjectStore shows the log for the current branch only
rspec /tmp/d20160111-5693-vtj2mh/spec.rb:198 # ObjectStore can return objects
rspec /tmp/d20160111-5693-vtj2mh/spec.rb:239 # ObjectStore can show the objects in a repo after overwriting an object

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

Марк обнови решението на 23.11.2015 17:14 (преди над 8 години)

+require 'digest/sha1'
+
+class ReturnCommitObject
+
+ attr_accessor :date, :name, :objects, :store
+
+ def initialize()
+ @object = {}
+ @objects_to_remove = []
+ end
+
+ def message
+ message = "Nothing to commit, working directory clean."
+ success? ? "#{@name}" + "\n" + "\t#{ count } objects changed" : message
+ end
+
+ def count
+ @object.length + @objects_to_remove.size
+ end
+
+ def time
+ message = ""
+ message = "#{ @date.strftime("%a") } " + "#{ @date.strftime("%b") } "
+ message << "#{ @date.strftime("%d") } " + "#{ @date.strftime("%H") }"
+ message << ":#{ @date.strftime("%M") } " + "#{ @date.strftime("%Y") } "
+ message << "#{ @date.strftime('%z') }"
+ end
+
+ def hash
+ Digest::SHA1.hexdigest "#{time}#{name}"
+ end
+
+ def add(name,object)
+ @object[name] = object
+ end
+
+ def remove(name)
+ @objects_to_remove << name
+ end
+
+ def object
+ @object
+ end
+
+ def result
+ self
+ end
+
+ def find(name,object)
+ @object.each { |key,value| object = value if key == name }
+ end
+
+ def objects_to_remove
+ @objects_to_remove
+ end
+
+ def objects
+ @store.last.objects = @store.map {
+ |commit| commit.object.map { |key, value| value }
+ }.flatten
+ end
+
+ def success?
+ count > 0
+ end
+
+ def remove_objects
+ @objects_to_remove.each do |name|
+ remove_object(name)
+ end
+ end
+
+ def remove_object(name)
+ @store.each do |commit|
+ commit.object.delete_if { |key,value| key == name }
+ end
+ end
+ def error?
+ count == 0
+ end
+end
+
+class ObjectStore
+
+ def initialize ()
+ @store = []
+ @current_commit = ReturnCommitObject.new
+ @branch = Branch.new(@store)
+ end
+
+ def self.init(&block)
+ object = self.new
+ object.instance_eval &block if block_given?
+ object
+ end
+
+ def add(name, object)
+ @current_commit.add(name,object)
+ ReturnAddObject.new(name, object)
+ end
+
+ def commit(message)
+ @current_commit.store = @store
+ @current_commit.remove_objects
+ if (@current_commit.count != 0)
+ @current_commit.date, @current_commit.name = Time.now, message
+ @store << @current_commit.clone
+ @current_commit = ReturnCommitObject.new()
+ @store.last
+ else
+ ReturnCommitObject.new()
+ end
+ end
+
+ def remove(name)
+ condition = @store.any? do |commit|
+ commit.object.any? { |key,value| key == name }
+ end
+ @current_commit.remove(name) if condition
+ object = nil
+ @store.each do |commit|
+ commit.find(name, object)
+ end
+ ReturnRemoveObject.new(name, object)
+ end
+
+ def checkout(commit_hash)
+ if (@store.any? { |elem| elem.hash == commit_hash} )
+ while(@store.last.hash != commit_hash)
+ @store.pop
+ end
+ puts @store.last
+ ReturnCheckoutObject.new(@store.last, commit_hash)
+ else
+ ReturnCheckoutObject.new(nil, commit_hash)
+ end
+ end
+
+ def remove_object(name)
+ @store.each do |commit|
+ commit.object.delete_if { |key,value| key == name }
+ end
+ end
+ def log
+ ReturnLogObject.new(@store,branch.current_name)
+ end
+
+ def head
+ ReturnHeadObject.new(branch.current_name, @store)
+ end
+
+ def get(name)
+ object = nil
+ @store.each do |commit|
+ commit.find(name, object)
+ end
+ ReturnGetObject.new(name, object)
+ end
+
+ def branch
+ @branch
+ end
+
+ def to_s
+ @store.each { |commit| puts commit.object }
+ end
+end
+
+class ReturnGetObject
+ def initialize(name, object)
+ @name = name
+ @object = object
+ end
+
+ def message
+ success? ? "Found object #{@name}." : "Object #{@name} is not committed."
+ end
+
+ def result
+ @object
+ end
+
+ def success?
+ @object != nil
+ end
+
+ def error?
+ @object == nil
+ end
+end
+
+class ReturnLogObject
+ def initialize(store, name)
+ @store = store.clone
+ @name = name
+ end
+
+ def message
+ if(success?)
+ messages = @store.reverse.map do |commit|
+ message = "Commit #{commit.hash}\nDate: #{commit.time}\n\n\t#{commit.name}"
+ end
+ messages.join("\n\n")
+ else
+ "Branch #{@name} does not have any commits yet."
+ end
+ end
+
+ def success?
+ @store != []
+ end
+
+ def error?
+ @store == []
+ end
+end
+
+class ReturnHeadObject
+ def initialize(name,store)
+ @name = name
+ @store = store.clone
+ end
+
+ def message
+ message = "Branch #{@name} does not have any commits yet."
+ success? ? "#{@store.last.name}" : message
+ end
+
+ def result
+ result = @store.last
+ end
+
+ def success?
+ @store != []
+ end
+
+ def error?
+ @store == []
+ end
+end
+
+class ReturnAddObject
+ def initialize(name, object)
+ @name = name
+ @object = object
+ end
+
+ def message
+ "Added #{@name} to stage."
+ end
+
+ def result
+ @object
+ end
+
+ def success?
+ true
+ end
+
+ def error?
+ false
+ end
+end
+
+class ReturnRemoveObject
+ def initialize(name, object)
+ @name = name
+ @object = object
+ end
+
+ def message
+ message = "Object #{@name} is not committed."
+ success? ? "Added #{@name} for removal." : message
+ end
+
+ def result
+ @object
+ end
+
+ def success?
+ @object != nil
+ end
+
+ def error?
+ @object == nil
+ end
+end
+
+class ReturnCheckoutObject
+ def initialize(commit, commit_hash)
+ @commit = commit
+ @commit_hash = commit_hash
+ end
+
+ def message
+ message = "Commit #{@commit_hash} does not exist."
+ success? ? "HEAD is now at #{@commit_hash}." : message
+ end
+
+ def result
+ @commit
+ end
+
+ def success?
+ @commit != nil
+ end
+
+ def error?
+ @commit == nil
+ end
+end
+
+class BranchCreateObject
+ def initialize(flag, branch_name)
+ @name = branch_name
+ @flag = flag
+ end
+
+ def message
+ message = "Branch #{ @name } already exists."
+ success? ? "Created branch #{ @name }." : message
+ end
+
+ def success?
+ @flag == true
+ end
+
+ def error?
+ @flag != true
+ end
+end
+
+class BranchChechoutObject
+ def initialize(flag, store, branch_name)
+ @name = branch_name
+ @store = store.clone
+ @flag = flag
+ end
+
+ def message
+ message = "Branch #{ @name } does not exist."
+ success? ? "Switched to branch #{ @name }." : message
+ end
+
+ def result
+ @store
+ end
+
+ def success?
+ @flag == true
+ end
+
+ def error?
+ @flag != true
+ end
+end
+
+class BranchRemoveObject
+ def initialize(message, branch_name)
+ @name = branch_name
+ @message = message
+ end
+
+ def message
+ case @message
+ when 1
+ "Removed branch #{@name}."
+ when 2
+ "Cannot remove current branch."
+ when 3
+ "Branch #{@name} does not exist."
+ end
+ end
+
+ def success?
+ @message == 1
+ end
+
+ def error?
+ @message != 1
+ end
+end
+
+class BranchListObject
+ def initialize(branches, current_name)
+ @branches = branches.clone
+ @current_name = current_name
+ end
+
+ def message
+ message = ""
+ @branches.keys.sort.each do |elem|
+ elem == @current_name ? message << "* #{elem}\n" : message << " #{elem}\n"
+ end
+ message.chomp
+ end
+
+ def result
+ @branches
+ end
+
+ def success?
+ true
+ end
+
+ def error?
+ false
+ end
+end
+
+class Branch
+
+ attr_accessor :current_name
+
+ def initialize(store)
+ @current_store = store
+ @current_name = "master"
+ @branches = { "master" => store }
+ end
+
+ def create(branch_name)
+ if (@branches.has_key?(branch_name))
+ BranchCreateObject.new(false, branch_name)
+ else
+ @branches[branch_name] = @current_store.clone
+ BranchCreateObject.new(true, branch_name)
+ end
+ end
+
+ def checkout(branch_name)
+ if (@branches.has_key?(branch_name))
+ @branches[@current_name] = @current_store.clone
+ @current_name = branch_name
+ @current_store.replace(@branches[branch_name])
+ BranchChechoutObject.new(true, @current_store, branch_name)
+ else
+ BranchChechoutObject.new(false, @current_name, branch_name)
+ end
+ end
+
+ def remove(branch_name)
+ if(@branches.has_key?(branch_name))
+ if(branch_name == @current_name)
+ BranchRemoveObject.new(2, branch_name)
+ else
+ @branches.delete(branch_name)
+ BranchRemoveObject.new(1, branch_name)
+ end
+ else
+ BranchRemoveObject.new(3, branch_name)
+ end
+ end
+
+ def list()
+ BranchListObject.new(@branches, @current_name)
+ end
+
+ def to_s
+ @branches.each { |key,value|
+ puts "#{key}"
+ value.each { |commit| puts commit.object } }
+ end
+
+ def to_sto
+ puts @current_name
+ @current_store.each { |commit| puts commit.object }
+ end
+end