Class: Hcloud::AbstractResource
- Inherits:
-
Object
- Object
- Hcloud::AbstractResource
show all
- Includes:
- Enumerable
- Defined in:
- lib/hcloud/abstract_resource.rb
Direct Known Subclasses
ActionResource, DatacenterResource, FloatingIPResource, ImageResource, IsoResource, LocationResource, NetworkResource, SSHKeyResource, ServerResource, ServerTypeResource, VolumeResource
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(client:, base_path: '') ⇒ AbstractResource
Returns a new instance of AbstractResource.
57
58
59
60
61
62
63
|
# File 'lib/hcloud/abstract_resource.rb', line 57
def initialize(client:, base_path: '')
@client = client
@page = 1
@per_page = 25
@order = []
@base_path = base_path
end
|
Instance Attribute Details
#client ⇒ Object
Returns the value of attribute client.
55
56
57
|
# File 'lib/hcloud/abstract_resource.rb', line 55
def client
@client
end
|
Class Method Details
.bind_to(klass) ⇒ Object
12
13
14
15
16
17
18
19
20
|
# File 'lib/hcloud/abstract_resource.rb', line 12
def bind_to(klass)
resource = self
%w[find find_by where all [] page limit per_page order
to_a count pagnation each].each do |method|
klass.define_singleton_method(method) do |*args, &block|
resource.new(client: Client.connection).public_send(method, *args, &block)
end
end
end
|
.filter_attributes(*keys) ⇒ Object
22
23
24
25
26
|
# File 'lib/hcloud/abstract_resource.rb', line 22
def filter_attributes(*keys)
return @filter_attributes if keys.to_a.empty?
@filter_attributes = keys
end
|
.resource(res = nil) ⇒ Object
44
45
46
47
48
49
50
51
52
|
# File 'lib/hcloud/abstract_resource.rb', line 44
def resource(res = nil)
return (@resource = res) if res
return @resource if @resource
auto_const = resource_class.name.demodulize.gsub('Resource', '').to_sym
return Hcloud.const_get(auto_const) if Hcloud.constants.include?(auto_const)
raise Error, "unable to lookup resource class for #{name}"
end
|
.resource_class ⇒ Object
28
29
30
|
# File 'lib/hcloud/abstract_resource.rb', line 28
def resource_class
ancestors[ancestors.index(Hcloud::AbstractResource) - 1]
end
|
.resource_path(path = nil) ⇒ Object
38
39
40
41
42
|
# File 'lib/hcloud/abstract_resource.rb', line 38
def resource_path(path = nil)
return (@resource_path = path) if path
@resource_path || resource_url
end
|
.resource_url(url = nil) ⇒ Object
32
33
34
35
36
|
# File 'lib/hcloud/abstract_resource.rb', line 32
def resource_url(url = nil)
return (@resource_url = url) if url
@resource_url || resource_class.name.demodulize.gsub('Resource', '').tableize
end
|
Instance Method Details
#[](arg) ⇒ Object
88
89
90
|
# File 'lib/hcloud/abstract_resource.rb', line 88
def [](arg)
find_by(id: arg)
end
|
#all ⇒ Object
65
66
67
|
# File 'lib/hcloud/abstract_resource.rb', line 65
def all
where
end
|
#each ⇒ Object
141
142
143
144
145
|
# File 'lib/hcloud/abstract_resource.rb', line 141
def each
run.each do |member|
yield(member)
end
end
|
#find(id) ⇒ Object
80
81
82
83
84
85
86
|
# File 'lib/hcloud/abstract_resource.rb', line 80
def find(id)
prepare_request(
[self.class.resource_url, id].join('/'),
resource_path: resource_path.to_s.singularize,
resource_class: self.class.resource
)
end
|
#find_by(**kwargs) ⇒ Object
92
93
94
95
96
97
98
99
|
# File 'lib/hcloud/abstract_resource.rb', line 92
def find_by(**kwargs)
if id = kwargs.delete(:id)
return find(id)
end
per_page(1).where(**kwargs).first
rescue Error::NotFound
end
|
#limit(limit) ⇒ Object
113
114
115
|
# File 'lib/hcloud/abstract_resource.rb', line 113
def limit(limit)
_dup :@limit, limit
end
|
#order(*sort) ⇒ Object
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
# File 'lib/hcloud/abstract_resource.rb', line 117
def order(*sort)
_dup :@order,
begin
sort.flat_map do |s|
case s
when Symbol, String then s.to_s
when Hash then s.map { |k, v| "#{k}:#{v}" }
else
raise ArgumentError,
"Unable to resolve type for given #{s.inspect} from #{sort}"
end
end
end
end
|
#page(page) ⇒ Object
def count
per_page(1).first&.response&.&.total_entries.to_i
end
105
106
107
|
# File 'lib/hcloud/abstract_resource.rb', line 105
def page(page)
_dup :@page, page
end
|
this is just to keep the actual bevahior
148
149
150
151
152
|
# File 'lib/hcloud/abstract_resource.rb', line 148
def
return :auto if client.
run.response.
end
|
#per_page(per_page) ⇒ Object
109
110
111
|
# File 'lib/hcloud/abstract_resource.rb', line 109
def per_page(per_page)
_dup :@per_page, per_page
end
|
#run ⇒ Object
132
133
134
135
136
137
138
139
|
# File 'lib/hcloud/abstract_resource.rb', line 132
def run
@run ||= multi_query(
resource_url,
q: @query,
resource_path: resource_path,
resource_class: self.class.resource
)
end
|
#where(**kwargs) ⇒ Object
69
70
71
72
73
74
75
76
77
78
|
# File 'lib/hcloud/abstract_resource.rb', line 69
def where(**kwargs)
kwargs.keys.each do |key|
keys = self.class.filter_attributes.map(&:to_s)
next if keys.include?(key.to_s)
raise ArgumentError, "unknown filter #{key}, allowed keys are #{keys}"
end
_dup :@query, @query.to_h.merge(kwargs)
end
|