such 0.4.0 → 1.0.210117
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/{README.rdoc → README.md} +59 -38
- data/lib/such.rb +2 -2
- data/lib/such/part.rb +16 -12
- data/lib/such/parts.rb +6 -8
- data/lib/such/such.rb +5 -12
- data/lib/such/thing.rb +12 -11
- data/lib/such/things.rb +11 -11
- metadata +12 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 8455f46116268e25b466323fb8d75b76d6084c815b8007a5d7d8cd934a15758d
|
4
|
+
data.tar.gz: 577f05b1c0bc9d4d3a1a93ee58103f7656243dbd064ed7d887cec899a3de47e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c008f4588f1ea74638d76279d0f7ccc9ffd1a9f321e2cbd32d14bf0ad5e7da70903995b03d9820cf4a95af302269b5d99c9bf952fa7a346aebc77724d9091ddf
|
7
|
+
data.tar.gz: 8cce6a2ce219fe0f9a435f9d4236cb24ba28d60e62b585eb53cd2aa49bb9aacdf5ae43d29a864c761d472ded4cd02a3dca989c3a24b19dd8b5bc40658e303417
|
data/{README.rdoc → README.md}
RENAMED
@@ -1,53 +1,77 @@
|
|
1
|
-
|
1
|
+
# Such
|
2
2
|
|
3
|
-
|
3
|
+
* [VERSION 1.0.210117](https://github.com/carlosjhr64/such/releases)
|
4
|
+
* [github](https://www.github.com/carlosjhr64/such)
|
5
|
+
* [rubygems](https://rubygems.org/gems/such)
|
6
|
+
|
7
|
+
## DESCRIPTION:
|
4
8
|
|
5
9
|
Wraps widgets with an alternate constructor
|
6
10
|
which factors out the configuration and assembly procedures into metadata.
|
7
11
|
Can be used to wrap any class with the alternate constructor,
|
8
|
-
although
|
12
|
+
although targeted only Gtk3 widgets.
|
13
|
+
|
14
|
+
## INSTALL:
|
15
|
+
|
16
|
+
```shell
|
17
|
+
$ sudo gem install such
|
18
|
+
```
|
9
19
|
|
10
|
-
|
20
|
+
## SYNOPSIS:
|
11
21
|
|
12
|
-
|
13
|
-
|
14
|
-
|
22
|
+
```ruby
|
23
|
+
require 'gtk3'
|
24
|
+
require 'such'
|
25
|
+
include Such; Things.in Gtk::Widget
|
15
26
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
27
|
+
Thing.configure window: {
|
28
|
+
set_title: 'Synopsis Example',
|
29
|
+
set_window_position: :center},
|
30
|
+
BUTTON: [label: 'Button!'],
|
31
|
+
button: {
|
32
|
+
set_size_request: [100,50],
|
33
|
+
into:[:add]}
|
21
34
|
|
22
|
-
|
23
|
-
|
24
|
-
|
35
|
+
window = Window.new(:window, 'destroy'){Gtk.main_quit} #~> Such::Window
|
36
|
+
Button.new(window, :button!){puts 'Button pressed!'} #~> Such::Button
|
37
|
+
window.show_all
|
25
38
|
|
26
|
-
|
39
|
+
Gtk.main #=> nil
|
40
|
+
```
|
27
41
|
|
28
|
-
|
42
|
+
## MORE:
|
29
43
|
|
30
44
|
Arrays are passed to constructer's super,
|
31
45
|
Hashes are method=>arguments pairs, and Strings are signals.
|
32
46
|
Other objects are assumed to be containers:
|
33
47
|
|
34
|
-
|
48
|
+
```ruby
|
49
|
+
Such::Button.new(
|
50
|
+
window,
|
51
|
+
[label: 'Hello!'],
|
52
|
+
{set_size_request:[100,50]},
|
53
|
+
'clicked'
|
54
|
+
){ puts 'OK'}
|
35
55
|
|
36
|
-
|
56
|
+
# Is equivalent to:
|
37
57
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
58
|
+
button = Gtk::Button.new(label:'Hello!')
|
59
|
+
window.add button
|
60
|
+
button.set_size_request 100, 50
|
61
|
+
button.signal_connect('clicked'){puts 'OK'}
|
62
|
+
```
|
42
63
|
|
43
|
-
To set the packing method to say
|
64
|
+
To set the packing method to say `:pack_start`, set the `:into` method as follows:
|
44
65
|
|
45
|
-
|
46
|
-
|
47
|
-
|
66
|
+
```ruby
|
67
|
+
{into: [:pack_start, expand:false, fill:false, padding:0]}
|
68
|
+
# The effect in the contructor will be as if the following was run:
|
69
|
+
# container.pack_start(self, expand:false, fill:false, padding:0)
|
70
|
+
```
|
48
71
|
|
49
72
|
One can configure Symbol keys to represent metadata about a widget:
|
50
73
|
|
74
|
+
```ruby
|
51
75
|
Thing.configure(
|
52
76
|
KEY: [ arg1, arg2, arg3 ], # an array for super(arg1, arg2, arg3)
|
53
77
|
key: { # a hash for like self.method(args)
|
@@ -57,11 +81,12 @@ One can configure Symbol keys to represent metadata about a widget:
|
|
57
81
|
},
|
58
82
|
key!: [[arg1, arg2], {meth1:args1, meth2:args2}, 'signal1', 'signal2'] # the splatter bang!
|
59
83
|
)
|
84
|
+
```
|
60
85
|
|
61
86
|
The examples in this repository are reworks of the examples given in
|
62
87
|
ZetCode.com[http://zetcode.com/gui/rubygtk/] (back in 2015).
|
63
88
|
|
64
|
-
|
89
|
+
## Features:
|
65
90
|
|
66
91
|
* :key! content *splat
|
67
92
|
* Undefined :key! expanded to :KEY, :key
|
@@ -70,21 +95,17 @@ ZetCode.com[http://zetcode.com/gui/rubygtk/] (back in 2015).
|
|
70
95
|
* Packing method defaults (ultimately) to :add
|
71
96
|
* Way to change default packing behaviour
|
72
97
|
|
73
|
-
|
74
|
-
|
75
|
-
$ sudo gem install such
|
76
|
-
|
77
|
-
== But wait! One more thing:
|
98
|
+
## But wait! One more thing:
|
78
99
|
|
79
|
-
See
|
80
|
-
and
|
81
|
-
Such::Part module
|
100
|
+
See [such_parts_demo](examples/such_parts_demo) in the examples directory
|
101
|
+
and [tc_part](test/tc_part) for hints on how to use the powerful
|
102
|
+
[Such::Part module](lib/such/part.rb).
|
82
103
|
|
83
|
-
|
104
|
+
## LICENSE:
|
84
105
|
|
85
106
|
(The MIT License)
|
86
107
|
|
87
|
-
Copyright (c)
|
108
|
+
Copyright (c) 2021 CarlosJHR64
|
88
109
|
|
89
110
|
Permission is hereby granted, free of charge, to any person obtaining
|
90
111
|
a copy of this software and associated documentation files (the
|
data/lib/such.rb
CHANGED
data/lib/such/part.rb
CHANGED
@@ -1,29 +1,33 @@
|
|
1
1
|
module Such
|
2
2
|
module Part
|
3
|
+
PLUG_PATTERN = /^(?<sym>[^\W_]+)_(?<cls>[^\W_]+)$/
|
4
|
+
|
3
5
|
def initialize(*parameters, &block)
|
4
6
|
super(*parameters)
|
5
7
|
self.class.plugs.each do |plg|
|
6
|
-
if
|
7
|
-
plg, sym, cls =
|
8
|
-
plg
|
8
|
+
if md = PLUG_PATTERN.match(plg)
|
9
|
+
plg, sym, cls = "#{plg}=".to_sym, "#{md[:sym]}!".to_sym, Object.const_get("Such::#{md[:cls]}")
|
10
|
+
# self.<plg> = Such::<cls>.new(self, :<sym>!, &block)
|
11
|
+
public_send plg, cls.new(self, sym, &block)
|
9
12
|
end
|
10
13
|
end
|
11
14
|
end
|
12
15
|
|
13
16
|
def message(*parameters)
|
14
|
-
self.class.plugs.each{|plg|
|
17
|
+
self.class.plugs.each{|plg| public_send(plg).message(*parameters) }
|
15
18
|
end
|
16
19
|
|
17
|
-
def method_missing(
|
18
|
-
super unless args.length==0 and
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
def method_missing(maybe,*args) # maybe a plug down the plugged things.
|
21
|
+
super unless args.length==0 and PLUG_PATTERN.match?(maybe)
|
22
|
+
self.class.plugs.each do |plug|
|
23
|
+
thing = public_send(plug)
|
24
|
+
if thing.is_a? Such::Part
|
25
|
+
if obj = thing.public_send(maybe)
|
26
|
+
return obj
|
27
|
+
end
|
24
28
|
end
|
25
29
|
end
|
26
|
-
return
|
30
|
+
return nil
|
27
31
|
end
|
28
32
|
end
|
29
33
|
end
|
data/lib/such/parts.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
module Such
|
2
2
|
module Parts
|
3
3
|
def self.make(part, thing, *plugs)
|
4
|
-
|
4
|
+
unless thing < Such::Thing and [part,*plugs].all?{_1.is_a? Symbol}
|
5
|
+
raise "Expected Such::Parts.make(Symbol part, Class thing < Such::Thing, *Symbol plugs)"
|
6
|
+
end
|
5
7
|
plugs.each do |plug|
|
6
8
|
if /^[^\W_]+_(?<klass>[^\W_]+)$/=~plug
|
7
9
|
next unless $VERBOSE
|
@@ -12,13 +14,9 @@ module Such
|
|
12
14
|
raise "Plugs must have the form key_class: #{plug}"
|
13
15
|
end
|
14
16
|
end
|
15
|
-
Such.subclass
|
16
|
-
|
17
|
-
|
18
|
-
[:#{plugs.join(', :')}]
|
19
|
-
end
|
20
|
-
include Such::Part
|
21
|
-
EOT
|
17
|
+
subklass = Such.subclass(part, thing, include: Such::Part, attr_accessor: plugs)
|
18
|
+
subklass.singleton_class.class_eval{ define_method(:plugs){plugs} }
|
19
|
+
return subklass
|
22
20
|
end
|
23
21
|
end
|
24
22
|
end
|
data/lib/such/such.rb
CHANGED
@@ -1,15 +1,8 @@
|
|
1
1
|
module Such
|
2
|
-
def self.subclass(
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
CODE
|
8
|
-
begin
|
9
|
-
eval code
|
10
|
-
rescue Exception
|
11
|
-
$stderr.puts code if $VERBOSE
|
12
|
-
raise $!
|
13
|
-
end
|
2
|
+
def self.subclass(name, klass, **kw, &block)
|
3
|
+
subklass = const_set(name, Class.new(klass))
|
4
|
+
kw.each{|method, args| subklass.public_send(method, *args)}
|
5
|
+
subklass.class_eval(&block) if block
|
6
|
+
return subklass
|
14
7
|
end
|
15
8
|
end
|
data/lib/such/thing.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
module Such
|
2
2
|
module Thing
|
3
|
-
|
3
|
+
SIGNALS = ['clicked']
|
4
|
+
INTOS = [:set_submenu, :pack_start, :append, :add]
|
4
5
|
|
5
6
|
PARAMETERS = {}
|
6
7
|
def self.configure(conf)
|
7
|
-
|
8
|
+
PARAMETERS.merge! conf
|
8
9
|
end
|
9
10
|
|
10
11
|
def self.trace_method(obj, mthd, args)
|
@@ -36,17 +37,17 @@ module Such
|
|
36
37
|
case parameter
|
37
38
|
when Symbol
|
38
39
|
# Symbols are expected to translate to something else.
|
39
|
-
Thing.do_symbol
|
40
|
+
Thing.do_symbol parameter, parameters
|
40
41
|
when Array
|
41
42
|
# Arrays are added to the Thing's arguments list.
|
42
|
-
arguments
|
43
|
+
arguments.concat parameter
|
43
44
|
when Hash
|
44
45
|
# Hashes are expected to be a symbol list of methods on Thing with respective arguments.
|
45
46
|
# It's possible to override a previously defined method with new arguments.
|
46
|
-
|
47
|
+
methods.merge! parameter
|
47
48
|
when String
|
48
49
|
# Typically a signal: Thing#signal_connect(signal){|*emits| block.call(*emits)}
|
49
|
-
signals.push
|
50
|
+
signals.push parameter
|
50
51
|
else
|
51
52
|
# Assume it's a container
|
52
53
|
container = parameter
|
@@ -72,7 +73,7 @@ module Such
|
|
72
73
|
mthd=Thing.which_method(container)
|
73
74
|
end
|
74
75
|
Thing.trace_method(container, mthd, [obj.class,*args]) if $VERBOSE
|
75
|
-
container.
|
76
|
+
container.public_send(mthd, obj, *args)
|
76
77
|
else
|
77
78
|
warn "Warning: Container for #{self.class} not given."
|
78
79
|
end
|
@@ -92,7 +93,7 @@ module Such
|
|
92
93
|
|
93
94
|
def self.do_methods(obj, methods, container=nil)
|
94
95
|
# If user does not specify how to add to container, assume default way.
|
95
|
-
methods[:into]=Thing.which_method(container) if container and
|
96
|
+
methods[:into]=Thing.which_method(container) if container and not methods.has_key?(:into)
|
96
97
|
methods.each do |mthd, args|
|
97
98
|
(mthd==:into)? Thing.into(obj, container, *args) :
|
98
99
|
Thing.do_method(obj, mthd, *args)
|
@@ -103,14 +104,14 @@ module Such
|
|
103
104
|
return if signals.first==''
|
104
105
|
none = (signals.length==0)
|
105
106
|
if block
|
106
|
-
signals.push(
|
107
|
+
signals.push(*SIGNALS) if none
|
107
108
|
signals.each do |signal|
|
108
109
|
break if signal==''
|
109
110
|
begin
|
110
|
-
obj.signal_connect(signal){|*emits| block.call(*emits, signal)}
|
111
|
+
obj.signal_connect(signal){|*emits| block.call(*emits, signal)}
|
111
112
|
Thing.trace_signal(obj, signal) if $VERBOSE
|
112
113
|
rescue GLib::NoSignalError
|
113
|
-
warn "Warning: no
|
114
|
+
warn "Warning: no #{signal} signal for #{obj.class}"
|
114
115
|
end
|
115
116
|
end
|
116
117
|
elsif not none
|
data/lib/such/things.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
module Such
|
2
2
|
module Things
|
3
|
-
def self.list(
|
4
|
-
ObjectSpace.each_object(Class).select{|
|
3
|
+
def self.list(superklass)
|
4
|
+
ObjectSpace.each_object(Class).select{|klass| klass < superklass}
|
5
5
|
end
|
6
6
|
|
7
|
-
def self.
|
8
|
-
|
7
|
+
def self.subclass(klass)
|
8
|
+
Such.subclass(klass.name.sub(/^.*::/,'').to_sym, klass, include: Such::Thing)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.in(superklass)
|
12
|
+
Things.list(superklass).each do |klass|
|
9
13
|
begin
|
10
|
-
|
11
|
-
rescue
|
12
|
-
$stderr.puts "#{$!.class}:\t#{
|
14
|
+
Things.subclass(klass)
|
15
|
+
rescue
|
16
|
+
$stderr.puts "#{$!.class}:\t#{superklass}" if $VERBOSE
|
13
17
|
end
|
14
18
|
end
|
15
19
|
end
|
16
|
-
|
17
|
-
def self.gtk_widget
|
18
|
-
Things.in(Gtk::Widget)
|
19
|
-
end
|
20
20
|
end
|
21
21
|
end
|
metadata
CHANGED
@@ -1,27 +1,26 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: such
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.210117
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- carlosjhr64
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |
|
14
14
|
Wraps widgets with an alternate constructor
|
15
15
|
which factors out the configuration and assembly procedures into metadata.
|
16
16
|
Can be used to wrap any class with the alternate constructor,
|
17
|
-
although
|
17
|
+
although targeted only Gtk3 widgets.
|
18
18
|
email: carlosjhr64@gmail.com
|
19
19
|
executables: []
|
20
20
|
extensions: []
|
21
|
-
extra_rdoc_files:
|
22
|
-
- README.rdoc
|
21
|
+
extra_rdoc_files: []
|
23
22
|
files:
|
24
|
-
- README.
|
23
|
+
- README.md
|
25
24
|
- lib/such.rb
|
26
25
|
- lib/such/part.rb
|
27
26
|
- lib/such/parts.rb
|
@@ -32,10 +31,8 @@ homepage: https://github.com/carlosjhr64/such
|
|
32
31
|
licenses:
|
33
32
|
- MIT
|
34
33
|
metadata: {}
|
35
|
-
post_install_message:
|
36
|
-
rdoc_options:
|
37
|
-
- "--main"
|
38
|
-
- README.rdoc
|
34
|
+
post_install_message:
|
35
|
+
rdoc_options: []
|
39
36
|
require_paths:
|
40
37
|
- lib
|
41
38
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -49,12 +46,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
49
46
|
- !ruby/object:Gem::Version
|
50
47
|
version: '0'
|
51
48
|
requirements:
|
52
|
-
- 'ruby: ruby
|
53
|
-
|
54
|
-
|
55
|
-
signing_key:
|
49
|
+
- 'ruby: ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]'
|
50
|
+
rubygems_version: 3.2.3
|
51
|
+
signing_key:
|
56
52
|
specification_version: 4
|
57
53
|
summary: Wraps widgets with an alternate constructor which factors out the configuration
|
58
54
|
and assembly procedures into metadata. Can be used to wrap any class with the alternate
|
59
|
-
constructor, although
|
55
|
+
constructor, although targeted only Gtk3 widgets.
|
60
56
|
test_files: []
|