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.
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
@@ -2,3 +2,10 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in svent.gemspec
4
4
  gemspec
5
+
6
+ group :test do
7
+ gem 'rails'
8
+ gem 'rubocop'
9
+ gem 'simplecov'
10
+ gem 'codeclimate-test-reporter'
11
+ end
data/README.md CHANGED
@@ -1,4 +1,7 @@
1
1
  # Svent
2
+ [![Gem Version](https://badge.fury.io/rb/svent.svg)](http://badge.fury.io/rb/svent)
3
+ [![Build Status](https://travis-ci.org/molingyu/svent.svg?branch=master)](https://travis-ci.org/molingyu/svent)
4
+ [![Code Climate](https://codeclimate.com/github/molingyu/svent/badges/gpa.svg)](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/[USERNAME]/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.
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 "bundler/gem_tasks"
2
- task :default => :spec
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 :type
11
+ attr_reader :info
12
12
 
13
- def initialize(name, type)
13
+ def initialize(name, info)
14
14
  @list = []
15
15
  @name = name
16
- @type = type
16
+ @info = info
17
17
  end
18
18
 
19
19
  def reverse
20
- event = Event.new(@name, @type)
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(event_manger, name, callback, info)
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(event_manger, info)
17
+ @callback.call(helper, info)
18
18
  @fiber = nil
19
19
  end
20
+ # self.resume
20
21
  @return = nil
21
22
  end
22
23
 
@@ -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
- @timers = {}
19
- @counters = {}
20
- @timer_filters = {}
21
- @counter_filters = {}
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
- @event_callback_fibers.each do |obj|
27
- next @event_callback_fibers.delete(obj) unless obj.alive?
28
- @this = obj
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
- @this = nil
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(self, name, callback, info)) } if event
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, type = nil, index = nil, &callback)
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, type)
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 stop
57
- trigger(:event_manger_stop)
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 delete_after
70
- delete
71
- Fiber.yield true
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 ok?(&block)
75
- loop do
76
- break if block.call
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
@@ -1,3 +1,3 @@
1
1
  module Svent
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/svent.gemspec CHANGED
@@ -23,4 +23,5 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  spec.add_development_dependency "bundler", "~> 1.13"
25
25
  spec.add_development_dependency "rake", "~> 10.0"
26
+
26
27
  end
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.1.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-10-20 00:00:00.000000000 Z
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