numbered_list 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/numbered_list/item_value.rb +15 -0
- data/lib/numbered_list/marshall_base.rb +23 -0
- data/lib/numbered_list.rb +120 -0
- metadata +60 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c7a0281fa8871af467756a00e0b3c70ac11ca77a18f809d7b10427e638c27443
|
4
|
+
data.tar.gz: 7fcb58902ff140e9e9c4da9e9af716617d625e076c5fb303f9b52af1973d746f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 072420e73ca1233bfcc7b48577aa5deb5a707b0bf82da54acc8b5e2206b5ef15ba84b2115311e3581a0790af3655a4f38a5528912f1e89aa08b7c909f345ebb5
|
7
|
+
data.tar.gz: 824279249af3323e129c25b7cc3b9624fe493275962dbd4f253a72304e8ab5a896edbbec5821d56ccb79ab49391390205637c6a28f301c313186522ff747a825
|
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
class NumberedList::ItemValue < Value.new(:name, :formatted, :order_value, :description)
|
3
|
+
def builder_method_name
|
4
|
+
method_name.to_sym
|
5
|
+
end
|
6
|
+
def method_name
|
7
|
+
name.downcase.gsub(":", "_")
|
8
|
+
end
|
9
|
+
def query_method_name
|
10
|
+
"#{method_name}?".to_sym
|
11
|
+
end
|
12
|
+
def to_item_description
|
13
|
+
"#{formatted} :: #{description}"
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
class NumberedList::MarshallBase < ActiveRecord::Type::Value
|
3
|
+
|
4
|
+
def value_class
|
5
|
+
Item
|
6
|
+
end
|
7
|
+
|
8
|
+
def cast(value)
|
9
|
+
if value.nil?
|
10
|
+
return nil
|
11
|
+
end
|
12
|
+
if value.is_a?(Hash)
|
13
|
+
value_class.new(value["name"])
|
14
|
+
else
|
15
|
+
value_class.new(value.to_s)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def serialize(value)
|
20
|
+
value.nil? || value.blank? ? nil : value.to_s
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'numbered_list/item_value'
|
2
|
+
|
3
|
+
class NumberedList
|
4
|
+
attr_reader :item
|
5
|
+
|
6
|
+
delegate :formatted, :name, :description, :order_value, :to_item_description, to: :item
|
7
|
+
|
8
|
+
class BadType < StandardError
|
9
|
+
end
|
10
|
+
|
11
|
+
class DuplicateKey < StandardError
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.reset_list!
|
15
|
+
|
16
|
+
list.values.each do |item|
|
17
|
+
|
18
|
+
if respond_to?(item.builder_method_name)
|
19
|
+
|
20
|
+
(
|
21
|
+
class << self;
|
22
|
+
self;
|
23
|
+
end).send(:remove_method, item.builder_method_name)
|
24
|
+
|
25
|
+
end #https://www.ruby-forum.com/topic/116025
|
26
|
+
if respond_to?(item.query_method_name)
|
27
|
+
remove_method item.query_method_name
|
28
|
+
end
|
29
|
+
end
|
30
|
+
@items = {}
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.list
|
34
|
+
@items || {}
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.add_item(item)
|
38
|
+
|
39
|
+
if list.has_key?(item.name)
|
40
|
+
raise DuplicateKey, "The key #{item.name} has already been registered."
|
41
|
+
end
|
42
|
+
@items ||= {}
|
43
|
+
@items[item.name] = item
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.add_item_builder(item)
|
47
|
+
|
48
|
+
self.define_singleton_method(item.builder_method_name) do
|
49
|
+
self.new(item.name)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.add_item_query(item)
|
54
|
+
define_method(item.query_method_name) do
|
55
|
+
name == item.name
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.item(item_values)
|
60
|
+
|
61
|
+
item = NumberedList::ItemValue.with(item_values)
|
62
|
+
|
63
|
+
add_item(item)
|
64
|
+
add_item_builder(item)
|
65
|
+
add_item_query(item)
|
66
|
+
class_exists = "#{self}::Marshall".constantize rescue nil #https://stackoverflow.com/a/32869926
|
67
|
+
|
68
|
+
add_marshall_class unless class_exists
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.add_marshall_class
|
72
|
+
klass = self.const_set("Marshall", Class.new(NumberedList::MarshallBase))
|
73
|
+
original_class = self
|
74
|
+
klass.class_eval do
|
75
|
+
define_method(:value_class) do
|
76
|
+
return original_class
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def initialize(name)
|
82
|
+
if !self.class.types.include?(name.to_s.upcase)
|
83
|
+
raise BadType, "'#{name}' Class #{name.class} is not a valid #{self.class.to_s}"
|
84
|
+
end
|
85
|
+
@item = self.class.find_item(name.to_s)
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
def self.find_item(key)
|
90
|
+
list && list.has_key?(key) ? list[key] : raise(BadType, "Unable to find the #{key}/#{key.class} for #{self.to_s} #{self.types} NumberedItem")
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
def self.description(label)
|
95
|
+
find_item(label).description
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.as_objs
|
99
|
+
self.types.collect {|t| self.new(t)}
|
100
|
+
end
|
101
|
+
|
102
|
+
def ==(other)
|
103
|
+
other.to_s == self.to_s
|
104
|
+
end
|
105
|
+
|
106
|
+
def to_s
|
107
|
+
name
|
108
|
+
end
|
109
|
+
|
110
|
+
def to_str
|
111
|
+
to_s
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.types
|
115
|
+
list.keys
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
end
|
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: numbered_list
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dirk Elmendorf
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-08-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activemodel
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: This is a simpler wrapper object to make it easy to build usefule Enum/Value
|
28
|
+
Objects
|
29
|
+
email: dirk@r26d.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- lib/numbered_list.rb
|
35
|
+
- lib/numbered_list/item_value.rb
|
36
|
+
- lib/numbered_list/marshall_base.rb
|
37
|
+
homepage: https://rubygems.org/gems/numberd_list
|
38
|
+
licenses:
|
39
|
+
- MIT
|
40
|
+
metadata: {}
|
41
|
+
post_install_message:
|
42
|
+
rdoc_options: []
|
43
|
+
require_paths:
|
44
|
+
- lib
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
requirements: []
|
56
|
+
rubygems_version: 3.0.3
|
57
|
+
signing_key:
|
58
|
+
specification_version: 4
|
59
|
+
summary: Enum/Value Object Builder
|
60
|
+
test_files: []
|