class_kit 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7c098100e74808a81385dc01f687de12ed23d536
4
+ data.tar.gz: 6ce23029485fa7381189d86477c9d0bd37f8ff36
5
+ SHA512:
6
+ metadata.gz: af363a65e1e3b5d8278468ae08f232c14b4c4ba7e5d9ee171bbf3629c9261a1828325b78344eca4c281f84518841455f5ffc64351ba5884937f6cd4ccda380b4
7
+ data.tar.gz: ff2db177937e4f8f2598a011c4bd8d8a793fb30e67d12852198d2c1ea1a5dd2617362b1c3a49647e93258e3988a47845ccebf48a9feee396ac96a09eda94718c
@@ -0,0 +1,10 @@
1
+ require_relative 'class_kit/version'
2
+ require_relative 'class_kit/class_methods'
3
+ require_relative 'class_kit/exceptions'
4
+ require_relative 'class_kit/attribute_helper'
5
+ require_relative 'class_kit/value_helper'
6
+ require_relative 'class_kit/helper'
7
+ require 'hash_kit'
8
+ require 'json'
9
+ require 'date'
10
+
@@ -0,0 +1,19 @@
1
+ module ClassKit
2
+ class AttributeHelper
3
+ def get_attributes(klass)
4
+ return klass.class_variable_get(:@@class_kit_attributes).freeze
5
+ end
6
+
7
+ def get_attribute(klass:, name:)
8
+ attribute = get_attributes(klass).detect { |i| i[:name] == name }
9
+ if attribute == nil
10
+ raise ClassKit::Exceptions::AttributeNotFoundError.new("Attribute: #{name}, could not be found.")
11
+ end
12
+ return attribute
13
+ end
14
+
15
+ def get_attribute_type(klass:,name:)
16
+ return get_attribute(klass: klass,name: name)[:type]
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,100 @@
1
+ module ClassKit
2
+ def attr_accessor_type(name, type: nil, collection_type: nil, allow_nil: true, default: nil, auto_init: false, meta: {})
3
+
4
+ if !self.class_variable_defined?(:@@class_kit_attributes)
5
+ self.class_variable_set(:@@class_kit_attributes, [])
6
+ end
7
+
8
+ if !self.class_variable_defined?(:@@is_class_kit_class)
9
+ self.class_variable_set(:@@is_class_kit_class, true)
10
+ end
11
+
12
+ attributes = self.class_variable_get(:@@class_kit_attributes)
13
+ attributes.push({ name: name, type: type, collection_type: collection_type, allow_nil: allow_nil, default: default, auto_init: auto_init, meta: meta })
14
+ self.class_variable_set(:@@class_kit_attributes, attributes)
15
+
16
+ self.class_eval do
17
+ define_method name do
18
+
19
+ cka = self.class.class_variable_get(:@@class_kit_attributes).detect { |i| i[:name] == name }
20
+
21
+ if eval("@#{name}") == nil && cka[:default] != nil
22
+ eval("@#{name}=cka[:default]")
23
+ end
24
+
25
+ if eval("@#{name}") == nil && cka[:auto_init] == true
26
+ eval("@#{name}=cka[:type].new")
27
+ end
28
+
29
+ return eval("@#{name}")
30
+ end
31
+ end
32
+
33
+ self.class_eval do
34
+ define_method "#{name}=" do |value|
35
+
36
+ #get the attribute meta data
37
+ cka = self.class.class_variable_get(:@@class_kit_attributes).detect { |i| i[:name] == name }
38
+
39
+ #verify if the attribute is allowed to be set to nil
40
+ if value == nil && cka[:allow_nil] == false
41
+ raise ClassKit::Exceptions::InvalidAttributeValueError.new("Attribute: #{name}, must not be nil.")
42
+ end
43
+
44
+ #check if the value being set is not of the specified type and should attempt to parse the value
45
+ if cka[:type] != nil && value != nil && (cka[:type] == :bool || !value.is_a?(cka[:type]))
46
+ begin
47
+ if cka[:type] == Time
48
+ if value.is_a?(Integer) || value.is_a?(Float)
49
+ value = Time.at(value)
50
+ else
51
+ value = Time.parse(value)
52
+ end
53
+ elsif cka[:type] == Date
54
+ if value.is_a?(Integer)
55
+ value = Date.at(value)
56
+ else
57
+ value = Date.parse(value)
58
+ end
59
+ elsif cka[:type] == DateTime
60
+ if value.is_a?(Integer)
61
+ value = DateTime.at(value)
62
+ else
63
+ value = DateTime.parse(value)
64
+ end
65
+ elsif cka[:type] == :bool
66
+ if value == true || value == false
67
+ value = value
68
+ elsif(/(true|t|yes|y|1)$/i === value.to_s.downcase)
69
+ value = true
70
+ elsif (/(false|f|no|n|0)$/i === value.to_s.downcase)
71
+ value = false
72
+ elsif value != nil
73
+ raise 'Unable to parse bool'
74
+ end
75
+ elsif cka[:type] == Integer
76
+ value = Integer(value)
77
+ elsif cka[:type] == Float
78
+ value = Float(value)
79
+ elsif cka[:type] == String
80
+ value = String(value)
81
+ elsif cka[:type] == Hash
82
+ raise 'Unable to parse Hash'
83
+ elsif cka[:type] == Array
84
+ raise 'Unable to parse Array'
85
+ elsif cka[:type] == Hash
86
+ raise 'Unable to parse Hash'
87
+ else
88
+ raise 'Unable to parse'
89
+ end
90
+ rescue => e
91
+ raise ClassKit::Exceptions::InvalidAttributeValueError.new("Attribute: #{name}, must be of type: #{cka[:type]}. Error: #{e}")
92
+ end
93
+ end
94
+
95
+ eval("@#{name}=value")
96
+ end
97
+ end
98
+
99
+ end
100
+ end
@@ -0,0 +1,4 @@
1
+ require_relative 'exceptions/invalid_attribute_value_error'
2
+ require_relative 'exceptions/attribute_not_found_error'
3
+ require_relative 'exceptions/invalid_class_error'
4
+ require_relative 'exceptions/invalid_parse_value_error'
@@ -0,0 +1,9 @@
1
+ module ClassKit
2
+ module Exceptions
3
+ class AttributeNotFoundError < StandardError
4
+ def initialize(message = 'Attribute not found.')
5
+ super
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module ClassKit
2
+ module Exceptions
3
+ class InvalidAttributeValueError < StandardError
4
+ def initialize(message = 'Invalid attribute value specified.')
5
+ super
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module ClassKit
2
+ module Exceptions
3
+ class InvalidClassError < StandardError
4
+ def initialize(message = 'Invalid class.')
5
+ super
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module ClassKit
2
+ module Exceptions
3
+ class InvalidParseValueError < StandardError
4
+ def initialize(message = 'Invalid parse value specified.')
5
+ super
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,69 @@
1
+ module ClassKit
2
+ class Helper
3
+
4
+ def initialize
5
+ @hash_helper = HashKit::Helper.new
6
+ @attribute_helper = ClassKit::AttributeHelper.new
7
+ @value_helper = ClassKit::ValueHelper.new
8
+ end
9
+
10
+ def is_class_kit?(klass)
11
+ begin
12
+ if !klass.class_variable_defined?(:@@is_class_kit_class)
13
+ return false
14
+ end
15
+ rescue
16
+ return false
17
+ end
18
+
19
+ return true
20
+ end
21
+
22
+ def validate_class_kit(klass)
23
+ if !is_class_kit?(klass)
24
+ raise ClassKit::Exceptions::InvalidClassError.new("Class: #{klass} does not implement ClassKit.")
25
+ end
26
+ return true
27
+ end
28
+
29
+ def to_hash(object)
30
+ validate_class_kit(object.class)
31
+ @hash_helper.to_hash(object)
32
+ end
33
+
34
+ def from_hash(hash:, klass:)
35
+ validate_class_kit(klass)
36
+ entity = klass.new
37
+ attributes = @attribute_helper.get_attributes(klass)
38
+ attributes.each do |a|
39
+ key = a[:name]
40
+ type = a[:type]
41
+
42
+ if hash[key] == nil
43
+ next
44
+ end
45
+
46
+ if is_class_kit?(type)
47
+ value = from_hash(hash: hash[key], klass: type)
48
+ elsif type == Array
49
+ value = hash[key].map do |i|
50
+ if a[:collection_type] != nil
51
+ if is_class_kit?(a[:collection_type])
52
+ from_hash(hash: i, klass: a[:collection_type])
53
+ else
54
+ @value_helper.parse(type: a[:collection_type], value: i)
55
+ end
56
+ else
57
+ i
58
+ end
59
+ end
60
+ else
61
+ value = hash[key]
62
+ end
63
+ eval("entity.#{key}=value")
64
+ end
65
+ return entity
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,62 @@
1
+ module ClassKit
2
+ class ValueHelper
3
+ def parse(type: type, value: value)
4
+ begin
5
+ if type == Time
6
+ if value.is_a?(Time)
7
+ value = value
8
+ elsif value.is_a?(Integer) || value.is_a?(Float)
9
+ value = Time.at(value)
10
+ else
11
+ value = Time.parse(value)
12
+ end
13
+ elsif type == Date
14
+ if value.is_a?(Date)
15
+ value = value
16
+ elsif value.is_a?(Integer)
17
+ value = Date.at(value)
18
+ else
19
+ value = Date.parse(value)
20
+ end
21
+ elsif type == DateTime
22
+ if value.is_a?(DateTime)
23
+ value = value
24
+ elsif value.is_a?(Integer)
25
+ value = DateTime.at(value)
26
+ else
27
+ value = DateTime.parse(value)
28
+ end
29
+ elsif type == :bool
30
+ if value == true || value == false
31
+ value = value
32
+ elsif(/(true|t|yes|y|1)$/i === value.to_s.downcase)
33
+ value = true
34
+ elsif (/(false|f|no|n|0)$/i === value.to_s.downcase)
35
+ value = false
36
+ elsif value != nil
37
+ raise 'Unable to parse bool'
38
+ end
39
+ elsif type == Integer
40
+ value = Integer(value)
41
+ elsif type == Float
42
+ value = Float(value)
43
+ elsif type == String
44
+ value = String(value)
45
+ elsif type == Hash
46
+ raise 'Unable to parse Hash'
47
+ elsif type == Array
48
+ raise 'Unable to parse Array'
49
+ elsif type == Hash
50
+ raise 'Unable to parse Hash'
51
+ else
52
+ raise 'Unable to parse'
53
+ end
54
+ rescue => e
55
+ raise ClassKit::Exceptions::InvalidParseValueError.new("Unable to parse value: #{value} into type: #{type}. Error: #{e}")
56
+ end
57
+
58
+ return value
59
+ end
60
+
61
+ end
62
+ end
@@ -0,0 +1,3 @@
1
+ module ClassKit
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,154 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: class_kit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - vaughanbrittonsage
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-08-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: json
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 1.8.3
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 1.8.3
83
+ - !ruby/object:Gem::Dependency
84
+ name: hash_kit
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: json_kit
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Toolkit for working with classes
112
+ email:
113
+ - vaughan.britton@sage.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - lib/class_kit/attribute_helper.rb
119
+ - lib/class_kit/class_methods.rb
120
+ - lib/class_kit/exceptions/attribute_not_found_error.rb
121
+ - lib/class_kit/exceptions/invalid_attribute_value_error.rb
122
+ - lib/class_kit/exceptions/invalid_class_error.rb
123
+ - lib/class_kit/exceptions/invalid_parse_value_error.rb
124
+ - lib/class_kit/exceptions.rb
125
+ - lib/class_kit/helper.rb
126
+ - lib/class_kit/value_helper.rb
127
+ - lib/class_kit/version.rb
128
+ - lib/class_kit.rb
129
+ homepage: https://github.com/vaughanbrittonsage/class_kit
130
+ licenses:
131
+ - MIT
132
+ metadata: {}
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ required_rubygems_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - '>='
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ requirements: []
148
+ rubyforge_project:
149
+ rubygems_version: 2.0.14.1
150
+ signing_key:
151
+ specification_version: 4
152
+ summary: Toolkit for working with classes
153
+ test_files: []
154
+ has_rdoc: