Class: RubyLokaliseApi::Resources::Base
- Inherits:
-
Object
- Object
- RubyLokaliseApi::Resources::Base
- Includes:
- Utils::AttributeHelpers
- Defined in:
- lib/ruby_lokalise_api/resources/base.rb
Direct Known Subclasses
Branch, Contributor, CustomTranslationStatus, File, Key, KeyComment, Order, PaymentCard, Project, ProjectComment, ProjectLanguage, QueuedProcess, Screenshot, Segment, Snapshot, SystemLanguage, Task, Team, TeamUser, TeamUserBillingDetails, TeamUserGroup, Translation, TranslationProvider, Webhook
Constant Summary
Constants included from RubyLokaliseApi::Request
RubyLokaliseApi::Request::PAGINATION_HEADERS
Constants included from Connection
Constants included from Utils::AttributeHelpers
Utils::AttributeHelpers::UNIFIED_RESOURCES
Instance Attribute Summary collapse
-
#branch ⇒ Object
readonly
Returns the value of attribute branch.
-
#client ⇒ Object
readonly
Returns the value of attribute client.
-
#key_id ⇒ Object
readonly
Returns the value of attribute key_id.
-
#path ⇒ Object
readonly
Returns the value of attribute path.
-
#project_id ⇒ Object
readonly
Returns the value of attribute project_id.
-
#raw_data ⇒ Object
readonly
Returns the value of attribute raw_data.
-
#team_id ⇒ Object
readonly
Returns the value of attribute team_id.
-
#user_id ⇒ Object
readonly
Returns the value of attribute user_id.
Class Method Summary collapse
-
.create(client, path, params) ⇒ Object
Creates one or multiple records.
-
.destroy(client, path, params = {}) ⇒ Object
Destroys records by given ids.
-
.find(client, path, params = {}) ⇒ Object
Fetches a single record.
-
.inherited(subclass) ⇒ Object
Dynamically adds attribute readers for each inherited class.
-
.supports(*methods) ⇒ Object
Defines CRUD instance methods.
-
.update(client, path, params) ⇒ Object
Updates one or multiple records.
Instance Method Summary collapse
- #[](raw_key_attr) ⇒ Object
-
#extract_common_attributes_for(content) ⇒ Object
Extracts all common attributes that resources have.
- #id_from(response, id_key, data_key) ⇒ Object
-
#infer_path_from(response, endpoint_generator = nil) ⇒ Object
Generates path for the individual resource based on the path for the collection.
-
#initialize(response, endpoint_generator = nil) ⇒ RubyLokaliseApi::Resources::Base
constructor
Initializes a new resource based on the response.
- #path_with_id(response, id_key, data_key, endpoint_generator = nil) ⇒ Object
-
#populate_attributes_for(content) ⇒ Object
Store all resources attributes under the corresponding instance variables.
Methods included from RubyLokaliseApi::Request
Methods included from Connection
Methods included from JsonHandler
Methods included from Utils::AttributeHelpers
attributes_for, data_key_for, id_key_for
Methods included from Utils::EndpointHelpers
Constructor Details
#initialize(response, endpoint_generator = nil) ⇒ RubyLokaliseApi::Resources::Base
Initializes a new resource based on the response. ‘endpoint_generator` is used in cases when a new instance is generated from a different resource. For example, restoring from a snapshot creates a totally different project which should have a new path.
23 24 25 26 27 28 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 23 def initialize(response, endpoint_generator = nil) populate_attributes_for response['content'] extract_common_attributes_for response['content'] @client = response['client'] @path = infer_path_from response, endpoint_generator end |
Instance Attribute Details
#branch ⇒ Object (readonly)
Returns the value of attribute branch.
13 14 15 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 13 def branch @branch end |
#client ⇒ Object (readonly)
Returns the value of attribute client.
13 14 15 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 13 def client @client end |
#key_id ⇒ Object (readonly)
Returns the value of attribute key_id.
13 14 15 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 13 def key_id @key_id end |
#path ⇒ Object (readonly)
Returns the value of attribute path.
13 14 15 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 13 def path @path end |
#project_id ⇒ Object (readonly)
Returns the value of attribute project_id.
13 14 15 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 13 def project_id @project_id end |
#raw_data ⇒ Object (readonly)
Returns the value of attribute raw_data.
13 14 15 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 13 def raw_data @raw_data end |
#team_id ⇒ Object (readonly)
Returns the value of attribute team_id.
13 14 15 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 13 def team_id @team_id end |
#user_id ⇒ Object (readonly)
Returns the value of attribute user_id.
13 14 15 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 13 def user_id @user_id end |
Class Method Details
.create(client, path, params) ⇒ Object
Creates one or multiple records
81 82 83 84 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 81 def create(client, path, params) response = post path, client, prepare_params(params) object_from response, params end |
.destroy(client, path, params = {}) ⇒ Object
Destroys records by given ids
93 94 95 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 93 def destroy(client, path, params = {}) delete(path, client, prepare_params(params))['content'] end |
.find(client, path, params = {}) ⇒ Object
Fetches a single record
76 77 78 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 76 def find(client, path, params = {}) new get(path, client, prepare_params(params)) end |
.inherited(subclass) ⇒ Object
Dynamically adds attribute readers for each inherited class. Attributes are defined in the ‘data/attributes.json` file. Also sets the `ATTRIBUTES` constant to assign values to each attribute later when the response arrives from the API
43 44 45 46 47 48 49 50 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 43 def inherited(subclass) klass_attributes = attributes_for subclass subclass.class_exec do const_set :ATTRIBUTES, klass_attributes attr_reader(*klass_attributes) end super end |
.supports(*methods) ⇒ Object
Defines CRUD instance methods. In the simplest case it delegates work to the class method. In more complex case it is possible to specify sub-path and the class method name to call. Usage: ‘supports :update, :destroy, [:complex_method, ’/sub/path’, :update]‘
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 56 def supports(*methods) methods.each do |m_data| # `method_name` - the method that the resource should support # `sub_path` - a string that has to be appended to a base path # `c_method` - method name to delegate the work to method_name, sub_path, c_method = m_data.is_a?(Array) ? m_data : [m_data, '', m_data] define_method method_name do |params = {}| path = instance_variable_get(:@path) # If there's a sub_path which is a string, # preserve the initial path to allow further chaining params = params.merge(_initial_path: path) if sub_path self.class.send c_method, instance_variable_get(:@client), path + sub_path, params end end end |
.update(client, path, params) ⇒ Object
Updates one or multiple records
87 88 89 90 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 87 def update(client, path, params) response = put path, client, prepare_params(params) object_from response, params end |
Instance Method Details
#[](raw_key_attr) ⇒ Object
30 31 32 33 34 35 36 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 30 def [](raw_key_attr) key_attr = raw_key_attr.to_s.to_sym return nil unless self.instance_variables.include?(:"@#{key_attr}") self.send key_attr end |
#extract_common_attributes_for(content) ⇒ Object
Extracts all common attributes that resources have. Some of them may be absent in certain cases. rubocop:disable Naming/MemoizedInstanceVariableName
199 200 201 202 203 204 205 206 207 208 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 199 def extract_common_attributes_for(content) return unless content @raw_data = content @project_id ||= content['project_id'] @user_id ||= content['user_id'] @team_id ||= content['team_id'] @key_id ||= content['key_id'] @branch ||= content['branch'] end |
#id_from(response, id_key, data_key) ⇒ Object
165 166 167 168 169 170 171 172 173 174 175 176 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 165 def id_from(response, id_key, data_key) # Content may be `{"project_id": '123', ...}` or {"snapshot": {"snapshot_id": '123', ...}} # Sometimes there is an `id_key` but it has a value of `null` # (for example when we do not place the actual order but only check its price). # In rare cases the actual identifier does not have an "_id" suffix # (for segments that have "segment_number" field instead) # Therefore we must explicitly check if the key is present content = response['content'] return content[id_key] if content.respond_to?(:key?) && content&.key?(id_key) content[data_key][id_key] end |
#infer_path_from(response, endpoint_generator = nil) ⇒ Object
Generates path for the individual resource based on the path for the collection
136 137 138 139 140 141 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 136 def infer_path_from(response, endpoint_generator = nil) id_key = id_key_for self.class.name.base_class_name data_key = data_key_for model_class: self.class.name.base_class_name path_with_id response, id_key, data_key, endpoint_generator end |
#path_with_id(response, id_key, data_key, endpoint_generator = nil) ⇒ Object
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 143 def path_with_id(response, id_key, data_key, endpoint_generator = nil) # Some resources do not have ids at all return unless response['content'] && (response['content'].key?(id_key) || response['content'].key?(data_key)) # ID of the resource id = id_from response, id_key, data_key # If `endpoint_generator` is present, generate a new path # based on the fetched id if endpoint_generator path = endpoint_generator.call project_id, id return path.remove_trailing_slash end path = response['path'] || response['base_path'] # If path already has id - just return it return path if path.match?(/#{id}\z/) # Otherwise this looks like a collection path, so append the resource id to it path.remove_trailing_slash + "/#{id}" end |
#populate_attributes_for(content) ⇒ Object
Store all resources attributes under the corresponding instance variables. ‘ATTRIBUTES` is defined inside resource-specific classes
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
# File 'lib/ruby_lokalise_api/resources/base.rb', line 180 def populate_attributes_for(content) return unless content data_key = data_key_for model_class: self.class.name.base_class_name self.class.const_get(:ATTRIBUTES).each do |attr| value = if content.key?(data_key) && content[data_key].is_a?(Hash) content[data_key][attr] else content[attr] end instance_variable_set "@#{attr}", value end end |