From c809b36f3aacfe83ad8725b59f1ffe6e56ec9942 Mon Sep 17 00:00:00 2001 From: Joe Stein Date: Tue, 13 Dec 2022 20:07:54 -0500 Subject: [PATCH 1/3] Add class enum values accessor --- docs/enums.md | 3 ++- lib/store_model/enum.rb | 1 + spec/store_model/enum_spec.rb | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/docs/enums.md b/docs/enums.md index 06a9ac3..99bf81f 100644 --- a/docs/enums.md +++ b/docs/enums.md @@ -18,6 +18,7 @@ config.active? # => false config.status_value # => 0 config.status_values # => { :active => 0, :archived => 1 } +Configuration.status_values # => { :active => 0, :archived => 1 } ``` Under the hood, values are stored as integers, according to the index of the element in the array: @@ -57,4 +58,4 @@ review.archived_status? # => false review.comments_active? # => false review.comments_inactive? # => true -``` \ No newline at end of file +``` diff --git a/lib/store_model/enum.rb b/lib/store_model/enum.rb index f9c5799..9c8279b 100644 --- a/lib/store_model/enum.rb +++ b/lib/store_model/enum.rb @@ -18,6 +18,7 @@ def enum(name, values = nil, **kwargs) define_writer(name, mapping) define_method("#{name}_value") { attributes[name.to_s] } define_method("#{name}_values") { mapping } + singleton_class.define_method("#{name}_values") { mapping } define_predicate_methods(name, mapping, options) end end diff --git a/spec/store_model/enum_spec.rb b/spec/store_model/enum_spec.rb index 27c5a80..279a3fd 100644 --- a/spec/store_model/enum_spec.rb +++ b/spec/store_model/enum_spec.rb @@ -35,6 +35,27 @@ expect(subject.status_values).to eq(active: 1, archived: 0) end + it "has .values class method" do + expect(config_class.status_values).to eq(active: 1, archived: 0) + end + + context "when multiple StoreModel classes are defined" do + let!(:another_config_class) do + Class.new do + include StoreModel::Model + + enum :status, off: 0, on: 1 + enum :level, low: 1, medium: 2, high: 3 + end + end + + it "does not share enum mapping methods between classes" do + expect(another_config_class.status_values).to eq(off: 0, on: 1) + expect(config_class.status_values).to eq(active: 1, archived: 0) + expect(config_class.respond_to?(:level_values)).to eq(false) + end + end + context "when value is not in the list" do let(:value) { "undefined" } From 74f989035e410fe22a4d49bb46c14a6506ca071c Mon Sep 17 00:00:00 2001 From: Joe Stein Date: Tue, 13 Dec 2022 20:25:53 -0500 Subject: [PATCH 2/3] Add Rails-style pluralized enum mapping reader --- docs/enums.md | 2 ++ lib/store_model/enum.rb | 2 ++ spec/store_model/enum_spec.rb | 8 ++++++++ 3 files changed, 12 insertions(+) diff --git a/docs/enums.md b/docs/enums.md index 99bf81f..c31d8a5 100644 --- a/docs/enums.md +++ b/docs/enums.md @@ -18,7 +18,9 @@ config.active? # => false config.status_value # => 0 config.status_values # => { :active => 0, :archived => 1 } +config.statuses # => { :active => 0, :archived => 1 } Configuration.status_values # => { :active => 0, :archived => 1 } +Configuration.statuses # => { :active => 0, :archived => 1 } ``` Under the hood, values are stored as integers, according to the index of the element in the array: diff --git a/lib/store_model/enum.rb b/lib/store_model/enum.rb index 9c8279b..aea1d71 100644 --- a/lib/store_model/enum.rb +++ b/lib/store_model/enum.rb @@ -18,7 +18,9 @@ def enum(name, values = nil, **kwargs) define_writer(name, mapping) define_method("#{name}_value") { attributes[name.to_s] } define_method("#{name}_values") { mapping } + alias_method(ActiveSupport::Inflector.pluralize(name), "#{name}_values") singleton_class.define_method("#{name}_values") { mapping } + singleton_class.alias_method(ActiveSupport::Inflector.pluralize(name), "#{name}_values") define_predicate_methods(name, mapping, options) end end diff --git a/spec/store_model/enum_spec.rb b/spec/store_model/enum_spec.rb index 279a3fd..c9c2dab 100644 --- a/spec/store_model/enum_spec.rb +++ b/spec/store_model/enum_spec.rb @@ -39,6 +39,14 @@ expect(config_class.status_values).to eq(active: 1, archived: 0) end + it "aliases the pluralized name to the #values method" do + expect(subject.statuses).to eq(subject.status_values) + end + + it "aliases the pluralized name to the .values method" do + expect(config_class.statuses).to eq(config_class.status_values) + end + context "when multiple StoreModel classes are defined" do let!(:another_config_class) do Class.new do From ed31a53b181cf9926cac26a7b2fae1ddd062f979 Mon Sep 17 00:00:00 2001 From: Joe Stein Date: Thu, 15 Dec 2022 09:57:11 -0500 Subject: [PATCH 3/3] Refactor for Rubocop --- lib/store_model/enum.rb | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/store_model/enum.rb b/lib/store_model/enum.rb index aea1d71..f64b0d7 100644 --- a/lib/store_model/enum.rb +++ b/lib/store_model/enum.rb @@ -17,10 +17,7 @@ def enum(name, values = nil, **kwargs) define_reader(name, mapping) define_writer(name, mapping) define_method("#{name}_value") { attributes[name.to_s] } - define_method("#{name}_values") { mapping } - alias_method(ActiveSupport::Inflector.pluralize(name), "#{name}_values") - singleton_class.define_method("#{name}_values") { mapping } - singleton_class.alias_method(ActiveSupport::Inflector.pluralize(name), "#{name}_values") + define_map_readers(name, mapping) define_predicate_methods(name, mapping, options) end end @@ -47,6 +44,13 @@ def define_predicate_methods(name, mapping, options) end end + def define_map_readers(name, mapping) + define_method("#{name}_values") { mapping } + alias_method(ActiveSupport::Inflector.pluralize(name), "#{name}_values") + singleton_class.define_method("#{name}_values") { mapping } + singleton_class.alias_method(ActiveSupport::Inflector.pluralize(name), "#{name}_values") + end + def cast_type(mapping) StoreModel::Types::EnumType.new(mapping) end