From a1f36b435b61f824f8fb5fd83d142600812daddd Mon Sep 17 00:00:00 2001 From: John Mettraux Date: Sun, 17 Apr 2011 00:19:10 +0900 Subject: [PATCH] CompositeStorage rework (Thanks Greg Lazarev) --- CHANGELOG.txt | 1 + CREDITS.txt | 1 + lib/ruote/storage/composite_storage.rb | 95 +++++++++++--------------- test/unit/ut_20_composite_storage.rb | 26 +++++++ 4 files changed, 69 insertions(+), 54 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 35fa5512..3ab97c89 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -4,6 +4,7 @@ == ruote - 2.2.1 not yet released +- CompositeStorage#delete_schedule fix (Thanks Greg) - read 'http://'|'file', :to => 'f:a' / :to => 'v:b' - save :to => 'f:a' / :to => 'v:b' - pause(fei/wfid), resume(fei/wfid) diff --git a/CREDITS.txt b/CREDITS.txt index 0476b365..37e950e8 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -44,6 +44,7 @@ Richard Jennings == Feedback +Greg Lazarev - composite storage issues Jan TopiƄski - https://github.com/simcha Iuri Gagnidze - ProcessStatus#definition_name issues, Engine#leftovers John Le - https://github.com/sandbox diff --git a/lib/ruote/storage/composite_storage.rb b/lib/ruote/storage/composite_storage.rb index 773a9764..0a5c7d1b 100644 --- a/lib/ruote/storage/composite_storage.rb +++ b/lib/ruote/storage/composite_storage.rb @@ -51,58 +51,55 @@ def initialize(default_storage, storages) @default_storage = default_storage @storages = storages - - prepare_base_methods - end - - def put(doc, opts={}) - - storage(doc['type']).put(doc, opts) - end - - def get(type, key) - - storage(type).get(type, key) - end - - def delete(doc) - - storage(doc['type']).delete(doc) - end - - def get_many(type, key=nil, opts={}) - - storage(type).get_many(type, key, opts) - end - - def ids(type) - - storage(type).ids(type) end - def purge! + # A class method 'delegate', to tell this storage how to deal with + # each method composing a storage. + # + # Followed by a list of 'delegations'. + # + def self.delegate(method_name, type=nil) - TYPES.collect { |t| storage(t) }.uniq.each { |s| s.purge! } + if type == nil + define_method(method_name) do |*args| + storage(args.first['type']).send(method_name, *args) + end + elsif type.is_a?(Fixnum) + define_method(method_name) do |*args| + storage(args[type]).send(method_name, *args) + end + else + type = type.to_s + define_method(method_name) do |*args| + storage(type).send(method_name, *args) + end + end end - def purge_type!(type) - - storage(type).purge_type!(type) - end + delegate :put + delegate :get, 0 + delegate :get_many, 0 + delegate :delete + + delegate :reserve + delegate :ids, 0 + delegate :purge_type!, 0 + delegate :empty?, 0 + + delegate :put_msg, :msgs + delegate :get_msgs, :msgs + delegate :put_schedule, :schedules + delegate :get_schedules, :schedules + delegate :delete_schedule, :schedules + delegate :find_root_expression, :expressions + delegate :expression_wfids, :expressions + delegate :get_trackers, :variables + delegate :get_engine_variable, :variables + delegate :put_engine_variable, :variables #def add_type (type) #end - protected - - STORAGE_BASE_METHODS = { - 'put_msg' => 'msgs', - 'get_msgs' => 'msgs', - 'find_root_expression' => 'expressions', - 'get_schedules' => 'schedules', - 'put_schedule' => 'schedules' - } - TYPES = %w[ variables msgs @@ -113,17 +110,7 @@ def purge_type!(type) workitems ] - def prepare_base_methods - - singleton = class << self; self; end - - STORAGE_BASE_METHODS.each do |method, type| - - singleton.send(:define_method, method) do |*args| - storage(type).send(method, *args) - end - end - end + protected def storage(type) diff --git a/test/unit/ut_20_composite_storage.rb b/test/unit/ut_20_composite_storage.rb index 454d0336..cc6fca1e 100644 --- a/test/unit/ut_20_composite_storage.rb +++ b/test/unit/ut_20_composite_storage.rb @@ -44,5 +44,31 @@ def test_delete assert_nil r assert_equal 0, @default.h['msgs'].size end + + class TracingStorage + attr_reader :trace + def initialize + @trace = [] + end + def method_missing(m, *args) + @trace << [ m, *args ] + end + end + + def test_special_methods + + default = TracingStorage.new + + cs = Ruote::CompositeStorage.new(default, {}) + + cs.delete_schedule('x') # schedule id + cs.reserve('type' => 'schedules', '_id' => 'nada') + + assert_equal([ + [ :delete_schedule, 'x' ], + [ :reserve, { 'type' => 'schedules', '_id' => 'nada' } ] + ], + default.trace) + end end