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 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: []