cura 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/Gemfile +15 -0
- data/Gemfile.lock +122 -0
- data/LICENSE +20 -0
- data/README.md +159 -0
- data/Rakefile +42 -0
- data/cura.gemspec +23 -0
- data/examples/box_model/bin/box_model +11 -0
- data/examples/box_model/debug.log +0 -0
- data/examples/box_model/lib/box_model.rb +21 -0
- data/examples/box_model/lib/box_model/application.rb +24 -0
- data/examples/hello_world/bin/hello_world +10 -0
- data/examples/hello_world/lib/hello_world.rb +201 -0
- data/examples/mruby-examples/README.md +10 -0
- data/examples/mruby-examples/include/cura_examples.h +6 -0
- data/examples/mruby-examples/mrbgem.rake +14 -0
- data/examples/mruby-examples/src/gem_init.c +34 -0
- data/examples/mruby-examples/tools/hello_world/hello_world.c +6 -0
- data/examples/todo_list/app.log +9 -0
- data/examples/todo_list/bin/todo_list +26 -0
- data/examples/todo_list/data.db +0 -0
- data/examples/todo_list/debug.log +0 -0
- data/examples/todo_list/lib/todo_list.rb +28 -0
- data/examples/todo_list/lib/todo_list/application.rb +54 -0
- data/examples/todo_list/lib/todo_list/component/header.rb +27 -0
- data/examples/todo_list/lib/todo_list/component/list.rb +50 -0
- data/examples/todo_list/lib/todo_list/component/list_item.rb +28 -0
- data/examples/todo_list/lib/todo_list/component/list_items.rb +97 -0
- data/examples/todo_list/lib/todo_list/component/lists.rb +89 -0
- data/examples/todo_list/lib/todo_list/database.rb +50 -0
- data/examples/todo_list/lib/todo_list/model/list.rb +9 -0
- data/examples/todo_list/lib/todo_list/model/list_item.rb +9 -0
- data/examples/todo_list/profile.html +11354 -0
- data/lib/cura.rb +13 -0
- data/lib/cura/adapter.rb +67 -0
- data/lib/cura/application.rb +245 -0
- data/lib/cura/attributes/has_ancestry.rb +40 -0
- data/lib/cura/attributes/has_application.rb +31 -0
- data/lib/cura/attributes/has_attributes.rb +89 -0
- data/lib/cura/attributes/has_children.rb +113 -0
- data/lib/cura/attributes/has_colors.rb +66 -0
- data/lib/cura/attributes/has_coordinates.rb +49 -0
- data/lib/cura/attributes/has_dimensions.rb +63 -0
- data/lib/cura/attributes/has_events.rb +89 -0
- data/lib/cura/attributes/has_focusability.rb +37 -0
- data/lib/cura/attributes/has_initialize.rb +15 -0
- data/lib/cura/attributes/has_offsets.rb +82 -0
- data/lib/cura/attributes/has_orientation.rb +53 -0
- data/lib/cura/attributes/has_relative_coordinates.rb +39 -0
- data/lib/cura/attributes/has_root.rb +104 -0
- data/lib/cura/attributes/has_side_attributes.rb +95 -0
- data/lib/cura/attributes/has_windows.rb +70 -0
- data/lib/cura/borders.rb +16 -0
- data/lib/cura/color.rb +330 -0
- data/lib/cura/component/base.rb +180 -0
- data/lib/cura/component/button.rb +57 -0
- data/lib/cura/component/group.rb +77 -0
- data/lib/cura/component/label.rb +224 -0
- data/lib/cura/component/listbox.rb +152 -0
- data/lib/cura/component/pack.rb +144 -0
- data/lib/cura/component/scrollbar.rb +184 -0
- data/lib/cura/component/textbox.rb +118 -0
- data/lib/cura/cursor.rb +77 -0
- data/lib/cura/error/base.rb +10 -0
- data/lib/cura/error/invalid_adapter.rb +18 -0
- data/lib/cura/error/invalid_application.rb +18 -0
- data/lib/cura/error/invalid_color.rb +18 -0
- data/lib/cura/error/invalid_component.rb +18 -0
- data/lib/cura/error/invalid_middleware.rb +18 -0
- data/lib/cura/event.rb +38 -0
- data/lib/cura/event/base.rb +108 -0
- data/lib/cura/event/click.rb +14 -0
- data/lib/cura/event/dispatcher.rb +122 -0
- data/lib/cura/event/focus.rb +14 -0
- data/lib/cura/event/handler.rb +74 -0
- data/lib/cura/event/key_down.rb +68 -0
- data/lib/cura/event/middleware/aimer/base.rb +38 -0
- data/lib/cura/event/middleware/aimer/dispatcher_target.rb +24 -0
- data/lib/cura/event/middleware/aimer/mouse_focus.rb +48 -0
- data/lib/cura/event/middleware/aimer/target_option.rb +38 -0
- data/lib/cura/event/middleware/base.rb +21 -0
- data/lib/cura/event/middleware/dispatch.rb +20 -0
- data/lib/cura/event/middleware/translator/base.rb +37 -0
- data/lib/cura/event/middleware/translator/mouse_click.rb +44 -0
- data/lib/cura/event/mouse.rb +34 -0
- data/lib/cura/event/mouse_button.rb +103 -0
- data/lib/cura/event/mouse_wheel_down.rb +14 -0
- data/lib/cura/event/mouse_wheel_up.rb +14 -0
- data/lib/cura/event/resize.rb +17 -0
- data/lib/cura/event/selected.rb +14 -0
- data/lib/cura/event/unfocus.rb +14 -0
- data/lib/cura/focus_controller.rb +89 -0
- data/lib/cura/key.rb +313 -0
- data/lib/cura/margins.rb +16 -0
- data/lib/cura/offsets.rb +91 -0
- data/lib/cura/padding.rb +16 -0
- data/lib/cura/pencil.rb +29 -0
- data/lib/cura/version.rb +6 -0
- data/lib/cura/window.rb +85 -0
- data/spec/cura/attributes/has_ancestry_spec.rb +108 -0
- data/spec/cura/attributes/has_application_spec.rb +59 -0
- data/spec/cura/attributes/has_attributes_spec.rb +75 -0
- data/spec/cura/attributes/has_children_spec.rb +169 -0
- data/spec/cura/attributes/has_colors_spec.rb +20 -0
- data/spec/cura/attributes/has_coordinates_spec.rb +19 -0
- data/spec/cura/attributes/has_dimensions_spec.rb +19 -0
- data/spec/cura/attributes/has_events_spec.rb +18 -0
- data/spec/cura/attributes/has_focusability_spec.rb +58 -0
- data/spec/cura/attributes/has_offsets_spec.rb +18 -0
- data/spec/cura/attributes/has_orientation_spec.rb +102 -0
- data/spec/cura/attributes/has_relative_coordinates_spec.rb +18 -0
- data/spec/cura/attributes/has_side_attributes_spec.rb +19 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/support/shared_examples_for_attributes.rb +122 -0
- metadata +211 -0
data/lib/cura.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
if Kernel.respond_to?(:require)
|
2
|
+
require "cura/version"
|
3
|
+
require "cura/adapter"
|
4
|
+
require "cura/application"
|
5
|
+
require "cura/window"
|
6
|
+
require "cura/component/group"
|
7
|
+
require "cura/component/pack"
|
8
|
+
require "cura/component/label"
|
9
|
+
require "cura/component/button"
|
10
|
+
require "cura/component/listbox"
|
11
|
+
# require 'cura/component/scrollbar'
|
12
|
+
require "cura/component/textbox"
|
13
|
+
end
|
data/lib/cura/adapter.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
if Kernel.respond_to?(:require)
|
2
|
+
require "cura/attributes/has_initialize"
|
3
|
+
require "cura/attributes/has_attributes"
|
4
|
+
end
|
5
|
+
|
6
|
+
module Cura
|
7
|
+
|
8
|
+
# The base class for adapters.
|
9
|
+
class Adapter
|
10
|
+
|
11
|
+
class << self
|
12
|
+
|
13
|
+
# The list of all Adapter subclasses.
|
14
|
+
#
|
15
|
+
# @return [Array]
|
16
|
+
def all
|
17
|
+
@all ||= []
|
18
|
+
end
|
19
|
+
|
20
|
+
def inherited(subclass)
|
21
|
+
all << subclass
|
22
|
+
end
|
23
|
+
|
24
|
+
def mixins
|
25
|
+
@mixins ||= {}
|
26
|
+
end
|
27
|
+
|
28
|
+
def mixin(value)
|
29
|
+
mixins.merge!(value.to_h)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
include Attributes::HasInitialize
|
35
|
+
include Attributes::HasAttributes
|
36
|
+
|
37
|
+
def initialize(attributes={})
|
38
|
+
@setup = false
|
39
|
+
|
40
|
+
super
|
41
|
+
end
|
42
|
+
|
43
|
+
def setup
|
44
|
+
@setup = true
|
45
|
+
|
46
|
+
self.class.mixins.each { |type, mod| type.send(:include, mod) }
|
47
|
+
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
def setup?
|
52
|
+
@setup
|
53
|
+
end
|
54
|
+
|
55
|
+
def clear
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
def cleanup
|
60
|
+
@setup = false
|
61
|
+
|
62
|
+
self
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,245 @@
|
|
1
|
+
if Kernel.respond_to?(:require)
|
2
|
+
require "cura/attributes/has_attributes"
|
3
|
+
require "cura/attributes/has_windows"
|
4
|
+
require "cura/attributes/has_events"
|
5
|
+
require "cura/attributes/has_initialize"
|
6
|
+
|
7
|
+
require "cura/component/base"
|
8
|
+
|
9
|
+
require "cura/event/dispatcher"
|
10
|
+
|
11
|
+
require "cura/event/click"
|
12
|
+
require "cura/event/focus"
|
13
|
+
require "cura/event/unfocus"
|
14
|
+
require "cura/event/handler"
|
15
|
+
require "cura/event/key_down"
|
16
|
+
require "cura/event/mouse_button"
|
17
|
+
require "cura/event/mouse_wheel_down"
|
18
|
+
require "cura/event/mouse_wheel_up"
|
19
|
+
require "cura/event/resize"
|
20
|
+
require "cura/event/selected"
|
21
|
+
|
22
|
+
require "cura/event/middleware/dispatch"
|
23
|
+
require "cura/event/middleware/aimer/mouse_focus"
|
24
|
+
require "cura/event/middleware/aimer/target_option"
|
25
|
+
require "cura/event/middleware/aimer/dispatcher_target"
|
26
|
+
require "cura/event/middleware/translator/mouse_click"
|
27
|
+
|
28
|
+
require "cura/error/invalid_adapter"
|
29
|
+
|
30
|
+
require "cura/cursor"
|
31
|
+
require "cura/pencil"
|
32
|
+
end
|
33
|
+
|
34
|
+
module Cura
|
35
|
+
|
36
|
+
# An application.
|
37
|
+
class Application
|
38
|
+
|
39
|
+
class << self
|
40
|
+
|
41
|
+
def run(attributes={})
|
42
|
+
new(attributes).run
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
include Attributes::HasInitialize
|
48
|
+
include Attributes::HasAttributes
|
49
|
+
include Attributes::HasWindows
|
50
|
+
include Attributes::HasEvents
|
51
|
+
|
52
|
+
def initialize(attributes={})
|
53
|
+
super
|
54
|
+
|
55
|
+
@running = false
|
56
|
+
@cursor = Cursor.new(application: self)
|
57
|
+
@pencil = Pencil.new
|
58
|
+
|
59
|
+
setup_adapter
|
60
|
+
setup_dispatcher
|
61
|
+
end
|
62
|
+
|
63
|
+
# @method adapter
|
64
|
+
# Get the adapter used for running this application.
|
65
|
+
#
|
66
|
+
# @return [Adapter]
|
67
|
+
|
68
|
+
# @method adapter=(adapter)
|
69
|
+
# Set the adapter used for running this application.
|
70
|
+
# This cannot be set after #run is used.
|
71
|
+
#
|
72
|
+
# @param [Adapter] value The new adapter.
|
73
|
+
# @return [Adapter]
|
74
|
+
|
75
|
+
attribute(:adapter) { |adapter| validate_adapter(adapter) }
|
76
|
+
|
77
|
+
# Get the text cursor.
|
78
|
+
#
|
79
|
+
# @return [Cursor]
|
80
|
+
attr_reader :cursor
|
81
|
+
|
82
|
+
# Get the pencil used for drawing.
|
83
|
+
#
|
84
|
+
# @return [Pencil]
|
85
|
+
attr_reader :pencil
|
86
|
+
|
87
|
+
# Get the event dispatcher.
|
88
|
+
#
|
89
|
+
# @return [Event::Dispatcher]
|
90
|
+
attr_reader :dispatcher
|
91
|
+
|
92
|
+
# Run this application.
|
93
|
+
#
|
94
|
+
# @return [Application] This application.
|
95
|
+
def run
|
96
|
+
run_event_loop
|
97
|
+
|
98
|
+
self
|
99
|
+
ensure
|
100
|
+
@adapter.cleanup
|
101
|
+
end
|
102
|
+
|
103
|
+
# Stop the application after the current run cycle.
|
104
|
+
#
|
105
|
+
# @return [Application] This application.
|
106
|
+
def stop
|
107
|
+
@running = false
|
108
|
+
|
109
|
+
self
|
110
|
+
end
|
111
|
+
|
112
|
+
# Stop the application immediently.
|
113
|
+
#
|
114
|
+
# @return [Application] This application.
|
115
|
+
def stop!
|
116
|
+
stop
|
117
|
+
@adapter.cleanup
|
118
|
+
|
119
|
+
self
|
120
|
+
end
|
121
|
+
|
122
|
+
# Check if this application is running.
|
123
|
+
#
|
124
|
+
# @return [Boolean]
|
125
|
+
def running?
|
126
|
+
@running
|
127
|
+
end
|
128
|
+
|
129
|
+
# Get the currently focused component.
|
130
|
+
#
|
131
|
+
# @return [Component::Base]
|
132
|
+
def focused
|
133
|
+
@dispatcher.target
|
134
|
+
end
|
135
|
+
|
136
|
+
# Set focus to a component.
|
137
|
+
#
|
138
|
+
# There can only be one component focused at a time within an application, if any.
|
139
|
+
# All dispatched events are sent to the currently focused component, or the application if no component is focused.
|
140
|
+
#
|
141
|
+
# @param [nil, Component::Base] component
|
142
|
+
# @return [Component::Base]
|
143
|
+
def focus(component)
|
144
|
+
raise TypeError, "component must be nil or be a Cura::Component::Base" unless component.nil? || component.is_a?(Cura::Component::Base)
|
145
|
+
|
146
|
+
dispatch_event(:unfocus)
|
147
|
+
@dispatcher.target = component
|
148
|
+
dispatch_event(:focus)
|
149
|
+
|
150
|
+
component
|
151
|
+
end
|
152
|
+
|
153
|
+
# Dispatch an event.
|
154
|
+
#
|
155
|
+
# @param [#to_sym] event The name of the event class to create an instance of or an event instance.
|
156
|
+
# @param [#to_hash, #to_h] options
|
157
|
+
# @option options [#to_i] :target The optional target of the event.
|
158
|
+
# @return [Event::Base] The dispatched event.
|
159
|
+
def dispatch_event(event, options={})
|
160
|
+
@dispatcher.dispatch_event(event, options)
|
161
|
+
end
|
162
|
+
|
163
|
+
# Add a window to this application.
|
164
|
+
#
|
165
|
+
# @param [Window] window
|
166
|
+
# @return [Window]
|
167
|
+
def add_window(window)
|
168
|
+
super
|
169
|
+
|
170
|
+
window.application = self
|
171
|
+
|
172
|
+
window
|
173
|
+
end
|
174
|
+
|
175
|
+
# Update all windows.
|
176
|
+
#
|
177
|
+
# @return [Application]
|
178
|
+
def update
|
179
|
+
update_windows
|
180
|
+
cursor.update
|
181
|
+
|
182
|
+
self
|
183
|
+
end
|
184
|
+
|
185
|
+
# Draw all windows.
|
186
|
+
#
|
187
|
+
# @return [Application]
|
188
|
+
def draw
|
189
|
+
draw_windows
|
190
|
+
|
191
|
+
self
|
192
|
+
end
|
193
|
+
|
194
|
+
# Instance inspection.
|
195
|
+
#
|
196
|
+
# @return [String]
|
197
|
+
def inspect
|
198
|
+
"#<#{self.class}>"
|
199
|
+
end
|
200
|
+
|
201
|
+
protected
|
202
|
+
|
203
|
+
def setup_adapter
|
204
|
+
if @adapter.nil?
|
205
|
+
adapter_class ||= Adapter.all.first
|
206
|
+
raise Error::InvalidAdapter if adapter_class.nil?
|
207
|
+
|
208
|
+
@adapter = adapter_class.new
|
209
|
+
end
|
210
|
+
|
211
|
+
# TODO: If a class is given, run .new on it first
|
212
|
+
|
213
|
+
@adapter.setup
|
214
|
+
end
|
215
|
+
|
216
|
+
def setup_dispatcher
|
217
|
+
@dispatcher = Event::Dispatcher.new(application: self)
|
218
|
+
|
219
|
+
@dispatcher.middleware << Event::Middleware::Aimer::MouseFocus.new
|
220
|
+
@dispatcher.middleware << Event::Middleware::Aimer::TargetOption.new
|
221
|
+
@dispatcher.middleware << Event::Middleware::Aimer::DispatcherTarget.new
|
222
|
+
@dispatcher.middleware << Event::Middleware::Dispatch.new
|
223
|
+
@dispatcher.middleware << Event::Middleware::Translator::MouseClick.new
|
224
|
+
end
|
225
|
+
|
226
|
+
def validate_adapter(adapter)
|
227
|
+
# TODO: Raise error if ever set more than once
|
228
|
+
raise Error::InvalidAdapter unless adapter.is_a?(Cura::Adapter)
|
229
|
+
|
230
|
+
adapter
|
231
|
+
end
|
232
|
+
|
233
|
+
def run_event_loop
|
234
|
+
@running = true
|
235
|
+
|
236
|
+
while @running
|
237
|
+
update
|
238
|
+
draw
|
239
|
+
dispatcher.run
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
end
|
244
|
+
|
245
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Cura
|
2
|
+
module Attributes
|
3
|
+
|
4
|
+
# Allows an object to have a `parent` and `ancestors`.
|
5
|
+
module HasAncestry
|
6
|
+
|
7
|
+
def initialize(attributes={})
|
8
|
+
@ancestors = []
|
9
|
+
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
# Get/set the parent of this object.
|
14
|
+
# It's not recommended to set this directly as it may break the ancestory chain.
|
15
|
+
#
|
16
|
+
# @return [Object]
|
17
|
+
attr_accessor :parent
|
18
|
+
|
19
|
+
# Determine if this object has a parent.
|
20
|
+
#
|
21
|
+
# @return [Boolean]
|
22
|
+
def parent?
|
23
|
+
!@parent.nil?
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get the ancestors of this object.
|
27
|
+
#
|
28
|
+
# @return [Array<Object>]
|
29
|
+
def ancestors
|
30
|
+
if @parent.nil?
|
31
|
+
[]
|
32
|
+
else
|
33
|
+
@parent.respond_to?(:ancestors) ? [@parent] + @parent.ancestors : [@parent]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
if Kernel.respond_to?(:require)
|
2
|
+
require "cura/application"
|
3
|
+
|
4
|
+
require "cura/error/invalid_application"
|
5
|
+
end
|
6
|
+
|
7
|
+
module Cura
|
8
|
+
module Attributes
|
9
|
+
|
10
|
+
# Allows an object to belong to a Cura::Application.
|
11
|
+
module HasApplication
|
12
|
+
|
13
|
+
# Get the application of this object.
|
14
|
+
#
|
15
|
+
# @return [Application]
|
16
|
+
attr_reader :application
|
17
|
+
|
18
|
+
# Set the application of this object.
|
19
|
+
#
|
20
|
+
# @param [Application] value
|
21
|
+
# @return [Application]
|
22
|
+
def application=(value)
|
23
|
+
raise Error::InvalidApplication unless value.nil? || value.is_a?(Cura::Application)
|
24
|
+
|
25
|
+
@application = value
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Cura
|
2
|
+
module Attributes
|
3
|
+
|
4
|
+
# Adds the `update_attributes` method.
|
5
|
+
module HasAttributes # TODO: Aspect::HasAttributes
|
6
|
+
|
7
|
+
# The class methods to be mixed in when included.
|
8
|
+
module ClassMethods
|
9
|
+
|
10
|
+
def attribute(name, options={}, &block)
|
11
|
+
options = options.to_h
|
12
|
+
|
13
|
+
if options[:query]
|
14
|
+
define_method("#{name}?") { instance_variable_get("@#{name}") }
|
15
|
+
else
|
16
|
+
attr_reader(name)
|
17
|
+
end
|
18
|
+
|
19
|
+
if options[:query]
|
20
|
+
define_method("#{name}=") do |value|
|
21
|
+
value = instance_exec(value, options, &block) unless block.nil?
|
22
|
+
|
23
|
+
instance_variable_set("@#{name}", !!value)
|
24
|
+
end
|
25
|
+
else
|
26
|
+
define_method("#{name}=") do |value|
|
27
|
+
value = instance_exec(value, options, &block) unless block.nil?
|
28
|
+
|
29
|
+
instance_variable_set("@#{name}", value)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
class << self
|
37
|
+
|
38
|
+
def included(base)
|
39
|
+
base.extend(ClassMethods)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
# Initialize this object by optionally updating attributes with a Hash.
|
45
|
+
#
|
46
|
+
# @param [#to_h] attributes Attributes to set after initializing.
|
47
|
+
def initialize(attributes={})
|
48
|
+
update_attributes(attributes)
|
49
|
+
|
50
|
+
super
|
51
|
+
end
|
52
|
+
|
53
|
+
# Update any attributes on this object.
|
54
|
+
#
|
55
|
+
# @param [#to_h] attributes
|
56
|
+
# @return [Hash] The attributes.
|
57
|
+
def update_attributes(attributes={})
|
58
|
+
attributes = convert_attributes(attributes)
|
59
|
+
|
60
|
+
attributes.each { |name, value| send("#{name}=", value) }
|
61
|
+
end
|
62
|
+
|
63
|
+
protected
|
64
|
+
|
65
|
+
VALID_SIZE_SYMBOLS = [:auto, :inherit]
|
66
|
+
|
67
|
+
def validate_size_attribute(value)
|
68
|
+
if value.is_a?(Symbol)
|
69
|
+
raise ArgumentError, "must be one of #{VALID_SIZE_SYMBOLS.join(', ')}" unless VALID_SIZE_SYMBOLS.include?(value)
|
70
|
+
else
|
71
|
+
value = value.to_i
|
72
|
+
value = 0 if value < 0
|
73
|
+
end
|
74
|
+
|
75
|
+
value
|
76
|
+
end
|
77
|
+
|
78
|
+
# Convert the attributes to a Hash and any other conversions that may need to happen.
|
79
|
+
#
|
80
|
+
# @param [#to_h] attributes
|
81
|
+
# @return [Hash] The attributes.
|
82
|
+
def convert_attributes(attributes={})
|
83
|
+
attributes.to_h
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|