diff --git a/.rubocop.yml b/.rubocop.yml index 05efcf5..81b56c8 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -19,3 +19,8 @@ Style/Next: Style/ClassVars: Enabled: false + +Gp/UnsafeYamlMarshal: + Enabled: true + Exclude: + - spec/**/*.rb diff --git a/Gemfile.lock b/Gemfile.lock index 634734d..57f5938 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -22,7 +22,7 @@ GIT PATH remote: . specs: - enum_machine (2.0.0) + enum_machine (2.0.1) activemodel activerecord activesupport diff --git a/lib/enum_machine/build_enum_class.rb b/lib/enum_machine/build_enum_class.rb index ab1c10e..3ee116a 100644 --- a/lib/enum_machine/build_enum_class.rb +++ b/lib/enum_machine/build_enum_class.rb @@ -6,6 +6,8 @@ def self.call(enum_values:, i18n_scope:, value_class:, machine: nil) aliases = machine&.instance_variable_get(:@aliases) || {} Class.new do + const_set(:VALUE_CLASS, value_class) + define_singleton_method(:machine) { machine } if machine define_singleton_method(:values) { enum_values.map { value_class.new(_1).freeze } } diff --git a/lib/enum_machine/version.rb b/lib/enum_machine/version.rb index 5ffb13d..c32fbe2 100644 --- a/lib/enum_machine/version.rb +++ b/lib/enum_machine/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module EnumMachine - VERSION = "2.0.0" + VERSION = "2.0.1" end diff --git a/spec/enum_machine/active_record_enum_spec.rb b/spec/enum_machine/active_record_enum_spec.rb index 54cd555..4e893e5 100644 --- a/spec/enum_machine/active_record_enum_spec.rb +++ b/spec/enum_machine/active_record_enum_spec.rb @@ -177,7 +177,7 @@ def am_i_choice? Object.const_set(:TestModelSerialize, model) m = TestModelSerialize.create(state: "choice", color: "wrong") - unserialized_m = Marshal.load(Marshal.dump(m)) # rubocop:disable Gp/UnsafeYamlMarshal + unserialized_m = Marshal.load(Marshal.dump(m)) expect(unserialized_m.state).to be_choice expect(unserialized_m.class::STATE::CHOICE).to eq("choice") @@ -185,6 +185,15 @@ def am_i_choice? expect(unserialized_m.color.red?).to be(false) end + it "serialize value" do + Object.const_set(:TestModelSerialize, model) + value = TestModelSerialize::STATE["choice"] + value_after_serialize = Marshal.load(Marshal.dump(value)) + + expect(value_after_serialize).to eq(value) + expect(value_after_serialize.choice?).to be(true) + end + it "returns state value by []" do expect(model::STATE["in_delivery"]).to eq "in_delivery" expect(model::STATE["in_delivery"].in_delivery?).to be(true) diff --git a/spec/enum_machine/driver_simple_class_spec.rb b/spec/enum_machine/driver_simple_class_spec.rb index 4cfa0fa..cb3703b 100644 --- a/spec/enum_machine/driver_simple_class_spec.rb +++ b/spec/enum_machine/driver_simple_class_spec.rb @@ -124,7 +124,7 @@ def initialize(state) it "keeps decorating on serialization" do m = TestClassWithDecorator.new("choice") - unserialized_m = Marshal.load(Marshal.dump(m)) # rubocop:disable Gp/UnsafeYamlMarshal + unserialized_m = Marshal.load(Marshal.dump(m)) expect(unserialized_m.state.am_i_choice?).to be(true) end @@ -145,9 +145,17 @@ def initialize(state) it "serialize class" do m = TestClass.new("choice") - unserialized_m = Marshal.load(Marshal.dump(m)) # rubocop:disable Gp/UnsafeYamlMarshal + unserialized_m = Marshal.load(Marshal.dump(m)) expect(unserialized_m.state).to be_choice expect(unserialized_m.class::STATE::CHOICE).to eq "choice" end + + it "serialize value" do + value = TestClass::STATE["choice"] + value_after_serialize = Marshal.load(Marshal.dump(value)) + + expect(value_after_serialize).to eq(value) + expect(value_after_serialize.choice?).to be(true) + end end