Class: Helium::Resource
- Inherits:
-
Object
- Object
- Helium::Resource
- Extended by:
- Utils
- Includes:
- Utils
- Defined in:
- lib/helium/resource.rb
Overview
Abstract base class for Helium Resources returned by the API
Direct Known Subclasses
Configuration, DataPoint, DeviceConfiguration, Element, Label, Organization, Sensor, User
Instance Attribute Summary collapse
-
#id ⇒ Object
readonly
Returns the value of attribute id.
-
#params ⇒ Object
readonly
Returns the value of attribute params.
-
#type ⇒ Object
readonly
Returns the value of attribute type.
Class Method Summary collapse
- .all(opts = {}) ⇒ Object
-
.all_path ⇒ String
The resource's index API route.
-
.create(attributes, opts = {}) ⇒ Resource
Creates a new resource with given attributes.
-
.find(id, opts = {}) ⇒ Resource
Finds a single Resource by id.
- .initialize_from_path(opts = {}) ⇒ Object
- .resource_name ⇒ Object
-
.singleton(opts = {}) ⇒ Resource
Fetches a singleton resource (e.g. organization, user).
Instance Method Summary collapse
-
#==(other) ⇒ Boolean
Override equality to use id for comparisons.
-
#as_json ⇒ Hash
Inheriting resources should implement this with super.
-
#created_at ⇒ DateTime?
When the resource was created.
-
#destroy ⇒ Boolean
Deletes the Resource.
-
#eql?(other) ⇒ Boolean
Override equality to use id for comparisons.
-
#hash ⇒ Integer
Override equality to use id for comparisons.
-
#initialize(opts = {}) ⇒ Resource
constructor
A new instance of Resource.
- #metadata ⇒ Object
- #resource_name ⇒ Object
-
#resource_path ⇒ String
Returns a path identifying the current resource.
-
#to_json(*options) ⇒ String
A JSON-encoded String representing the resource.
-
#update(attributes) ⇒ Resource
Updates a Resource.
-
#updated_at ⇒ DateTime?
When the resource was last updated.
Methods included from Utils
Constructor Details
#initialize(opts = {}) ⇒ Resource
Returns a new instance of Resource
7 8 9 10 11 12 13 14 15 |
# File 'lib/helium/resource.rb', line 7 def initialize(opts = {}) @client = opts.fetch(:client) @params = opts.fetch(:params) @id = @params["id"] @type = @params.dig('type') @created_at = @params.dig('meta', 'created') @updated_at = @params.dig('meta', 'updated') end |
Instance Attribute Details
#id ⇒ Object (readonly)
Returns the value of attribute id
4 5 6 |
# File 'lib/helium/resource.rb', line 4 def id @id end |
#params ⇒ Object (readonly)
Returns the value of attribute params
4 5 6 |
# File 'lib/helium/resource.rb', line 4 def params @params end |
#type ⇒ Object (readonly)
Returns the value of attribute type
4 5 6 |
# File 'lib/helium/resource.rb', line 4 def type @type end |
Class Method Details
.all(opts = {}) ⇒ Object
26 27 28 29 |
# File 'lib/helium/resource.rb', line 26 def all(opts = {}) client = opts.fetch(:client) Collection.new(klass: self, client: client).all end |
.all_path ⇒ String
The resource's index API route
22 23 24 |
# File 'lib/helium/resource.rb', line 22 def all_path "/#{resource_name}" end |
.create(attributes, opts = {}) ⇒ Resource
Creates a new resource with given attributes
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/helium/resource.rb', line 52 def create(attributes, opts = {}) client = opts.fetch(:client) path = "/#{resource_name}" body = { data: { attributes: attributes, type: resource_name } } response = client.post(path, body: body) resource_data = JSON.parse(response.body)["data"] return self.new(client: client, params: resource_data) end |
.find(id, opts = {}) ⇒ Resource
Finds a single Resource by id
35 36 37 38 |
# File 'lib/helium/resource.rb', line 35 def find(id, opts = {}) client = opts.fetch(:client) initialize_from_path(path: "/#{resource_name}/#{id}", client: client) end |
.initialize_from_path(opts = {}) ⇒ Object
74 75 76 77 78 79 80 81 |
# File 'lib/helium/resource.rb', line 74 def initialize_from_path(opts = {}) client = opts.fetch(:client) path = opts.fetch(:path) response = client.get(path) resource_data = JSON.parse(response.body)["data"] return self.new(client: client, params: resource_data) end |
.resource_name ⇒ Object
70 71 72 |
# File 'lib/helium/resource.rb', line 70 def resource_name kebab_case(self.name.split('::').last) end |
.singleton(opts = {}) ⇒ Resource
Fetches a singleton resource (e.g. organization, user)
43 44 45 46 |
# File 'lib/helium/resource.rb', line 43 def singleton(opts = {}) client = opts.fetch(:client) initialize_from_path(path: all_path, client: client) end |
Instance Method Details
#==(other) ⇒ Boolean
Override equality to use id for comparisons
121 122 123 |
# File 'lib/helium/resource.rb', line 121 def ==(other) self.id == other.id end |
#as_json ⇒ Hash
Inheriting resources should implement this with super
151 152 153 154 155 156 157 158 |
# File 'lib/helium/resource.rb', line 151 def as_json { id: id, type: type, created_at: created_at, updated_at: updated_at } end |
#created_at ⇒ DateTime?
Returns when the resource was created
138 139 140 141 |
# File 'lib/helium/resource.rb', line 138 def created_at return nil if @created_at.nil? @_created_at ||= DateTime.parse(@created_at) end |
#destroy ⇒ Boolean
Deletes the Resource
111 112 113 |
# File 'lib/helium/resource.rb', line 111 def destroy @client.delete(resource_path) end |
#eql?(other) ⇒ Boolean
Override equality to use id for comparisons
127 128 129 |
# File 'lib/helium/resource.rb', line 127 def eql?(other) self == other end |
#hash ⇒ Integer
Override equality to use id for comparisons
133 134 135 |
# File 'lib/helium/resource.rb', line 133 def hash id.hash end |
#metadata ⇒ Object
115 116 117 |
# File 'lib/helium/resource.rb', line 115 def Metadata.new(client: @client, klass: self) end |
#resource_name ⇒ Object
165 166 167 |
# File 'lib/helium/resource.rb', line 165 def resource_name kebab_case(self.class.name.split('::').last) end |
#resource_path ⇒ String
Returns a path identifying the current resource. Can be overridden in child classes to handle non-standard resources (e.g. Organization)
87 88 89 |
# File 'lib/helium/resource.rb', line 87 def resource_path "/#{resource_name}/#{self.id}" end |
#to_json(*options) ⇒ String
Returns a JSON-encoded String representing the resource
161 162 163 |
# File 'lib/helium/resource.rb', line 161 def to_json(*) as_json.to_json(*) end |
#update(attributes) ⇒ Resource
Updates a Resource
94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/helium/resource.rb', line 94 def update(attributes) body = { data: { attributes: attributes, id: self.id, type: resource_name } } response = @client.patch(resource_path, body: body) resource_data = JSON.parse(response.body)["data"] return self.class.new(client: @client, params: resource_data) end |
#updated_at ⇒ DateTime?
Returns when the resource was last updated
144 145 146 147 |
# File 'lib/helium/resource.rb', line 144 def updated_at return nil if @updated_at.nil? @_updated_at ||= DateTime.parse(@updated_at) end |