wxruby3-shapes 0.9.0.pre.beta.3 → 0.9.6

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.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/INSTALL.md +5 -7
  3. data/README.md +38 -6
  4. data/assets/logo.svg +339 -0
  5. data/assets/logo.xpm +60 -0
  6. data/assets/screenshot.png +0 -0
  7. data/assets/social.png +0 -0
  8. data/bin/wx-shapes +1 -1
  9. data/lib/wx/shapes/arrow_base.rb +4 -11
  10. data/lib/wx/shapes/arrows/circle_arrow.rb +22 -11
  11. data/lib/wx/shapes/arrows/circle_prong_arrow.rb +48 -0
  12. data/lib/wx/shapes/arrows/cross_bar_arrow.rb +57 -0
  13. data/lib/wx/shapes/arrows/cross_bar_circle_arrow.rb +56 -0
  14. data/lib/wx/shapes/arrows/cross_bar_prong_arrow.rb +49 -0
  15. data/lib/wx/shapes/arrows/crossed_circle.rb +46 -0
  16. data/lib/wx/shapes/arrows/cup_arrow.rb +65 -0
  17. data/lib/wx/shapes/arrows/diamond_arrow.rb +8 -13
  18. data/lib/wx/shapes/arrows/double_cross_bar_arrow.rb +27 -0
  19. data/lib/wx/shapes/arrows/filled_arrow.rb +60 -0
  20. data/lib/wx/shapes/arrows/line_arrow.rb +67 -0
  21. data/lib/wx/shapes/arrows/open_arrow.rb +22 -23
  22. data/lib/wx/shapes/arrows/prong_arrow.rb +42 -0
  23. data/lib/wx/shapes/arrows/solid_arrow.rb +21 -35
  24. data/lib/wx/shapes/arrows/square_arrow.rb +37 -0
  25. data/lib/wx/shapes/auto_layout.rb +2 -2
  26. data/lib/wx/shapes/base.rb +1 -1
  27. data/lib/wx/shapes/canvas_history.rb +20 -0
  28. data/lib/wx/shapes/connection_point.rb +10 -6
  29. data/lib/wx/shapes/diagram.rb +98 -78
  30. data/lib/wx/shapes/events.rb +8 -8
  31. data/lib/wx/shapes/printout.rb +3 -16
  32. data/lib/wx/shapes/serializable.rb +2 -436
  33. data/lib/wx/shapes/serialize/wx.rb +30 -18
  34. data/lib/wx/shapes/shape.rb +211 -168
  35. data/lib/wx/shapes/shape_canvas.rb +728 -267
  36. data/lib/wx/shapes/shape_data_object.rb +99 -18
  37. data/lib/wx/shapes/shape_handle.rb +18 -11
  38. data/lib/wx/shapes/shape_list.rb +34 -67
  39. data/lib/wx/shapes/shapes/bitmap_shape.rb +23 -24
  40. data/lib/wx/shapes/shapes/box_shape.rb +389 -0
  41. data/lib/wx/shapes/shapes/circle_shape.rb +19 -22
  42. data/lib/wx/shapes/shapes/control_shape.rb +77 -41
  43. data/lib/wx/shapes/shapes/curve_shape.rb +38 -31
  44. data/lib/wx/shapes/shapes/diamond_shape.rb +7 -17
  45. data/lib/wx/shapes/shapes/edit_text_shape.rb +6 -9
  46. data/lib/wx/shapes/shapes/ellipse_shape.rb +12 -15
  47. data/lib/wx/shapes/shapes/flex_grid_shape.rb +58 -33
  48. data/lib/wx/shapes/shapes/grid_shape.rb +259 -161
  49. data/lib/wx/shapes/shapes/line_shape.rb +155 -161
  50. data/lib/wx/shapes/shapes/manager_shape.rb +77 -0
  51. data/lib/wx/shapes/shapes/multi_sel_rect.rb +8 -8
  52. data/lib/wx/shapes/shapes/ortho_shape.rb +31 -36
  53. data/lib/wx/shapes/shapes/polygon_shape.rb +23 -29
  54. data/lib/wx/shapes/shapes/rect_shape.rb +95 -53
  55. data/lib/wx/shapes/shapes/round_ortho_shape.rb +6 -8
  56. data/lib/wx/shapes/shapes/round_rect_shape.rb +20 -24
  57. data/lib/wx/shapes/shapes/square_shape.rb +14 -17
  58. data/lib/wx/shapes/shapes/text_shape.rb +95 -53
  59. data/lib/wx/shapes/version.rb +1 -1
  60. data/lib/wx/shapes/wx.rb +16 -7
  61. data/lib/wx/wx-shapes/cmd/test.rb +1 -1
  62. data/samples/demo/arrows.json +1 -0
  63. data/samples/demo/arrows.yaml +793 -0
  64. data/samples/demo/art/HBox.xpm +22 -0
  65. data/samples/demo/art/VBox.xpm +22 -0
  66. data/samples/demo/art/logo.xpm +60 -0
  67. data/samples/demo/class.json +1 -0
  68. data/samples/demo/class.yaml +5631 -0
  69. data/samples/demo/demo.rb +301 -91
  70. data/samples/demo/dialogs.rb +1405 -0
  71. data/samples/demo/erd.json +1 -0
  72. data/samples/demo/erd.yaml +4072 -0
  73. data/samples/demo/frame_canvas.rb +409 -33
  74. data/samples/sample1/art/logo.xpm +60 -0
  75. data/samples/sample1/sample.rb +11 -11
  76. data/samples/sample2/art/logo.xpm +60 -0
  77. data/samples/sample2/sample.rb +2 -2
  78. data/samples/sample2/sample_shape.rb +15 -15
  79. data/samples/sample3/art/logo.xpm +60 -0
  80. data/samples/sample3/sample.rb +3 -3
  81. data/samples/sample4/art/logo.xpm +60 -0
  82. data/samples/sample4/sample.rb +2 -2
  83. data/tests/lib/wxapp_runner.rb +4 -0
  84. data/tests/serializer_tests.rb +8 -441
  85. data/tests/test_grid_shapes.rb +2 -2
  86. data/tests/test_serialize_xml.rb +17 -0
  87. data/tests/test_serialize_yaml.rb +2 -2
  88. metadata +78 -28
  89. data/lib/wx/shapes/serialize/core.rb +0 -40
  90. data/lib/wx/shapes/serialize/id.rb +0 -82
  91. data/lib/wx/shapes/serializer/json.rb +0 -258
  92. data/lib/wx/shapes/serializer/yaml.rb +0 -125
  93. data/samples/demo/art/sample.xpm +0 -251
  94. data/samples/sample1/art/sample.xpm +0 -251
  95. data/samples/sample2/art/sample.xpm +0 -251
  96. data/samples/sample3/art/sample.xpm +0 -251
  97. data/samples/sample4/art/sample.xpm +0 -251
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wxruby3-shapes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0.pre.beta.3
4
+ version: 0.9.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Corino
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-24 00:00:00.000000000 Z
11
+ date: 2024-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: nokogiri
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.12'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.12'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: rake
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -66,20 +52,62 @@ dependencies:
66
52
  - - "~>"
67
53
  - !ruby/object:Gem::Version
68
54
  version: '3.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: nokogiri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.12'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.12'
69
+ - !ruby/object:Gem::Dependency
70
+ name: firm
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: wxruby3
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: 0.9.0.pre.beta.14
89
+ version: '1.3'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: wxruby3-mdap
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.0'
76
104
  type: :runtime
77
105
  prerelease: false
78
106
  version_requirements: !ruby/object:Gem::Requirement
79
107
  requirements:
80
108
  - - "~>"
81
109
  - !ruby/object:Gem::Version
82
- version: 0.9.0.pre.beta.14
110
+ version: '1.0'
83
111
  description: wxRuby3/Shapes is a pure Ruby library providing 2D shapes and diagramming
84
112
  framework based on wxRuby3
85
113
  email: mcorino@m2c-software.nl
@@ -93,14 +121,28 @@ files:
93
121
  - INSTALL.md
94
122
  - LICENSE
95
123
  - README.md
124
+ - assets/logo.svg
125
+ - assets/logo.xpm
96
126
  - assets/screenshot.png
127
+ - assets/social.png
97
128
  - bin/wx-shapes
98
129
  - lib/wx/shapes.rb
99
130
  - lib/wx/shapes/arrow_base.rb
100
131
  - lib/wx/shapes/arrows/circle_arrow.rb
132
+ - lib/wx/shapes/arrows/circle_prong_arrow.rb
133
+ - lib/wx/shapes/arrows/cross_bar_arrow.rb
134
+ - lib/wx/shapes/arrows/cross_bar_circle_arrow.rb
135
+ - lib/wx/shapes/arrows/cross_bar_prong_arrow.rb
136
+ - lib/wx/shapes/arrows/crossed_circle.rb
137
+ - lib/wx/shapes/arrows/cup_arrow.rb
101
138
  - lib/wx/shapes/arrows/diamond_arrow.rb
139
+ - lib/wx/shapes/arrows/double_cross_bar_arrow.rb
140
+ - lib/wx/shapes/arrows/filled_arrow.rb
141
+ - lib/wx/shapes/arrows/line_arrow.rb
102
142
  - lib/wx/shapes/arrows/open_arrow.rb
143
+ - lib/wx/shapes/arrows/prong_arrow.rb
103
144
  - lib/wx/shapes/arrows/solid_arrow.rb
145
+ - lib/wx/shapes/arrows/square_arrow.rb
104
146
  - lib/wx/shapes/art/shape_canvas/page.xpm
105
147
  - lib/wx/shapes/auto_layout.rb
106
148
  - lib/wx/shapes/base.rb
@@ -111,17 +153,14 @@ files:
111
153
  - lib/wx/shapes/events.rb
112
154
  - lib/wx/shapes/printout.rb
113
155
  - lib/wx/shapes/serializable.rb
114
- - lib/wx/shapes/serialize/core.rb
115
- - lib/wx/shapes/serialize/id.rb
116
156
  - lib/wx/shapes/serialize/wx.rb
117
- - lib/wx/shapes/serializer/json.rb
118
- - lib/wx/shapes/serializer/yaml.rb
119
157
  - lib/wx/shapes/shape.rb
120
158
  - lib/wx/shapes/shape_canvas.rb
121
159
  - lib/wx/shapes/shape_data_object.rb
122
160
  - lib/wx/shapes/shape_handle.rb
123
161
  - lib/wx/shapes/shape_list.rb
124
162
  - lib/wx/shapes/shapes/bitmap_shape.rb
163
+ - lib/wx/shapes/shapes/box_shape.rb
125
164
  - lib/wx/shapes/shapes/circle_shape.rb
126
165
  - lib/wx/shapes/shapes/control_shape.rb
127
166
  - lib/wx/shapes/shapes/curve_shape.rb
@@ -131,6 +170,7 @@ files:
131
170
  - lib/wx/shapes/shapes/flex_grid_shape.rb
132
171
  - lib/wx/shapes/shapes/grid_shape.rb
133
172
  - lib/wx/shapes/shapes/line_shape.rb
173
+ - lib/wx/shapes/shapes/manager_shape.rb
134
174
  - lib/wx/shapes/shapes/multi_sel_rect.rb
135
175
  - lib/wx/shapes/shapes/ortho_shape.rb
136
176
  - lib/wx/shapes/shapes/polygon_shape.rb
@@ -151,6 +191,8 @@ files:
151
191
  - rakelib/yard/yard-relative_markdown_links.rb
152
192
  - rakelib/yard/yard/relative_markdown_links.rb
153
193
  - rakelib/yard/yard/relative_markdown_links/version.rb
194
+ - samples/demo/arrows.json
195
+ - samples/demo/arrows.yaml
154
196
  - samples/demo/art/AlignBottom.xpm
155
197
  - samples/demo/art/AlignCenter.xpm
156
198
  - samples/demo/art/AlignLeft.xpm
@@ -167,6 +209,7 @@ files:
167
209
  - samples/demo/art/FlexGrid.xpm
168
210
  - samples/demo/art/GC.xpm
169
211
  - samples/demo/art/Grid.xpm
212
+ - samples/demo/art/HBox.xpm
170
213
  - samples/demo/art/Line.xpm
171
214
  - samples/demo/art/NoSource.xpm
172
215
  - samples/demo/art/OrthoLine.xpm
@@ -177,26 +220,33 @@ files:
177
220
  - samples/demo/art/StandAloneLine.xpm
178
221
  - samples/demo/art/Text.xpm
179
222
  - samples/demo/art/Tool.xpm
180
- - samples/demo/art/sample.xpm
223
+ - samples/demo/art/VBox.xpm
224
+ - samples/demo/art/logo.xpm
225
+ - samples/demo/class.json
226
+ - samples/demo/class.yaml
181
227
  - samples/demo/demo.rb
228
+ - samples/demo/dialogs.rb
229
+ - samples/demo/erd.json
230
+ - samples/demo/erd.yaml
182
231
  - samples/demo/frame_canvas.rb
183
232
  - samples/demo/images/motyl.bmp
184
233
  - samples/demo/images/motyl2.bmp
185
- - samples/sample1/art/sample.xpm
234
+ - samples/sample1/art/logo.xpm
186
235
  - samples/sample1/sample.rb
187
- - samples/sample2/art/sample.xpm
236
+ - samples/sample2/art/logo.xpm
188
237
  - samples/sample2/sample.rb
189
238
  - samples/sample2/sample_canvas.rb
190
239
  - samples/sample2/sample_shape.rb
191
- - samples/sample3/art/sample.xpm
240
+ - samples/sample3/art/logo.xpm
192
241
  - samples/sample3/sample.rb
193
- - samples/sample4/art/sample.xpm
242
+ - samples/sample4/art/logo.xpm
194
243
  - samples/sample4/sample.rb
195
244
  - tests/art/motyl.bmp
196
245
  - tests/lib/wxapp_runner.rb
197
246
  - tests/serializer_tests.rb
198
247
  - tests/test_grid_shapes.rb
199
248
  - tests/test_serialize.rb
249
+ - tests/test_serialize_xml.rb
200
250
  - tests/test_serialize_yaml.rb
201
251
  homepage: https://github.com/mcorino/wxRuby3-shapes
202
252
  licenses:
@@ -235,7 +285,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
235
285
  - !ruby/object:Gem::Version
236
286
  version: '0'
237
287
  requirements: []
238
- rubygems_version: 3.4.10
288
+ rubygems_version: 3.3.5
239
289
  signing_key:
240
290
  specification_version: 4
241
291
  summary: wxRuby3 2D shapes and diagramming framework
@@ -1,40 +0,0 @@
1
- # Wx::SF::Serializer - Ruby core serializer extensions
2
- # Copyright (c) M.J.N. Corino, The Netherlands
3
-
4
- # we do not include Wx::SF::Serializer::SerializeMethod here as that would
5
- # also extend these classes with the engine specific extension that we do not
6
- # need or want here
7
-
8
- class Array
9
- def serialize(io = nil, pretty: false, format: Wx::SF::Serializable.default_format)
10
- Wx::SF::Serializable[format].dump(self, io, pretty: pretty)
11
- end
12
- end
13
-
14
- class Hash
15
- def serialize(io = nil, pretty: false, format: Wx::SF::Serializable.default_format)
16
- Wx::SF::Serializable[format].dump(self, io, pretty: pretty)
17
- end
18
- end
19
-
20
- class Struct
21
- def serialize(io = nil, pretty: false, format: Wx::SF::Serializable.default_format)
22
- Wx::SF::Serializable[format].dump(self, io, pretty: pretty)
23
- end
24
- end
25
-
26
- require 'set'
27
-
28
- class Set
29
- def serialize(io = nil, pretty: false, format: Wx::SF::Serializable.default_format)
30
- Wx::SF::Serializable[format].dump(self, io, pretty: pretty)
31
- end
32
- end
33
-
34
- require 'ostruct'
35
-
36
- class OpenStruct
37
- def serialize(io = nil, pretty: false, format: Wx::SF::Serializable.default_format)
38
- Wx::SF::Serializable[format].dump(self, io, pretty: pretty)
39
- end
40
- end
@@ -1,82 +0,0 @@
1
- # Wx::SF::Serializer - Wx::SF serializable ID class
2
- # Copyright (c) M.J.N. Corino, The Netherlands
3
-
4
- module Wx::SF::Serializable
5
-
6
- class ID
7
-
8
- include Wx::SF::Serializable
9
-
10
- class << self
11
-
12
- TLS_RESTORATION_MAP_KEY = :wx_sf_serializable_id_restoration_map.freeze
13
- private_constant :TLS_RESTORATION_MAP_KEY
14
-
15
- def init_restoration_map
16
- (::Thread.current[TLS_RESTORATION_MAP_KEY] ||= []) << {}
17
- end
18
-
19
- def clear_restoration_map
20
- ::Thread.current[TLS_RESTORATION_MAP_KEY].pop
21
- end
22
-
23
- def restoration_map
24
- ::Thread.current[TLS_RESTORATION_MAP_KEY].last
25
- end
26
-
27
- end
28
-
29
- # Returns a Serialized::Id instance matching the deserialized id number
30
- # either by retrieving an earlier restored Id from the (thread/fiber-)current
31
- # restoration map or creating (and mapping) a new Id instance.
32
- # @param [Hash] data deserialized properties hash
33
- # @return [ID] restored ID instance
34
- # @see SerializeClassMethods#create_for_deserialize
35
- def self.create_for_deserialize(data)
36
- serialized_id = data[:id] || 0
37
- restoration_map[serialized_id] ||= self.new
38
- end
39
-
40
- # Collects the ID's object_id for serialization.
41
- # Note that this is fixed and cannot be excluded.
42
- # @param [Hash] hash property serialization hash
43
- # @param [Set] _excludes ignored
44
- # @return [Hash] property serialization hash
45
- def for_serialize(hash, _excludes=nil)
46
- hash[:id] = self.object_id
47
- hash
48
- end
49
- protected :for_serialize
50
-
51
- # Noop for ID instances.
52
- # @param [Hash] _hash ignored
53
- # @return [self]
54
- def from_serialized(_hash)
55
- # no deserializing necessary
56
- self
57
- end
58
- protected :from_serialized
59
-
60
- # Always returns false for IDs.
61
- # @return [Boolean]
62
- def serialize_disabled?
63
- false
64
- end
65
-
66
- def to_s
67
- "Wx::SF::Serializable::ID<#{object_id}>"
68
- end
69
-
70
- def inspect
71
- to_s
72
- end
73
-
74
- def to_i
75
- object_id
76
- end
77
-
78
- end
79
-
80
- serializables << ID
81
-
82
- end
@@ -1,258 +0,0 @@
1
- # Wx::SF::Serializer - shape serializer module
2
- # Copyright (c) M.J.N. Corino, The Netherlands
3
-
4
- require 'json'
5
- require 'json/add/core'
6
- require 'json/add/set'
7
- require 'json/add/ostruct'
8
-
9
- module Wx::SF
10
-
11
- module Serializable
12
-
13
- module JSON
14
-
15
- # Derived Hash class to use for deserialized JSON object data which
16
- # supports using Symbol keys.
17
- class ObjectHash < ::Hash
18
- # Returns the object associated with given key.
19
- # @param [String,Symbol] key key value
20
- # @return [Object] associated object
21
- # @see ::Hash#[]
22
- def [](key)
23
- super(key.to_s)
24
- end
25
- # Returns true if the given key exists in self otherwise false.
26
- # @param [String,Symbol] key key value
27
- # @return [Boolean]
28
- # @see ::Hash#include?
29
- def include?(key)
30
- super(key.to_s)
31
- end
32
- alias member? include?
33
- alias has_key? include?
34
- alias key? include?
35
- end
36
-
37
- # Mixin module to patch hash objects during JSON serialization.
38
- # By default JSON will not consider hash keys for custom serialization
39
- # but assumes any key should be serialized as it's string representation.
40
- # This is restrictive but compatible with "pure" JSON object notation.
41
- # JSON however also does not (correctly?) honour overriding Hash#to_json to
42
- # customize serialization of Hash-es which seems too restrictive (stupid?)
43
- # as using more complex custom keys for Hash-es instead of String/Symbol-s
44
- # is not that uncommon.
45
- # This mixin is used to "patch" Hash **instances** through #extend.
46
- module HashInstancePatch
47
- def patch_nested_hashes(obj)
48
- case obj
49
- when ::Hash
50
- obj.extend(HashInstancePatch) unless obj.singleton_class.include?(HashInstancePatch)
51
- obj.each_pair { |k, v| patch_nested_hashes(k); patch_nested_hashes(v) }
52
- when ::Array
53
- obj.each { |e| patch_nested_hashes(e) }
54
- end
55
- obj
56
- end
57
- private :patch_nested_hashes
58
-
59
- # Returns JSON representation (String) of self.
60
- # Hash data which is part of object properties/members being serialized
61
- # (including any nested Hash-es) will be patched with HashInstancePatch.
62
- # Patched Hash instances will be serialized as JSON-creatable objects
63
- # (so provided with a JSON#create_id) with the hash contents represented
64
- # as an array of key/value pairs (arrays).
65
- # @param [Array<Object>] args any args passed by the JSON generator
66
- # @return [String] JSON representation
67
- def to_json(*args)
68
- if self.has_key?(::JSON.create_id)
69
- if self.has_key?('data')
70
- if (data = self['data']).is_a?(::Hash)
71
- data.each_value { |v| patch_nested_hashes(v) }
72
- end
73
- else # core class extensions use different data members for property serialization
74
- self.each_value { |v| patch_nested_hashes(v) }
75
- end
76
- super
77
- else
78
- {
79
- ::JSON.create_id => self.class.name,
80
- 'data' => patch_nested_hashes(to_a)
81
- }.to_json(*args)
82
- end
83
- end
84
- end
85
-
86
- # Mixin module to patch singleton_clas of the Hash class to make Hash-es
87
- # JSON creatable (#json_creatable? returns true).
88
- module HashClassPatch
89
- # Create a new Hash instance from deserialized JSON data.
90
- # @param [Hash] object deserialized JSON object
91
- # @return [Hash] restored Hash instance
92
- def json_create(object)
93
- object['data'].to_h
94
- end
95
- end
96
-
97
- class ::Hash
98
- include Wx::SF::Serializable::JSON::HashInstancePatch
99
- class << self
100
- include Wx::SF::Serializable::JSON::HashClassPatch
101
- end
102
- end
103
-
104
- class << self
105
- def serializables
106
- ::Set.new [::NilClass, ::TrueClass, ::FalseClass, ::Integer, ::Float, ::String, ::Array, ::Hash,
107
- ::Date, ::DateTime, ::Exception, ::Range, ::Regexp, ::Struct, ::Symbol, ::Time, ::Set, ::OpenStruct]
108
- end
109
-
110
- TLS_SAFE_DESERIALIZE_KEY = :wx_sf_json_safe_deserialize.freeze
111
- private_constant :TLS_SAFE_DESERIALIZE_KEY
112
-
113
- TLS_PARSE_STACK_KEY = :wx_sf_json_parse_stack.freeze
114
- private_constant :TLS_PARSE_STACK_KEY
115
-
116
- def safe_deserialize
117
- ::Thread.current[TLS_SAFE_DESERIALIZE_KEY] ||= []
118
- end
119
- private :safe_deserialize
120
-
121
- def start_safe_deserialize
122
- safe_deserialize.push(true)
123
- end
124
-
125
- def end_safe_deserialize
126
- safe_deserialize.pop
127
- end
128
-
129
- def parse_stack
130
- ::Thread.current[TLS_PARSE_STACK_KEY] ||= []
131
- end
132
- private :parse_stack
133
-
134
- def start_parse
135
- parse_stack.push(safe_deserialize.pop)
136
- end
137
-
138
- def end_parse
139
- unless (val = parse_stack.pop).nil?
140
- safe_deserialize.push(val)
141
- end
142
- end
143
-
144
- def safe_parsing?
145
- !!parse_stack.last
146
- end
147
- end
148
-
149
- def self.dump(obj, io=nil, pretty: false)
150
- obj.extend(HashInstancePatch) if obj.is_a?(::Hash)
151
- if pretty
152
- if io || io.respond_to?(:write)
153
- io.write(::JSON.pretty_generate(obj))
154
- io
155
- else
156
- ::JSON.pretty_generate(obj)
157
- end
158
- else
159
- ::JSON.dump(obj, io)
160
- end
161
- end
162
-
163
- def self.load(source)
164
- begin
165
- # initialize ID restoration map
166
- Serializable::ID.init_restoration_map
167
- # enable safe deserializing
168
- self.start_safe_deserialize
169
- ::JSON.parse!(source,
170
- **{create_additions: true,
171
- object_class: Serializable::JSON::ObjectHash})
172
- ensure
173
- # reset safe deserializing
174
- self.end_safe_deserialize
175
- # reset ID restoration map
176
- Serializable::ID.clear_restoration_map
177
- end
178
- end
179
-
180
- end
181
-
182
- # extend serialization class methods
183
- module SerializeClassMethods
184
-
185
- def json_create(object)
186
- create_for_deserialize(data = object['data'])
187
- .__send__(:from_serialized, data)
188
- end
189
-
190
- end
191
-
192
- # extend instance serialization methods
193
- module SerializeInstanceMethods
194
-
195
- def to_json(*args)
196
- {
197
- ::JSON.create_id => self.class.name,
198
- 'data' => for_serialize(Hash.new)
199
- }.to_json(*args)
200
- end
201
-
202
- end
203
-
204
- class ID
205
-
206
- def self.json_create(object)
207
- create_for_deserialize(data = object['data'])
208
- end
209
-
210
- def to_json(*args)
211
- {
212
- ::JSON.create_id => self.class.name,
213
- 'data' => for_serialize(Hash.new)
214
- }.to_json(*args)
215
- end
216
-
217
- end
218
-
219
- register(Serializable.default_format, JSON)
220
-
221
- end
222
-
223
- end
224
-
225
- module ::JSON
226
- class << self
227
-
228
- alias :pre_wxsf_parse! :parse!
229
- def parse!(*args, **kwargs)
230
- begin
231
- # setup parsing stack for safe or normal deserializing
232
- # the double bracketing provided from Wx::SF::Serializable::JSON#load and here
233
- # makes sure to support both nested Wx::SF deserializing as well as nested
234
- # hybrid deserializing (Wx::SF -> common JSON -> ...)
235
- Wx::SF::Serializable::JSON.start_parse
236
- pre_wxsf_parse!(*args, **kwargs)
237
- ensure
238
- # reset parsing stack
239
- Wx::SF::Serializable::JSON.end_parse
240
- end
241
- end
242
-
243
- end
244
- end
245
-
246
- class ::Class
247
-
248
- # override this to be able to do safe deserializing
249
- def json_creatable?
250
- if Wx::SF::Serializable::JSON.safe_parsing?
251
- return false unless Wx::SF::Serializable::JSON.serializables.include?(self) ||
252
- Wx::SF::Serializable.serializables.include?(self) ||
253
- ::Struct > self
254
- end
255
- respond_to?(:json_create)
256
- end
257
-
258
- end