fxruby-enhancement 0.0.2

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.
@@ -0,0 +1,93 @@
1
+ # coding: utf-8
2
+ =begin rdoc
3
+ This is the detailed mapper constructs for
4
+ FXRuby.
5
+
6
+ == Internal Docs
7
+ Note that normally you should not need to know these details.
8
+
9
+ === Excution Flow
10
+ when you declare fx_app and all the nested delacrations,
11
+ they are initially noted in a tree of OS (OpenStruct) objects,
12
+ and then later the actual underlying FXRuby (and subsequently,
13
+ FOX Objects) are created. At this point the resultant objects
14
+ are plugged into the OS objects so they can be referenced.
15
+
16
+ So there are 3 phases:
17
+ # Construction of the OS tree (through your declaractions)
18
+ # Construction of the FXRuby objects
19
+ # Construction of the underlying FOX Objects at activation time.
20
+
21
+ A stack-based method is used to keep track of all of this during
22
+ the construction of the OS tree.
23
+
24
+ === Issues
25
+ For many FOX / FXRuby operations, you will need the FXApp object.
26
+ If you used full composition (via fx_app), the base object will be
27
+ the FXApp object. If, on the other hand, you used compose inside
28
+ of a declared FXRuby-derived class, base will be set to the first
29
+ declared component.
30
+
31
+ Normally this is not a problem, unless you use ingress_handler,
32
+ in which case it will not know how to find the FXApp object.
33
+
34
+ === Conventions
35
+ * pos -- Parent OpenStruct object
36
+
37
+ == NOTE WELL
38
+ This file is generated by fxruby-enhancement.
39
+ Do NOT modify this file. Modify the ERB template
40
+ file instead, and run 'rake scrape'.
41
+ =end
42
+
43
+ module Fox
44
+ <% for @class, @details in @api %>
45
+ class <%= @class %>
46
+ include Enhancement
47
+ attr_accessor :_o
48
+ end
49
+ <% end %>
50
+ module Enhancement
51
+ module Mapper
52
+ <% for @class, @details in @api %>
53
+ def <%= @class.snake %> name = nil, ii: <%= (Fox::Enhancement::INITFORCE.member? @class) ? Fox::Enhancement::INITFORCE[@class] : 0 %>, pos: Enhancement.stack.last, &block
54
+ Enhancement.stack << (@os = os = OpenStruct.new(klass: <%= @class %>, op: [], ii: ii, fx: nil, kinder: [], inst: nil, instance_result: nil))
55
+ Enhancement.components[name] = os unless name.nil?
56
+ unless pos.nil?
57
+ pos.kinder << os
58
+ else
59
+ Enhancement.base = os
60
+ end
61
+ <% @i=0 %>
62
+ <% for @iniparams in @details[:initialize].compact %>
63
+ <%= "@os.op[#{@i}]" %> = OpenStruct.new({<%= @iniparams.map{ |p,d| [p, d ? d : ":required"] }
64
+ .map{ |p,d| ":#{p} => #{d}"}
65
+ .join(', ') %>})
66
+ <% for @param, @default in @iniparams %>
67
+ def <%= "#{@param.snake}" %> var; @os.op[@os.ii].<%= "#{@param}" %> = var; end
68
+ <% end %>
69
+ def instance a=nil, &block
70
+ @os.instance_name = a
71
+ @os.instance_block = block
72
+ end
73
+ <% @i+=1; end unless @details[:initialize].nil? %>
74
+ self.instance_eval &block
75
+ <% unless Fox::Enhancement::SPECIAL.member? @class %>
76
+ os.fx = ->(){ <%= @class %>.new(*([pos.inst] + os.op[os.ii].to_h.values[1..-1])) }
77
+ <% else %>
78
+ os.fx = ->(){ <%= @class %>.new(*(os.op[os.ii].to_h.values)) }
79
+ <% end %>
80
+ Enhancement.stack.pop
81
+ @os = Enhancement.stack.last
82
+ os
83
+ end
84
+ <% end %>
85
+ end
86
+ <% for @select, @meth, @comment in @sel %>
87
+ # <%= @comment %>
88
+ def <%= @select.downcase %>(&block)
89
+ self.connect(<%= @select %>, &block)
90
+ end
91
+ <% end %>
92
+ end
93
+ end
@@ -0,0 +1,26 @@
1
+ =begin rdoc
2
+ = Core (Kernel) classes we monkeypatched.
3
+ =end
4
+
5
+ class String
6
+ def snake
7
+ self.gsub(/::/, '/')
8
+ .gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
9
+ .gsub(/([a-z\d])([A-Z])/,'\1_\2')
10
+ .tr("-", "_")
11
+ .downcase
12
+ end
13
+ end
14
+
15
+ class Symbol
16
+ def snake
17
+ self.to_s.snake.to_sym
18
+ end
19
+ end
20
+
21
+ class Binding
22
+ def fx fxf, dir=File.dirname(self.eval("__FILE__"))
23
+ filepath = File.expand_path("#{fxf}.fx", dir)
24
+ self.eval(File.read(filepath), filepath)
25
+ end
26
+ end
@@ -0,0 +1,145 @@
1
+ # coding: utf-8
2
+ module Fox
3
+
4
+ # Include this in your top class objects.
5
+ # If for a module, you want to extend, rather
6
+ # than include.
7
+ # FIXME: later we will clean this up.
8
+ module Enhancement
9
+ @stack = []
10
+ @base = nil
11
+ @components = {}
12
+ SPECIAL = [:FXApp,
13
+ :FXColorItem,
14
+ :FXRegion,
15
+ :FXRectangle,
16
+ :FXGradient,
17
+ :FXEvent,
18
+ :FXFileStream,
19
+ :FXExtentd]
20
+ INITFORCE = { FXMenuBar: 1 }
21
+
22
+ # Module-level
23
+ class << self
24
+ attr_accessor :stack,
25
+ :base, # the very first component declared, usually the app.
26
+ :components,
27
+ :deferred_setups,
28
+ :ms_ingress_delay_min,
29
+ :ms_ingress_delay_max
30
+
31
+ # queues for messages objects coming from and going to other threads.
32
+ attr_accessor :ingress, :egress, :ingress_map
33
+
34
+ def included(klass)
35
+ @ingress ||= QDing.new
36
+ @egress ||= QDing.new
37
+ @ingress_map ||= {}
38
+ @deferred_setups ||= []
39
+ @ms_ingress_delay_min = 100
40
+ @ms_ingress_delay_max = 1600
41
+
42
+ klass.extend ClassMethods
43
+ end
44
+
45
+ def reset_components
46
+ @components = {}
47
+ end
48
+
49
+ # Sets up the mechanism by which the custom ingress is activated
50
+ def activate_ingress_handlers app = Enhancement.base
51
+ raise "Application Object not instantiated yet" if app.nil? || app.inst.nil?
52
+ raise "No ingress blocks set" if @ingress_map.empty?
53
+
54
+ @ing_blk = ->(sender, sel, data) {
55
+ begin
56
+ unless @ingress.empty?
57
+ @ingress_delay = @ms_ingress_delay_min
58
+ until @ingress.empty?
59
+ dispatch_to, payload = @ingress.next
60
+ raise "Unknown dispatch #{dispatch_to}" unless @ingress_map.member? dispatch_to
61
+ @ingress_map[dispatch_to].(dispatch_to, payload)
62
+ end
63
+ else
64
+ @ingress_delay *= 2 unless @ingress_delay >= @ms_ingress_delay_max
65
+ end
66
+ ensure
67
+ app.inst.addTimeout(@ingress_delay, &@ing_blk)
68
+ end
69
+ }
70
+ app.inst.addTimeout(@ingress_delay ||= @ms_ingress_delay_min, &@ing_blk)
71
+ end
72
+
73
+ def activate_deferred_setups common_ob, app: Enhancement.base
74
+ Enhancement.deferred_setups.each { |b| b.(common_ob, app) }
75
+ end
76
+ end
77
+
78
+ # class level
79
+ module ClassMethods
80
+ def compose &block #DSL
81
+ @composure = block
82
+ end
83
+ end
84
+
85
+ # instance level
86
+ # Add it here.
87
+
88
+ module Mapper
89
+ # Find the referenced component's instance
90
+ def ref sym, &block
91
+ raise "No reference for #{sym} found" if Enhancement.components[sym].nil?
92
+ raise "No instance for #{sym} allocated" if Enhancement.components[sym].inst.nil?
93
+ inst = Enhancement.components[sym].inst
94
+ if block_given?
95
+ block.(inst)
96
+ end
97
+ return inst
98
+ end
99
+
100
+ # Find the referenced component's wrapper object
101
+ def refc sym, &block
102
+ raise "No reference component for #{sym} found" if Enhancement.components[sym].nil?
103
+ c = Enhancement.components[sym]
104
+ if block_given?
105
+ block.(c)
106
+ end
107
+ return c
108
+ end
109
+
110
+ # Wrapper component
111
+ def fox_component name, &block
112
+ if block_given?
113
+ block.(Enhancement.components[name])
114
+ else
115
+ Enhancement.components[name]
116
+ end
117
+ end
118
+ alias_method :fxc, :fox_component
119
+
120
+ # Actual FX Object instance
121
+ def fox_instance name, &block
122
+ if block_given?
123
+ block.(fox_component(name).inst)
124
+ else
125
+ fox_component(name).inst
126
+ end
127
+ end
128
+ alias_method :fxi, :fox_instance
129
+
130
+ # Handles incomming external messages of type given
131
+ # block, written by user, is called with |type, message|
132
+ def ingress_handler type = :all, &block
133
+ Enhancement.ingress_map[type] = block
134
+ end
135
+
136
+ # This is invoked after we have
137
+ # a real application in place. Invocation
138
+ # of this is held off until the last possible
139
+ # moment.
140
+ def deferred_setup &block
141
+ Enhancement.deferred_setups << block
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,38 @@
1
+ # coding: utf-8
2
+ class OpenStruct
3
+ extend Forwardable
4
+ def_delegator :inst, :create, :activate
5
+ def_delegator :inst, :run, :run_application
6
+
7
+ # This assumes this OpenStruct instance represents the base,
8
+ # and additionaly will take an optional object to use as the
9
+ # actual base to allow for composures.
10
+ #
11
+ # Returns the os base
12
+ def create_fox_components use_as_base = nil
13
+ if use_as_base.nil?
14
+ self.inst = fx.() if self.inst.nil?
15
+ self.kinder.each{ |os| os.create_fox_components }
16
+ else
17
+ OpenStruct.new(klass: use_as_base.class,
18
+ kinder: [self],
19
+ fx: ->() {use_as_base}).create_fox_components
20
+ end
21
+ self
22
+ end
23
+
24
+ def instance_final_activate
25
+ self.instance_result = self.instance_block.(self.inst) unless self.instance_block.nil?
26
+ self.kinder.each{ |os| os.instance_final_activate }
27
+ self
28
+ end
29
+
30
+ # launch the application
31
+ def launch ingress: false
32
+ create_fox_components
33
+ instance_final_activate
34
+ activate
35
+ Enhancement.activate_ingress_handlers self if ingress
36
+ run_application
37
+ end
38
+ end
@@ -0,0 +1,57 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe String do
4
+ it "supports snaking on strings" do
5
+ s = "FXToolBar"
6
+ expect(s.snake).to eq("fx_tool_bar")
7
+ end
8
+ end
9
+
10
+ describe Symbol do
11
+ it "supports snaking on symbols" do
12
+ s = :FXToolBar
13
+ expect(s.snake).to eq(:fx_tool_bar)
14
+ end
15
+ end
16
+
17
+ include Fox
18
+ include Fox::Enhancement::Mapper
19
+
20
+ describe "DSL" do
21
+ before :all do
22
+ @app = fx_app :foobase do
23
+ app_name "Foo Test"
24
+ vendor_name "RubyNEAT Spinoff tech"
25
+
26
+ @osmw = fx_main_window :main do
27
+ title "test window"
28
+ width 700
29
+ height 300
30
+ instance :foo_instance do |mw|
31
+ mw.vSpacing = 2
32
+ mw.show PLACEMENT_CURSOR
33
+ end
34
+ end
35
+
36
+ instance :app_startup do |app|
37
+ :mission_accomplished
38
+ end
39
+ end
40
+ @app.create_fox_components
41
+ @app.instance_final_activate
42
+ @app.activate
43
+ end
44
+
45
+ it "allows creation of the FXApp and one window" do
46
+ expect(Fox::Enhancement.base).to_not be_nil
47
+ expect(Fox::Enhancement.base.klass).to eq Fox::FXApp
48
+ @app.run_application
49
+ expect(@app.instance_result).to eq(:mission_accomplished)
50
+ end
51
+
52
+ it "adds the components to the internal registry" do
53
+ expect(fox_get_instance(:main).class).to eq(Fox::FXMainWindow)
54
+ end
55
+
56
+ it "checks fx_menu_bar :ii defaults to 1 instead of zero"
57
+ end
@@ -0,0 +1,19 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+
4
+ require 'rspec'
5
+ require 'fxruby-enhancement'
6
+
7
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
8
+
9
+ RSpec.configure do |config|
10
+ config.expect_with :rspec do |expectations|
11
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
12
+ end
13
+
14
+ config.mock_with :rspec do |mocks|
15
+ mocks.verify_partial_doubles = true
16
+ end
17
+
18
+ config.shared_context_metadata_behavior = :apply_to_host_groups
19
+ end
metadata ADDED
@@ -0,0 +1,319 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fxruby-enhancement
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Fred Mitchell
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-01-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: semver2
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: fxruby
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: awesome_print
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: json
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 2.0.2
62
+ - - "~>"
63
+ - !ruby/object:Gem::Version
64
+ version: '2.0'
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: 2.0.2
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: queue_ding
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rspec
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3'
103
+ - !ruby/object:Gem::Dependency
104
+ name: yard
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '0.7'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '0.7'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rdoc
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '5'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '5'
131
+ - !ruby/object:Gem::Dependency
132
+ name: bundler
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '1.0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '1.0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: juwelier
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '2'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '2'
159
+ - !ruby/object:Gem::Dependency
160
+ name: simplecov
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ - !ruby/object:Gem::Dependency
174
+ name: pry
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ - !ruby/object:Gem::Dependency
188
+ name: pry-byebug
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '3'
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '3'
201
+ - !ruby/object:Gem::Dependency
202
+ name: pry-doc
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ type: :development
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
215
+ - !ruby/object:Gem::Dependency
216
+ name: pry-remote
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - ">="
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ type: :development
223
+ prerelease: false
224
+ version_requirements: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - ">="
227
+ - !ruby/object:Gem::Version
228
+ version: '0'
229
+ - !ruby/object:Gem::Dependency
230
+ name: pry-rescue
231
+ requirement: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ version: '1'
236
+ type: :development
237
+ prerelease: false
238
+ version_requirements: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: '1'
243
+ - !ruby/object:Gem::Dependency
244
+ name: pry-stack_explorer
245
+ requirement: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
250
+ type: :development
251
+ prerelease: false
252
+ version_requirements: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - ">="
255
+ - !ruby/object:Gem::Version
256
+ version: '0'
257
+ description: "The fxruby library is an excellent wrapper for the FOX toolkit. However,
258
+ it reflects the\n C++-ness of FOX, rather than being more Ruby-like. As such, creating
259
+ composed objects with\n it tends to be rather ugly and cumbersome.\n\n fxruby-enhancement
260
+ is a wrapper for the wrapper, to \"rubyfy\" it and make it more easy to \n use
261
+ for Rubyists. \n\n fxruby-enhancement is basically a DSL of sorts, and every effort
262
+ has been taken to make \n it intuitive to use. Once you get the hang of it, you
263
+ should be able to look at the FXRuby\n API documentation and infer the DSL construct
264
+ for fxruby-enhancement."
265
+ email: fred.mitchell@gmx.de
266
+ executables: []
267
+ extensions: []
268
+ extra_rdoc_files:
269
+ - LICENSE.txt
270
+ - README.org
271
+ files:
272
+ - ".document"
273
+ - ".gitmodules"
274
+ - ".rspec"
275
+ - ".ruby-version"
276
+ - ".semver"
277
+ - Gemfile
278
+ - Gemfile.lock
279
+ - LICENSE.txt
280
+ - README.org
281
+ - Rakefile
282
+ - build/scrape-rdoc.rb
283
+ - examples/.ruby-version
284
+ - examples/bounce.rb
285
+ - examples/hello.rb
286
+ - fxruby-enhancement.gemspec
287
+ - lib/fxruby-enhancement.rb
288
+ - lib/fxruby-enhancement/api-mapper.rb
289
+ - lib/fxruby-enhancement/api-mapper.rb.erb
290
+ - lib/fxruby-enhancement/core-monkey.rb
291
+ - lib/fxruby-enhancement/enhancement.rb
292
+ - lib/fxruby-enhancement/ostruct-monkey.rb
293
+ - spec/fxruby-enhancement_spec.rb
294
+ - spec/spec_helper.rb
295
+ homepage: http://github.com/flajann2/fxruby-enhancement
296
+ licenses:
297
+ - MIT
298
+ metadata: {}
299
+ post_install_message:
300
+ rdoc_options: []
301
+ require_paths:
302
+ - lib
303
+ required_ruby_version: !ruby/object:Gem::Requirement
304
+ requirements:
305
+ - - ">="
306
+ - !ruby/object:Gem::Version
307
+ version: 2.3.1
308
+ required_rubygems_version: !ruby/object:Gem::Requirement
309
+ requirements:
310
+ - - ">="
311
+ - !ruby/object:Gem::Version
312
+ version: '0'
313
+ requirements: []
314
+ rubyforge_project:
315
+ rubygems_version: 2.6.8
316
+ signing_key:
317
+ specification_version: 4
318
+ summary: fxruby enhancements
319
+ test_files: []