Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions lib/unitsml/unitsdb/database.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,29 @@
module Unitsml
module Unitsdb
class Database < ::Unitsdb::Database
DATABASE = nil
def self.load_opal_payload(payload)
@opal_payload = payload
end

def self.from_db(dir_path, context: Unitsml::Configuration.context.id)
return super unless RUBY_ENGINE == "opal"

context_id = context.to_sym
raise Unitsml::Errors::OpalPayloadNotBundledError unless DATABASE
raise Unitsml::Errors::OpalPayloadNotBundledError unless opal_payload

# Ensure the UnitsML context is registered when context: is direct.
Unitsml::Configuration.context

from_hash(DATABASE, register: context_id)
from_hash(opal_payload, register: context_id)
end

def self.opal_payload
return @opal_payload if instance_variable_defined?(:@opal_payload)
return unless const_defined?(:DATABASE, false)

@opal_payload = const_get(:DATABASE, false)
end
private_class_method :opal_payload

Configuration.register_model(self, id: :database)
end
Expand Down
45 changes: 44 additions & 1 deletion spec/unitsml/unitsdb/database_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,57 @@
end

context "when running on opal" do
before { stub_const("RUBY_ENGINE", "opal") }
def clear_opal_payload
return unless described_class.instance_variable_defined?(:@opal_payload)

described_class.remove_instance_variable(:@opal_payload)
end

before do
stub_const("RUBY_ENGINE", "opal")
clear_opal_payload
end

after do
clear_opal_payload
end

def allow_from_hash(database_class)
allow(database_class).to receive(:from_hash).and_return(:database)
end

def expect_loaded_payload(database_class, payload)
expect(database_class).to have_received(:from_hash)
.with(payload, register: :unitsml_ruby)
end

it "raises a clear error when the bundled payload is missing" do
expect do
described_class.from_db("/does/not/matter", context: :unitsml_ruby)
end.to raise_error(Unitsml::Errors::OpalPayloadNotBundledError,
/not bundled/)
end

it "loads the bundled Opal payload" do
payload = { "units" => [] }
described_class.load_opal_payload(payload)
allow_from_hash(described_class)

expect(described_class.from_db("/does/not/matter",
context: :unitsml_ruby)).to eq(:database)
expect_loaded_payload(described_class, payload)
end

it "falls back to a legacy DATABASE constant" do
payload = { "units" => [:from_const] }
subclass = Class.new(described_class)
subclass.const_set(:DATABASE, payload)
allow_from_hash(subclass)

expect(subclass.from_db("/does/not/matter",
context: :unitsml_ruby)).to eq(:database)
expect_loaded_payload(subclass, payload)
end
end
end

Expand Down
Loading