Skip to content

Commit

Permalink
Refactor class repository
Browse files Browse the repository at this point in the history
- Add abstract class
- Add spec for abstract method
  • Loading branch information
hirocaster committed Aug 26, 2015
1 parent 06b13c7 commit 444133c
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 38 deletions.
30 changes: 30 additions & 0 deletions lib/active_record/sharding/abstract_repository.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
module ActiveRecord
module Sharding
class AbstractRepository

private

def generate_model_for_shard(connection_name)
base_class_name = @base_class.name
class_name = generate_class_name connection_name

model = Class.new(base_class) do
self.table_name = base_class.table_name

module_eval <<-RUBY, __FILE__, __LINE__ + 1
def self.name
"#{base_class_name}::#{class_name}"
end
RUBY
end

model.class_eval { establish_connection(connection_name) }
model
end

def generate_class_name(connection_name)
raise NotImplementedError.new("#{self.class.name}.#{__method__} is an abstract method.")
end
end
end
end
20 changes: 1 addition & 19 deletions lib/active_record/sharding/sequencer_repository.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module ActiveRecord
module Sharding
class SequencerRepository
class SequencerRepository < AbstractRepository
attr_reader :base_class

def initialize(sequencer_config, base_class)
Expand All @@ -14,24 +14,6 @@ def fetch(connection_name)

private

def generate_model_for_shard(connection_name)
base_class_name = @base_class.name
class_name = generate_class_name connection_name

model = Class.new(base_class) do
self.table_name = base_class.table_name

module_eval <<-RUBY, __FILE__, __LINE__ + 1
def self.name
"#{base_class_name}::#{class_name}"
end
RUBY
end

model.class_eval { establish_connection(connection_name) }
model
end

def generate_class_name(connection_name)
"SequencerFor#{connection_name.to_s.tr('-', '_').classify}"
end
Expand Down
20 changes: 1 addition & 19 deletions lib/active_record/sharding/shard_repository.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module ActiveRecord
module Sharding
class ShardRepository
class ShardRepository < AbstractRepository
attr_reader :base_class

def initialize(cluster_config, base_class)
Expand All @@ -23,24 +23,6 @@ def all

private

def generate_model_for_shard(connection_name)
base_class_name = @base_class.name
class_name = generate_class_name connection_name

model = Class.new(base_class) do
self.table_name = base_class.table_name

module_eval <<-RUBY, __FILE__, __LINE__ + 1
def self.name
"#{base_class_name}::#{class_name}"
end
RUBY
end

model.class_eval { establish_connection(connection_name) }
model
end

def generate_class_name(connection_name)
"ShardFor#{connection_name.to_s.tr('-', '_').classify}"
end
Expand Down
1 change: 1 addition & 0 deletions lib/activerecord-sharding.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
require "active_record/sharding/config"
require "active_record/sharding/cluster_config"
require "active_record/sharding/modulo_router"
require "active_record/sharding/abstract_repository"
require "active_record/sharding/shard_repository"
require "active_record/sharding/database_tasks"
require "active_record/sharding/model"
Expand Down
15 changes: 15 additions & 0 deletions spec/active_record/sharding/abstract_repository_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
describe ActiveRecord::Sharding::AbstractRepository do
describe "#generate_class_name" do
let!(:repository) do
Class.new(ActiveRecord::Sharding::AbstractRepository) do
def initialize
generate_class_name "test"
end
end
end

it "raise NotImplementedError" do
expect { repository.new }.to raise_error NotImplementedError
end
end
end

0 comments on commit 444133c

Please sign in to comment.