svent 0.1.0 → 0.2.0
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 +4 -4
- data/.codeclimate.yml +25 -0
- data/.rubocop.yml +1156 -0
- data/.travis.yml +23 -0
- data/Gemfile +7 -0
- data/README.md +4 -1
- data/Rakefile +17 -2
- data/lib/svent.rb +8 -2
- data/lib/svent/event.rb +5 -5
- data/lib/svent/event_callback_fiber.rb +3 -2
- data/lib/svent/event_manger.rb +135 -77
- data/lib/svent/version.rb +1 -1
- data/svent.gemspec +1 -0
- data/test.rb +30 -0
- metadata +6 -2
data/.travis.yml
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
sudo: false
|
|
2
|
+
language: ruby
|
|
3
|
+
cache: bundler
|
|
4
|
+
before_install: gem update bundler
|
|
5
|
+
addons:
|
|
6
|
+
code_climate:
|
|
7
|
+
repo_token: 6896a20297dac7ea23f4786a3e91357ed5714984a14662892389722c3aeaf085
|
|
8
|
+
matrix:
|
|
9
|
+
include:
|
|
10
|
+
- rvm: 2.1.0
|
|
11
|
+
- rvm: 2.1.10
|
|
12
|
+
- rvm: 2.2.5
|
|
13
|
+
- rvm: 2.3.1
|
|
14
|
+
- rvm: ruby-head
|
|
15
|
+
- rvm: jruby-9.1.5.0
|
|
16
|
+
env: JRUBY_OPTS='--debug' # get more accurate coverage data
|
|
17
|
+
- rvm: rbx-3
|
|
18
|
+
allow_failures:
|
|
19
|
+
- rvm: ruby-head
|
|
20
|
+
- rvm: jruby-9.1.5.0
|
|
21
|
+
- rvm: rbx-3
|
|
22
|
+
fast_finish: true
|
|
23
|
+
script: bundle exec rake
|
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
# Svent
|
|
2
|
+
[](http://badge.fury.io/rb/svent)
|
|
3
|
+
[](https://travis-ci.org/molingyu/svent)
|
|
4
|
+
[](https://codeclimate.com/github/molingyu/svent)
|
|
2
5
|
|
|
3
6
|
Svent is an async event framework implemented with Fiber.Used for game or GUI event handling.
|
|
4
7
|
|
|
@@ -52,7 +55,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
|
52
55
|
|
|
53
56
|
## Contributing
|
|
54
57
|
|
|
55
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
|
58
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/molingyu/svent. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
|
56
59
|
|
|
57
60
|
|
|
58
61
|
## License
|
data/Rakefile
CHANGED
|
@@ -1,2 +1,17 @@
|
|
|
1
|
-
require
|
|
2
|
-
|
|
1
|
+
require 'bundler/gem_tasks'
|
|
2
|
+
|
|
3
|
+
require 'rspec/core/rake_task'
|
|
4
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
|
5
|
+
spec.pattern = FileList["spec/*_spec.rb"]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
begin
|
|
9
|
+
require 'rubocop/rake_task'
|
|
10
|
+
RuboCop::RakeTask.new
|
|
11
|
+
rescue LoadError
|
|
12
|
+
task :rubocop do
|
|
13
|
+
$stderr.puts 'Rubocop is disabled'
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
task default: [:spec, :rubocop]
|
data/lib/svent.rb
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
+
module Svent
|
|
2
|
+
|
|
3
|
+
DEBUG = false
|
|
4
|
+
|
|
5
|
+
end
|
|
6
|
+
|
|
1
7
|
require_relative "svent/version"
|
|
2
|
-
require_relative 'svent/event'
|
|
3
|
-
require_relative 'svent/event_callback_fiber'
|
|
4
8
|
require_relative 'svent/event_manger'
|
|
5
9
|
|
|
6
10
|
module Svent
|
|
7
11
|
|
|
8
12
|
def self.run(event_manger = EventManger.new, &block)
|
|
13
|
+
$log = open('debug.log', 'w') if DEBUG
|
|
14
|
+
@stop = false
|
|
9
15
|
@event_manger = event_manger
|
|
10
16
|
block[@event_manger] if block
|
|
11
17
|
@event_manger.update until @stop
|
data/lib/svent/event.rb
CHANGED
|
@@ -5,19 +5,19 @@ module Svent
|
|
|
5
5
|
|
|
6
6
|
class Event
|
|
7
7
|
extend Forwardable
|
|
8
|
-
def_delegators :@list, :delete, :each, :push, :length, :[]
|
|
8
|
+
def_delegators :@list, :delete, :each, :push, :length, :[]=, :[]
|
|
9
9
|
|
|
10
10
|
attr_reader :name
|
|
11
|
-
attr_reader :
|
|
11
|
+
attr_reader :info
|
|
12
12
|
|
|
13
|
-
def initialize(name,
|
|
13
|
+
def initialize(name, info)
|
|
14
14
|
@list = []
|
|
15
15
|
@name = name
|
|
16
|
-
@
|
|
16
|
+
@info = info
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def reverse
|
|
20
|
-
event = Event.new(@name, @
|
|
20
|
+
event = Event.new(@name, @info)
|
|
21
21
|
event.instance_variable_set(:@list, @list.reverse)
|
|
22
22
|
event
|
|
23
23
|
end
|
|
@@ -9,14 +9,15 @@ module Svent
|
|
|
9
9
|
attr_reader :info
|
|
10
10
|
attr_reader :callback
|
|
11
11
|
|
|
12
|
-
def initialize(
|
|
12
|
+
def initialize(helper, name, callback, info)
|
|
13
13
|
@name = name
|
|
14
14
|
@info = info
|
|
15
15
|
@callback = callback
|
|
16
16
|
@fiber = Fiber.new do
|
|
17
|
-
@callback.call(
|
|
17
|
+
@callback.call(helper, info)
|
|
18
18
|
@fiber = nil
|
|
19
19
|
end
|
|
20
|
+
# self.resume
|
|
20
21
|
@return = nil
|
|
21
22
|
end
|
|
22
23
|
|
data/lib/svent/event_manger.rb
CHANGED
|
@@ -1,34 +1,143 @@
|
|
|
1
1
|
# encoding:utf-8
|
|
2
|
+
require_relative 'event'
|
|
3
|
+
require_relative 'event_callback_fiber'
|
|
2
4
|
|
|
3
5
|
module Svent
|
|
4
6
|
|
|
5
7
|
class EventManger
|
|
6
8
|
|
|
9
|
+
module Helper
|
|
10
|
+
class << self
|
|
11
|
+
|
|
12
|
+
attr_writer :this
|
|
13
|
+
|
|
14
|
+
def init(events, callback_fibers)
|
|
15
|
+
@this = nil
|
|
16
|
+
@events = events
|
|
17
|
+
@callback_fibers = callback_fibers
|
|
18
|
+
@timers = {}
|
|
19
|
+
@counters = {}
|
|
20
|
+
@timer_filters = {}
|
|
21
|
+
@counter_filters = {}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def after_delete
|
|
25
|
+
@events[@this.name].delete(@this.callback)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def delete
|
|
29
|
+
after_delete
|
|
30
|
+
Fiber.yield true
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def ok?(info = nil, &block)
|
|
34
|
+
Kernel.loop do
|
|
35
|
+
break if block.call(info)
|
|
36
|
+
Fiber.yield
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def loop(condition, info = nil, &block)
|
|
41
|
+
Kernel.loop do
|
|
42
|
+
break if condition.call
|
|
43
|
+
block.call(info)
|
|
44
|
+
Fiber.yield
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def filter(&block)
|
|
49
|
+
Fiber.yield true unless block.call
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def wait(value)
|
|
53
|
+
timer = @timers[@this.object_id]
|
|
54
|
+
timer = Time.now unless timer
|
|
55
|
+
loop do
|
|
56
|
+
break @timers.delete(@this.object_id) unless Time.now - timer < value
|
|
57
|
+
Fiber.yield
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def times(value)
|
|
62
|
+
counter = @counters[@this.object_id]
|
|
63
|
+
counter ? @counters[@this.object_id] += 1 : @counters[@this.object_id] = 1
|
|
64
|
+
loop do
|
|
65
|
+
break @counters.delete(@this.object_id) if counter > value
|
|
66
|
+
Fiber.yield
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def wait_filter(value)
|
|
71
|
+
timer_filter = @timer_filters[@this.object_id]
|
|
72
|
+
return timer_filter = Time.now unless timer_filter
|
|
73
|
+
loop do
|
|
74
|
+
break @timer_filters.delete(@this.object_id) unless Time.now - timer_filter < value
|
|
75
|
+
Fiber.yield true
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def times_filter(value)
|
|
80
|
+
counter_filter = @counter_filters[@this.object_id]
|
|
81
|
+
counter_filter ? @counter_filters[@this.object_id] += 1 : (return @counter_filters[@this.object_id] = 1)
|
|
82
|
+
loop do
|
|
83
|
+
break @counter_filters.delete(@this.object_id) if @counter_filters[object_id] > value
|
|
84
|
+
Fiber.yield true
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
7
91
|
attr_reader :events
|
|
8
|
-
attr_reader :this
|
|
9
|
-
attr_reader :timers
|
|
10
|
-
attr_reader :counters
|
|
11
|
-
attr_reader :timer_filters
|
|
12
|
-
attr_reader :counter_filters
|
|
13
92
|
|
|
14
93
|
def initialize
|
|
15
94
|
@events = {}
|
|
16
|
-
@this = nil
|
|
17
95
|
@event_callback_fibers = []
|
|
18
|
-
@
|
|
19
|
-
@
|
|
20
|
-
|
|
21
|
-
|
|
96
|
+
@next_callback_fibers = []
|
|
97
|
+
Helper.init(@events, @event_callback_fibers)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def stop
|
|
101
|
+
trigger(:event_manger_stop)
|
|
102
|
+
trigger(:event_manger_stop?)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def stop?
|
|
106
|
+
@next_callback_fibers == [] && @event_callback_fibers == []
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
if Svent::DEBUG
|
|
110
|
+
def debug_arr
|
|
111
|
+
arr = []
|
|
112
|
+
next_arr = []
|
|
113
|
+
@event_callback_fibers.each{|o| arr.push [o.name, o.object_id] }
|
|
114
|
+
@next_callback_fibers.each{|o| next_arr.push [o.name, o.object_id] }
|
|
115
|
+
{callback: arr, next: next_arr}
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def logger(*arg)
|
|
119
|
+
str = ''
|
|
120
|
+
arg.each{ |s| str += "#{s}, " }
|
|
121
|
+
$log.write "#{str[0, str.size - 2]}\n"
|
|
122
|
+
end
|
|
22
123
|
end
|
|
23
124
|
|
|
24
125
|
def update
|
|
126
|
+
logger '='*4+'update' if Svent::DEBUG
|
|
25
127
|
if @event_callback_fibers != []
|
|
26
|
-
@
|
|
27
|
-
|
|
28
|
-
|
|
128
|
+
@next_callback_fibers = []
|
|
129
|
+
loop do
|
|
130
|
+
obj = @event_callback_fibers.pop
|
|
131
|
+
break unless obj
|
|
132
|
+
logger "==fiber-#{obj.name}(#{obj.object_id}) call:" if Svent::DEBUG
|
|
133
|
+
logger'before:', debug_arr, @event_callback_fibers.size if Svent::DEBUG
|
|
134
|
+
Helper.this = obj
|
|
29
135
|
obj.resume
|
|
30
|
-
|
|
136
|
+
Helper.this = nil
|
|
137
|
+
logger'after:', debug_arr, @event_callback_fibers.size if Svent::DEBUG
|
|
138
|
+
@next_callback_fibers.push obj if obj.alive?
|
|
31
139
|
end
|
|
140
|
+
@event_callback_fibers = @next_callback_fibers
|
|
32
141
|
end
|
|
33
142
|
end
|
|
34
143
|
|
|
@@ -40,83 +149,32 @@ module Svent
|
|
|
40
149
|
end
|
|
41
150
|
name = name.to_sym if name.class == String
|
|
42
151
|
event = @events[name]
|
|
43
|
-
event.each{ |callback| @event_callback_fibers.push(EventCallbackFiber.new(
|
|
152
|
+
event.each{ |callback| @event_callback_fibers.push(EventCallbackFiber.new(Helper, name, callback, info)) } if event
|
|
153
|
+
logger 'trigger:', name, debug_arr, @event_callback_fibers.size if Svent::DEBUG
|
|
44
154
|
end
|
|
45
155
|
|
|
46
|
-
def on(name,
|
|
156
|
+
def on(name, info = nil, index = nil, &callback)
|
|
47
157
|
name = name.to_sym if name.class == String
|
|
48
158
|
if name == :event_manger_stop?
|
|
49
159
|
raise 'error:The event(:event_manger_stop?) can only have one callback.' if @events.include?(:event_manger_stop?)
|
|
50
160
|
end
|
|
51
|
-
event = @events[name] ||= Event.new(name,
|
|
161
|
+
event = @events[name] ||= Event.new(name, info)
|
|
52
162
|
index = event.length unless index
|
|
53
163
|
event[index] = callback
|
|
54
164
|
end
|
|
55
165
|
|
|
56
|
-
def
|
|
57
|
-
|
|
58
|
-
trigger(:event_manger_stop?)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def stop?
|
|
62
|
-
@event_callback_fibers.size == 1 && @event_callback_fibers.last.name == :event_manger_stop?
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def delete
|
|
66
|
-
@events[@this.name].delete(@this.callback)
|
|
166
|
+
def event(name, info)
|
|
167
|
+
@events[name] ? @events[name].info = info : Event.new(name, info)
|
|
67
168
|
end
|
|
68
169
|
|
|
69
|
-
def
|
|
70
|
-
|
|
71
|
-
|
|
170
|
+
def event_info(name, key, value)
|
|
171
|
+
event = @events[name] ||= Event.new(name, info)
|
|
172
|
+
event.info[key] = value
|
|
72
173
|
end
|
|
73
174
|
|
|
74
|
-
def
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
Fiber.yield
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def filter(&block)
|
|
82
|
-
Fiber.yield true unless block.call
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def wait(value)
|
|
86
|
-
timer = @timers[@this.object_id]
|
|
87
|
-
timer = Time.now unless timer
|
|
88
|
-
loop do
|
|
89
|
-
break @timers.delete(@this.object_id) unless Time.now - timer < value
|
|
90
|
-
Fiber.yield
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def times(value)
|
|
95
|
-
counter = @counters[@this.object_id]
|
|
96
|
-
counter ? counter += 1 : counter = 1
|
|
97
|
-
loop do
|
|
98
|
-
break @counters.delete(@this.object_id) if counter > value
|
|
99
|
-
Fiber.yield
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def wait_filter(value)
|
|
104
|
-
timer_filter = @timer_filters[@this.object_id]
|
|
105
|
-
return timer_filter = Time.now unless timer_filter
|
|
106
|
-
loop do
|
|
107
|
-
break @timer_filters.delete(@this.object_id) unless Time.now - timer_filter < value
|
|
108
|
-
Fiber.yield true
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
def times_filter(value)
|
|
113
|
-
object_id =
|
|
114
|
-
counter_filter = @counter_filters[@this.object_id]
|
|
115
|
-
counter_filter ? counter_filter += 1 : (return counter_filter = 1)
|
|
116
|
-
loop do
|
|
117
|
-
break @counter_filters.delete(@this.object_id) if @counter_filters[object_id] > value
|
|
118
|
-
Fiber.yield true
|
|
119
|
-
end
|
|
175
|
+
def have(name)
|
|
176
|
+
@events.each { |event| return true if event.name == name }
|
|
177
|
+
false
|
|
120
178
|
end
|
|
121
179
|
|
|
122
180
|
end
|
data/lib/svent/version.rb
CHANGED
data/svent.gemspec
CHANGED
data/test.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require_relative 'lib/svent'
|
|
2
|
+
|
|
3
|
+
Svent.run do |em|
|
|
4
|
+
|
|
5
|
+
em.on(:exit) do |_, info|
|
|
6
|
+
puts 'bye!'
|
|
7
|
+
info[:exit] = true
|
|
8
|
+
Svent.stop
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
em.on(:hello) do
|
|
12
|
+
puts 'world!'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
em.on(:input) do |_, info|
|
|
16
|
+
input = info.input.chop
|
|
17
|
+
p "help!#{info.input}"
|
|
18
|
+
em.trigger(:exit, info) if input == 'exit'
|
|
19
|
+
em.trigger(:hello, info) if input == 'hello'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
em.on(:run) do |helper, info|
|
|
23
|
+
helper.loop(lambda{ info.exit }) do
|
|
24
|
+
print info.code
|
|
25
|
+
info[:input] = gets
|
|
26
|
+
em.trigger(:input, info)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
em.trigger(:run, {code: 'StartScene>', exit: false})
|
|
30
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: svent
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- molingyu
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-
|
|
11
|
+
date: 2016-11-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -46,6 +46,9 @@ executables: []
|
|
|
46
46
|
extensions: []
|
|
47
47
|
extra_rdoc_files: []
|
|
48
48
|
files:
|
|
49
|
+
- ".codeclimate.yml"
|
|
50
|
+
- ".rubocop.yml"
|
|
51
|
+
- ".travis.yml"
|
|
49
52
|
- CODE_OF_CONDUCT.md
|
|
50
53
|
- Gemfile
|
|
51
54
|
- LICENSE.txt
|
|
@@ -59,6 +62,7 @@ files:
|
|
|
59
62
|
- lib/svent/event_manger.rb
|
|
60
63
|
- lib/svent/version.rb
|
|
61
64
|
- svent.gemspec
|
|
65
|
+
- test.rb
|
|
62
66
|
homepage: https://github.com/molingyu/svent
|
|
63
67
|
licenses:
|
|
64
68
|
- MIT
|