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

Sign up to get free protection for your applications and to get access to all the features.
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