Skip to content

Commit

Permalink
Yank providers setup and default attributes
Browse files Browse the repository at this point in the history
I need the code itself to be the simplest it can be to be able to our "have we seeded?" caching checks.
  • Loading branch information
kaspth committed Sep 9, 2023
1 parent 70cbd1c commit e706f61
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 72 deletions.
60 changes: 7 additions & 53 deletions lib/oaken.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,45 +19,11 @@ def classify(string)
@inflector = Inflector.new

module Stored; end
class Stored::Abstract
class Stored::ActiveRecord
def initialize(type)
@type = type
@attributes = {}
end

def with(**attributes)
if block_given?
previous_attributes, @attributes = @attributes, @attributes.merge(attributes)
yield
else
@attributes = attributes
end
ensure
@attributes = previous_attributes if block_given?
end

def create(**attributes)
@attributes.merge(**attributes)
end
alias :insert :create
end

class Stored::Memory < Stored::Abstract
def find(id)
objects.fetch(id)
end

# TODO: Figure out what to do for memory objects
def access(id, **attributes)
objects[id] = @type.new(**super(attributes))
end

private def objects
@objects ||= {}
end
end

class Stored::ActiveRecord < Stored::Abstract
def find(id)
@type.find id
end
Expand All @@ -71,12 +37,10 @@ def access(*names, **values)
end

def create(**attributes)
attributes = super
@type.create!(**attributes)
end

def insert(**attributes)
attributes = super
@type.new(attributes).validate!
@type.insert(attributes)
end
Expand All @@ -85,27 +49,17 @@ def insert(**attributes)
module Seeds
extend self

class Provider < Struct.new(:data, :provider)
def preregister(names)
names.each do |name|
type = Oaken.inflector.classify(name).safe_constantize and register type, name
end
end

def register(type, key = Oaken.inflector.tableize(type.name))
stored = provider.new(type)
data.define_method(key) { stored }
def self.preregister(names)
names.each do |name|
type = Oaken.inflector.classify(name).safe_constantize and register type, name
end
end

def self.provider(name, provider)
define_singleton_method(name) { (@providers ||= {})[name] ||= Provider.new(self, provider) }
def self.register(type, key = Oaken.inflector.tableize(type.name))
stored = Stored::ActiveRecord.new(type)
define_method(key) { stored }
end

provider :memory, Stored::Memory
provider :records, Stored::ActiveRecord
def register(...) = records.register(...) # Set Active Record as the default provider.

def self.load_from(directory)
Dir.glob("#{directory}{,/**/*}.rb").sort.each do |file|
class_eval File.read(file)
Expand Down
18 changes: 0 additions & 18 deletions test/oaken_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,6 @@
require "test_helper"

class OakenTest < Oaken::Test
class SomeObject; end

def test_register
Oaken::Seeds.memory.register SomeObject
assert_respond_to self, :oaken_test_some_objects
end


def test_that_it_has_a_version_number
refute_nil ::Oaken::VERSION
end
Expand All @@ -24,16 +16,6 @@ def test_accessing_fixture
assert_equal [users.kasper, users.coworker], accounts.business.users
end

def test_default_attributes
homer, home_co = nil, accounts.create(name: "Home Co.")

users.with accounts: [home_co] do
homer = users.create name: "Homer"
end
assert_equal "Homer", homer.name
assert_equal [home_co], homer.accounts
end

def test_updating_fixture
users.kasper.update name: "Kasper2"
assert_equal "Kasper2", users.kasper.name
Expand Down
2 changes: 1 addition & 1 deletion test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ class YamlRecord < ActiveRecord::Base

require "active_record/fixtures"

Oaken::Seeds.records.preregister ActiveRecord::Base.connection.tables.grep_v(/^ar_/)
Oaken::Seeds.preregister ActiveRecord::Base.connection.tables.grep_v(/^ar_/)
Oaken::Seeds.load_from "test/seeds"

class Oaken::Test < ActiveSupport::TestCase
Expand Down

0 comments on commit e706f61

Please sign in to comment.