From 6dc6a9481f5318557be187d50d3557b0668b73fc Mon Sep 17 00:00:00 2001 From: Omar Rodriguez Date: Sat, 11 Aug 2012 09:45:05 +0000 Subject: [PATCH 1/2] Refactor: Pass Project object instead of project_id when searching tasks by project --- lib/taskmapper/entities/project.rb | 2 +- lib/taskmapper/entities/task.rb | 19 ++++++++++++++++++- spec/fake_providers/in_memory_provider.rb | 17 ++++++++++++----- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/lib/taskmapper/entities/project.rb b/lib/taskmapper/entities/project.rb index 5629746..4a6916d 100644 --- a/lib/taskmapper/entities/project.rb +++ b/lib/taskmapper/entities/project.rb @@ -28,7 +28,7 @@ def validate end def tasks - factory.tasks.where :project_id => self.id + factory.tasks.where :project => self end def create_task(attrs) diff --git a/lib/taskmapper/entities/task.rb b/lib/taskmapper/entities/task.rb index 7e9be9f..f4515dd 100644 --- a/lib/taskmapper/entities/task.rb +++ b/lib/taskmapper/entities/task.rb @@ -6,13 +6,15 @@ class Task attr_accessor :title, :description, :requestor, - :assignee, + :assignee, + :project, :project_id, :priority, :status, :factory protected :requestor=, + :project=, :project_id=, :factory= @@ -25,9 +27,18 @@ def initialize(attrs) self.priority = attrs[:priority] self.status = attrs[:status] self.project_id = attrs[:project_id] + self.project = attrs[:project] self.factory = attrs[:factory] validate end + + def project_id + @project_id ||= project.id + end + + def project + @project ||= factory.projects.find project_id + end def save factory.tasks.update self @@ -40,6 +51,12 @@ def delete def validate validate_presence_of :title validate_presence_of :requestor + validate_project + end + + def validate_project + raise TaskMapper::Exceptions::TaskMapperException + .new("Must provider a project_id or a project object") if @project_id.nil? and @project.nil? end def create_comment(attrs) diff --git a/spec/fake_providers/in_memory_provider.rb b/spec/fake_providers/in_memory_provider.rb index 30a86d8..d4793d6 100644 --- a/spec/fake_providers/in_memory_provider.rb +++ b/spec/fake_providers/in_memory_provider.rb @@ -73,6 +73,17 @@ module Tasks include InMemoryProvider include Finders + def search(criteria) + project = criteria.delete :project + criteria[:project_id] = project.id if project + super criteria + end + + def find_by_attributes(attrs) + attrs.delete :project + super attrs + end + def supported_operations [:create, :search, :find] end @@ -82,12 +93,8 @@ module TaskComments include InMemoryProvider include Finders - def create(comment) - super comment - end - def search(criteria) - task = criteria.delete(:task) + criteria.delete(:task) super criteria end From 1439b4762d915de5e4a3c8ea497c667a04a21755 Mon Sep 17 00:00:00 2001 From: Omar Rodriguez Date: Mon, 13 Aug 2012 09:39:36 +0000 Subject: [PATCH 2/2] Refactor: Rename instance criteria to filter in EntityRepository and Repository This is to avoid confusion between repository filter and search criteria --- lib/taskmapper/repositories/entity_repository.rb | 10 ++++------ lib/taskmapper/repositories/repository.rb | 16 ++++++++-------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/lib/taskmapper/repositories/entity_repository.rb b/lib/taskmapper/repositories/entity_repository.rb index 363c843..8904e6e 100644 --- a/lib/taskmapper/repositories/entity_repository.rb +++ b/lib/taskmapper/repositories/entity_repository.rb @@ -1,8 +1,8 @@ module TaskMapper module Repositories class EntityRepository < Repository - def search(criteria = {}) - super(criteria).map { |attributes| new_entity(attributes) } + def search(filter = {}) + super(filter).map { |attributes| new_entity(attributes) } end def create(attributes) @@ -11,9 +11,7 @@ def create(attributes) def update(entity) updated = super entity - entity.instance_eval do - updated_at = Time.now - end if updated + entity.instance_eval { updated_at = Time.now } if updated updated end @@ -40,7 +38,7 @@ def <<(entity) end def new_entity(attrs) - factory.entity(entity_class, attrs.merge(criteria)) + factory.entity(entity_class, attrs.merge(filter)) end def new_entity_or_nil(attrs) diff --git a/lib/taskmapper/repositories/repository.rb b/lib/taskmapper/repositories/repository.rb index 2959bb4..2b1144e 100644 --- a/lib/taskmapper/repositories/repository.rb +++ b/lib/taskmapper/repositories/repository.rb @@ -3,14 +3,14 @@ module Repositories class Repository include Enumerable - attr_accessor :factory, :criteria, :entity_class + attr_accessor :factory, :filter, :entity_class - protected :factory=, :criteria=, :entity_class= + protected :factory=, :filter=, :entity_class= - def initialize(factory, entity_class, criteria = {}) + def initialize(factory, entity_class, filter = {}) self.factory = factory self.entity_class = entity_class - self.criteria = criteria + self.filter = filter end def provider @@ -18,11 +18,11 @@ def provider end def each(&block) - search(criteria).each &block + search(filter).each &block end def search(criteria = {}) - provider.search(criteria) + provider.search(criteria.merge filter) end def update(attributes) @@ -42,7 +42,7 @@ def find_by_id(id) end def find_by_attributes(attrs) - provider.find_by_attributes(attrs.merge criteria) + provider.find_by_attributes(attrs.merge filter) end def find_by_attribute(attribute, value) @@ -58,7 +58,7 @@ def [](index) end def where(criteria = {}) - self.class.new factory, self.criteria.merge(criteria) + self.class.new factory, filter.merge(criteria) end # Dynamic finder