Class: Spaceship::Base
- Inherits:
-
Object
- Object
- Spaceship::Base
- Defined in:
- lib/spaceship/base.rb
Overview
Spaceship::Base is the superclass for models in Apple Developer Portal. It’s mainly responsible for mapping responses to objects.
A class-level attribute ‘client` is used to maintain the spaceship which we are using to talk to ADP.
Example of creating a new ADP model:
class Widget < Spaceship::Base
attr_accessor :id, :name, :foo_bar, :wiz_baz
attr_mapping({
'name' => :name,
'fooBar' => :foo_bar,
'wizBaz' => :wiz_baz
})
end
When you want to instantiate a model pass in the parsed response: ‘Widget.new(widget_json)`
Direct Known Subclasses
Defined Under Namespace
Classes: DataHash
Class Attribute Summary collapse
-
.client ⇒ Spaceship::Client
The client used to make requests.
Instance Attribute Summary collapse
-
#client ⇒ Spaceship::Client
readonly
The current spaceship client used by the model to make requests.
-
#raw_data ⇒ Hash/Array
Holds the raw data we got from Apple’s server to use it later.
Storing the `attr_accessor` collapse
-
.attr_accessor(*vars) ⇒ Object
From stackoverflow.com/questions/2487333/fastest-one-liner-way-to-list-attr-accessors-in-ruby This will store a list of defined attr_accessors to easily access them when inspecting the values.
- .attributes ⇒ Object
- #attributes ⇒ Object
Inspect related code collapse
Class Method Summary collapse
-
.attr_mapping(attr_map = nil) ⇒ Object
Defines the attribute mapping between the response from Apple and our model objects.
-
.mapping_module(attr_mapping) ⇒ Module
Binds attributes getters and setters to underlying data returned from the API.
-
.method_missing(method_sym, *args, &block) ⇒ Object
Call a method to return a subclass constant.
-
.set_client(client) ⇒ Spaceship::Base
Sets client and returns self for chaining.
Instance Method Summary collapse
-
#initialize(attrs = {}) ⇒ Base
constructor
The initialize method accepts a parsed response from Apple and sets all attributes that are defined by ‘attr_mapping`.
-
#setup ⇒ Object
This method can be used by subclasses to do additional initialisation using the ‘raw_data`.
Constructor Details
#initialize(attrs = {}) ⇒ Base
The initialize method accepts a parsed response from Apple and sets all attributes that are defined by ‘attr_mapping`
Do not override ‘initialize` in your own models.
177 178 179 180 181 182 183 184 |
# File 'lib/spaceship/base.rb', line 177 def initialize(attrs = {}) attrs.each do |key, val| self.send("#{key}=", val) if respond_to?("#{key}=") end self.raw_data = DataHash.new(attrs) @client = self.class.client self.setup end |
Class Attribute Details
.client ⇒ Spaceship::Client
The client used to make requests.
62 63 64 |
# File 'lib/spaceship/base.rb', line 62 def client @client end |
Instance Attribute Details
#client ⇒ Spaceship::Client (readonly)
Returns The current spaceship client used by the model to make requests.
165 166 167 |
# File 'lib/spaceship/base.rb', line 165 def client @client end |
#raw_data ⇒ Hash/Array
Returns Holds the raw data we got from Apple’s server to use it later.
170 171 172 |
# File 'lib/spaceship/base.rb', line 170 def raw_data @raw_data end |
Class Method Details
.attr_accessor(*vars) ⇒ Object
From stackoverflow.com/questions/2487333/fastest-one-liner-way-to-list-attr-accessors-in-ruby This will store a list of defined attr_accessors to easily access them when inspecting the values
196 197 198 199 200 |
# File 'lib/spaceship/base.rb', line 196 def self.attr_accessor(*vars) @attributes ||= [] @attributes.concat vars super(*vars) end |
.attr_mapping(attr_map = nil) ⇒ Object
Defines the attribute mapping between the response from Apple and our model objects. Keys are to match keys in the response and the values are to match attributes on the model.
Example of using ‘attr_mapping`
class Widget < Spaceship::Base
attr_accessor :id, :name, :foo_bar, :wiz_baz
attr_mapping({
'name' => :name,
'fooBar' => :foo_bar,
'wizBaz' => :wiz_baz
})
end
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/spaceship/base.rb', line 113 def attr_mapping(attr_map = nil) if attr_map @attr_mapping = attr_map @attr_mapping.values.each do |method_name| getter = method_name.to_sym setter = "#{method_name}=".to_sym remove_method(getter) if public_instance_methods.include?(getter) remove_method(setter) if public_instance_methods.include?(setter) end include(mapping_module(@attr_mapping)) else begin @attr_mapping ||= ancestors[1].attr_mapping rescue NoMethodError rescue NameError end end return @attr_mapping end |
.attributes ⇒ Object
202 203 204 205 206 207 208 209 |
# File 'lib/spaceship/base.rb', line 202 def self.attributes @attributes ||= [] par = [] par = (self.superclass.attributes || []) unless self == Base @attributes + par end |
.mapping_module(attr_mapping) ⇒ Module
Binds attributes getters and setters to underlying data returned from the API. Setting any properties will alter the ‘raw_data` hash.
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/spaceship/base.rb', line 81 def mapping_module(attr_mapping) Module.new do attr_mapping.each do |source, dest| getter = dest.to_sym setter = "#{dest}=".to_sym define_method(getter) do raw_data.get(*source.split('.')) end define_method(setter) do |value| self.raw_data ||= DataHash.new({}) raw_data.set(source.split('.'), value) end end end end |
.method_missing(method_sym, *args, &block) ⇒ Object
Call a method to return a subclass constant.
If ‘method_sym` is an underscored name of a class, return the class with the current client passed into it. If the method does not match, NoMethodError is raised.
Example:
Certificate.production_push
#=> Certificate::ProductionPush
ProvisioningProfile.ad_hoc
#=> ProvisioningProfile::AdHoc
ProvisioningProfile.some_other_method
#=> NoMethodError: undefined method `some_other_method' for ProvisioningProfile
150 151 152 153 154 155 156 157 158 159 160 |
# File 'lib/spaceship/base.rb', line 150 def method_missing(method_sym, *args, &block) module_name = method_sym.to_s module_name.sub!(/^[a-z\d]/) { $&.upcase } module_name.gsub!(%r{(?:_|(/))([a-z\d])}) { $2.upcase } if const_defined?(module_name) klass = const_get(module_name) klass.set_client(@client) else super end end |
.set_client(client) ⇒ Spaceship::Base
Sets client and returns self for chaining. rubocop:disable Style/AccessorMethodName
70 71 72 73 |
# File 'lib/spaceship/base.rb', line 70 def set_client(client) self.client = client self end |
Instance Method Details
#attributes ⇒ Object
211 212 213 |
# File 'lib/spaceship/base.rb', line 211 def attributes self.class.attributes end |
#inspect ⇒ Object
219 220 221 222 223 224 225 226 227 228 229 230 |
# File 'lib/spaceship/base.rb', line 219 def inspect inspectables = self.attributes value = inspectables.map do |k| v = self.send(k).inspect v.gsub!("\n", "\n\t") # to align nested elements "\t#{k}=#{v}" end.join(", \n") "<#{self.class.name} \n#{value}>" end |
#setup ⇒ Object
This method can be used by subclasses to do additional initialisation using the ‘raw_data`
188 |
# File 'lib/spaceship/base.rb', line 188 def setup; end |
#to_s ⇒ Object
232 233 234 |
# File 'lib/spaceship/base.rb', line 232 def to_s self.inspect end |