gifnoc 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/.editorconfig +24 -0
- data/.gitignore +8 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGELOG +2 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +60 -0
- data/LICENSE +201 -0
- data/README.md +97 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/gifnoc.gemspec +35 -0
- data/lib/gifnoc.rb +11 -0
- data/lib/gifnoc/apis.rb +5 -0
- data/lib/gifnoc/apis/account_api_methods.rb +29 -0
- data/lib/gifnoc/apis/api.rb +47 -0
- data/lib/gifnoc/apis/namespace_api_methods.rb +39 -0
- data/lib/gifnoc/apis/record_api_methods.rb +39 -0
- data/lib/gifnoc/apis/token_api_methods.rb +39 -0
- data/lib/gifnoc/clients.rb +5 -0
- data/lib/gifnoc/clients/account_client_methods.rb +24 -0
- data/lib/gifnoc/clients/client.rb +14 -0
- data/lib/gifnoc/clients/namespace_client_methods.rb +27 -0
- data/lib/gifnoc/clients/record_client_methods.rb +27 -0
- data/lib/gifnoc/clients/token_client_methods.rb +27 -0
- data/lib/gifnoc/exceptions.rb +18 -0
- data/lib/gifnoc/models.rb +6 -0
- data/lib/gifnoc/models/account.rb +18 -0
- data/lib/gifnoc/models/model.rb +71 -0
- data/lib/gifnoc/models/namespace.rb +20 -0
- data/lib/gifnoc/models/record.rb +53 -0
- data/lib/gifnoc/models/token.rb +20 -0
- data/lib/gifnoc/models/typed_attr_accessor.rb +62 -0
- data/lib/gifnoc/version.rb +3 -0
- metadata +213 -0
@@ -0,0 +1,71 @@
|
|
1
|
+
module Gifnoc
|
2
|
+
class Model
|
3
|
+
|
4
|
+
extend TypedAttrAccessor
|
5
|
+
|
6
|
+
def self.attributes_hash
|
7
|
+
return const_get(:ATTRIBUTES)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.attribute_names
|
11
|
+
return self.attributes_hash.keys
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.api_attribute_names
|
15
|
+
return self.attribute_names & const_get(:API_ATTRIBUTE_LIST)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.api_attributes_hash
|
19
|
+
return self.attributes_hash.select { |k, _| self.api_attribute_names.include?(k) }
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(**args)
|
23
|
+
raise NotImplementedError if self.class == Model
|
24
|
+
self.class.validate_attributes(args)
|
25
|
+
self.class.attribute_names.each { |arg| self.send("#{arg}=", args[arg]) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_api_hash
|
29
|
+
return self.class.api_attributes_hash.inject({}) do |hash, (name, type)|
|
30
|
+
value = self.send(name)
|
31
|
+
value = value&.to_s if type == TypedAttrAccessor::TYPE_DATE_TIME
|
32
|
+
hash[name.to_s] = value
|
33
|
+
next(hash)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.from_api_hash(api_hash)
|
38
|
+
validate_api_attributes(api_hash)
|
39
|
+
args = api_hash.inject({}) do |hash, (key, value)|
|
40
|
+
case api_attributes_hash[key.to_sym]
|
41
|
+
when TypedAttrAccessor::TYPE_DATE_TIME
|
42
|
+
hash[key.to_sym] = value.nil? ? value : DateTime.iso8601(value)
|
43
|
+
else
|
44
|
+
hash[key.to_sym] = value
|
45
|
+
end
|
46
|
+
hash
|
47
|
+
end
|
48
|
+
return new(**args)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def self.validate_api_attributes(args)
|
54
|
+
return validate_attributes_internal(args, self.api_attribute_names)
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.validate_attributes(args)
|
58
|
+
return validate_attributes_internal(args, self.attribute_names)
|
59
|
+
end
|
60
|
+
|
61
|
+
# method should be considered private, but it's called from both an instance method and a class method
|
62
|
+
def self.validate_attributes_internal(args, allowed_arguments)
|
63
|
+
current_arguments = args.keys.map(&:to_sym)
|
64
|
+
allowed_arguments = allowed_arguments.map(&:to_sym)
|
65
|
+
if (current_arguments | allowed_arguments).size > allowed_arguments.size
|
66
|
+
raise ArgumentError, "incorrect arguments: #{self.name} has the following attributes: #{allowed_arguments}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Gifnoc
|
2
|
+
class Namespace < Model
|
3
|
+
|
4
|
+
ATTRIBUTES = {
|
5
|
+
uuid: TypedAttrAccessor::TYPE_STRING,
|
6
|
+
name: TypedAttrAccessor::TYPE_STRING,
|
7
|
+
delete_protection: TypedAttrAccessor::TYPE_BOOLEAN,
|
8
|
+
record_count: TypedAttrAccessor::TYPE_INTEGER,
|
9
|
+
created_at: TypedAttrAccessor::TYPE_DATE_TIME,
|
10
|
+
updated_at: TypedAttrAccessor::TYPE_DATE_TIME,
|
11
|
+
}.deep_freeze
|
12
|
+
|
13
|
+
API_ATTRIBUTE_LIST = [:uuid, :name, :delete_protection, :record_count, :created_at, :updated_at].deep_freeze
|
14
|
+
|
15
|
+
attributes_hash.each do |name, type_alias|
|
16
|
+
typed_attr_accessor(name, type_alias)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "base64"
|
2
|
+
|
3
|
+
module Gifnoc
|
4
|
+
class Record < Model
|
5
|
+
|
6
|
+
ATTRIBUTES = {
|
7
|
+
uuid: TypedAttrAccessor::TYPE_STRING,
|
8
|
+
key: TypedAttrAccessor::TYPE_STRING,
|
9
|
+
raw_value: TypedAttrAccessor::TYPE_BASE64,
|
10
|
+
metadata: TypedAttrAccessor::TYPE_HASH,
|
11
|
+
ttl: TypedAttrAccessor::TYPE_INTEGER,
|
12
|
+
created_at: TypedAttrAccessor::TYPE_DATE_TIME,
|
13
|
+
updated_at: TypedAttrAccessor::TYPE_DATE_TIME,
|
14
|
+
last_access: TypedAttrAccessor::TYPE_DATE_TIME,
|
15
|
+
value: TypedAttrAccessor::TYPE_STRING,
|
16
|
+
}.deep_freeze
|
17
|
+
|
18
|
+
API_ATTRIBUTE_LIST = [:uuid, :key, :raw_value, :metadata, :ttl, :created_at, :updated_at, :last_access].deep_freeze
|
19
|
+
|
20
|
+
attributes_hash.each do |name, type_alias|
|
21
|
+
typed_attr_accessor(name, type_alias)
|
22
|
+
end
|
23
|
+
|
24
|
+
# keep raw_value and value in sync, allow calling super for typed_attr_accessor
|
25
|
+
module SetValueSyncer
|
26
|
+
def raw_value=(new_raw_value)
|
27
|
+
super(new_raw_value)
|
28
|
+
new_value = Base64.strict_decode64(new_raw_value) unless new_raw_value.nil?
|
29
|
+
instance_variable_set("@value", new_value)
|
30
|
+
return new_raw_value
|
31
|
+
end
|
32
|
+
|
33
|
+
def value=(new_value)
|
34
|
+
super(new_value)
|
35
|
+
new_raw_value = Base64.strict_encode64(new_value) unless new_value.nil?
|
36
|
+
instance_variable_set("@raw_value", new_raw_value)
|
37
|
+
return new_value
|
38
|
+
end
|
39
|
+
|
40
|
+
def initialize(**args)
|
41
|
+
if args.has_key?(:raw_value) && args.has_key?(:value)
|
42
|
+
raise ArgumentError, "only one of the :raw_value and :value attributes should be provided"
|
43
|
+
end
|
44
|
+
super(**args)
|
45
|
+
self.raw_value = args[:raw_value] if args.has_key?(:raw_value)
|
46
|
+
self.value = args[:value] if args.has_key?(:value)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
private_constant :SetValueSyncer
|
50
|
+
prepend SetValueSyncer
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Gifnoc
|
2
|
+
class Token < Model
|
3
|
+
|
4
|
+
ATTRIBUTES = {
|
5
|
+
uuid: TypedAttrAccessor::TYPE_STRING,
|
6
|
+
description: TypedAttrAccessor::TYPE_STRING,
|
7
|
+
secret: TypedAttrAccessor::TYPE_STRING,
|
8
|
+
expiry: TypedAttrAccessor::TYPE_DATE_TIME,
|
9
|
+
created_at: TypedAttrAccessor::TYPE_DATE_TIME,
|
10
|
+
updated_at: TypedAttrAccessor::TYPE_DATE_TIME,
|
11
|
+
}.deep_freeze
|
12
|
+
|
13
|
+
API_ATTRIBUTE_LIST = [:uuid, :description, :secret, :expiry, :created_at, :updated_at].deep_freeze
|
14
|
+
|
15
|
+
attributes_hash.each do |name, type_alias|
|
16
|
+
typed_attr_accessor(name, type_alias)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require "base64"
|
2
|
+
|
3
|
+
module Gifnoc
|
4
|
+
module TypedAttrAccessor
|
5
|
+
|
6
|
+
TYPE_STRING = :string
|
7
|
+
TYPE_DATE_TIME = :date_time
|
8
|
+
TYPE_BOOLEAN = :boolean
|
9
|
+
TYPE_INTEGER = :integer
|
10
|
+
TYPE_HASH = :hash
|
11
|
+
TYPE_BASE64 = :base64
|
12
|
+
|
13
|
+
def typed_attr_accessor(name, type_alias)
|
14
|
+
define_method(name) do
|
15
|
+
instance_variable_get("@#{name}")
|
16
|
+
end
|
17
|
+
|
18
|
+
define_method("#{name}=") do |value|
|
19
|
+
TypedAttrAccessor.type_checks(type_alias, value)
|
20
|
+
TypedAttrAccessor.type_specific_checks(type_alias, value)
|
21
|
+
instance_variable_set("@#{name}", value)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.allowed_types(type_alias)
|
26
|
+
allowed_types = []
|
27
|
+
allowed_types += [NilClass]
|
28
|
+
allowed_types += type_alias_to_type_array(type_alias)
|
29
|
+
return allowed_types
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.type_alias_to_type_array(type_alias)
|
33
|
+
case type_alias
|
34
|
+
when TYPE_STRING
|
35
|
+
return [String]
|
36
|
+
when TYPE_BASE64
|
37
|
+
return [String]
|
38
|
+
when TYPE_DATE_TIME
|
39
|
+
return [DateTime]
|
40
|
+
when TYPE_BOOLEAN
|
41
|
+
return [TrueClass, FalseClass]
|
42
|
+
when TYPE_INTEGER
|
43
|
+
return [Integer]
|
44
|
+
when TYPE_HASH
|
45
|
+
return [Hash]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.type_checks(type_alias, value)
|
50
|
+
allowed_types = self.allowed_types(type_alias)
|
51
|
+
raise ArgumentError.new("Invalid Type (allowed #{ allowed_types.inspect })") unless allowed_types.any? { |type| value.is_a?(type) }
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.type_specific_checks(type_alias, value)
|
55
|
+
case type_alias
|
56
|
+
when TYPE_BASE64
|
57
|
+
Base64.strict_decode64(value) if value # raises ArgumentError (invalid base64) if value is not a Base64 string
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
metadata
ADDED
@@ -0,0 +1,213 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gifnoc
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Cloud 66
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-11-22 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.16'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.16'
|
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: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry-byebug
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.6'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.6'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: webmock
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.4'
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: 3.4.2
|
79
|
+
type: :development
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - "~>"
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '3.4'
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 3.4.2
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: vcr
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '4.0'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '4.0'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: simplecov
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.16.1
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 0.16.1
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: httparty
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: 0.16.2
|
124
|
+
type: :runtime
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: 0.16.2
|
131
|
+
- !ruby/object:Gem::Dependency
|
132
|
+
name: ice_nine
|
133
|
+
requirement: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - "~>"
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: 0.11.2
|
138
|
+
type: :runtime
|
139
|
+
prerelease: false
|
140
|
+
version_requirements: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - "~>"
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: 0.11.2
|
145
|
+
description:
|
146
|
+
email:
|
147
|
+
- hello@cloud66.com
|
148
|
+
executables:
|
149
|
+
- console
|
150
|
+
- setup
|
151
|
+
extensions: []
|
152
|
+
extra_rdoc_files: []
|
153
|
+
files:
|
154
|
+
- ".editorconfig"
|
155
|
+
- ".gitignore"
|
156
|
+
- ".ruby-gemset"
|
157
|
+
- ".ruby-version"
|
158
|
+
- CHANGELOG
|
159
|
+
- Gemfile
|
160
|
+
- Gemfile.lock
|
161
|
+
- LICENSE
|
162
|
+
- README.md
|
163
|
+
- Rakefile
|
164
|
+
- bin/console
|
165
|
+
- bin/setup
|
166
|
+
- gifnoc.gemspec
|
167
|
+
- lib/gifnoc.rb
|
168
|
+
- lib/gifnoc/apis.rb
|
169
|
+
- lib/gifnoc/apis/account_api_methods.rb
|
170
|
+
- lib/gifnoc/apis/api.rb
|
171
|
+
- lib/gifnoc/apis/namespace_api_methods.rb
|
172
|
+
- lib/gifnoc/apis/record_api_methods.rb
|
173
|
+
- lib/gifnoc/apis/token_api_methods.rb
|
174
|
+
- lib/gifnoc/clients.rb
|
175
|
+
- lib/gifnoc/clients/account_client_methods.rb
|
176
|
+
- lib/gifnoc/clients/client.rb
|
177
|
+
- lib/gifnoc/clients/namespace_client_methods.rb
|
178
|
+
- lib/gifnoc/clients/record_client_methods.rb
|
179
|
+
- lib/gifnoc/clients/token_client_methods.rb
|
180
|
+
- lib/gifnoc/exceptions.rb
|
181
|
+
- lib/gifnoc/models.rb
|
182
|
+
- lib/gifnoc/models/account.rb
|
183
|
+
- lib/gifnoc/models/model.rb
|
184
|
+
- lib/gifnoc/models/namespace.rb
|
185
|
+
- lib/gifnoc/models/record.rb
|
186
|
+
- lib/gifnoc/models/token.rb
|
187
|
+
- lib/gifnoc/models/typed_attr_accessor.rb
|
188
|
+
- lib/gifnoc/version.rb
|
189
|
+
homepage: https://github.com/cloud66-oss/gifnoc-ruby
|
190
|
+
licenses:
|
191
|
+
- Apache-2.0
|
192
|
+
metadata: {}
|
193
|
+
post_install_message:
|
194
|
+
rdoc_options: []
|
195
|
+
require_paths:
|
196
|
+
- lib
|
197
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - ">="
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
203
|
+
requirements:
|
204
|
+
- - ">="
|
205
|
+
- !ruby/object:Gem::Version
|
206
|
+
version: '0'
|
207
|
+
requirements: []
|
208
|
+
rubyforge_project:
|
209
|
+
rubygems_version: 2.7.7
|
210
|
+
signing_key:
|
211
|
+
specification_version: 4
|
212
|
+
summary: A Ruby Gifnoc client implementation
|
213
|
+
test_files: []
|