ma 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c9303572209230462f38bd6ca4f63647ac5328e4c77e2afe31dfc0be4ebc9242
4
+ data.tar.gz: 1dae14d77b90a8ebd3bc5a68bc7cd6975eb515a1bced1ca06e3bd73acb7918b2
5
+ SHA512:
6
+ metadata.gz: 3f8438244784956e01bae108f113e3bb92d171d5c6a6119cdf25102c38cc4d2604a4d52f0495a606bd52bb70c52a3b6b84cf57aa9d19009b70de516c77cd1192
7
+ data.tar.gz: f2aca1653e51db2e13845f60d44986e871bf858457520639b2b3330cbb01df3546caf70602e023a4975694c376b913fad25cc92dd3d22e985b02a62d3739d804
Binary file
Binary file
@@ -0,0 +1,17 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+ .byebug_history
13
+ .pry_history
14
+
15
+ TODO
16
+
17
+ Gemfile.lock
@@ -0,0 +1,14 @@
1
+ image: "ruby:2.6"
2
+
3
+ cache:
4
+ paths:
5
+ - vendor/ruby
6
+
7
+ before_script:
8
+ - ruby -v
9
+ - gem install bundler
10
+ - bundle install -j $(nproc) --path vendor
11
+
12
+ rspec:
13
+ script:
14
+ - bundle exec rspec spec
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1 @@
1
+ 2.6
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.5.5
7
+ before_install: gem install bundler -v 2.0.2
@@ -0,0 +1,14 @@
1
+ # CHANGELOG
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.0]
11
+
12
+ - Added: Ability for an object to publish events
13
+ - Added: Ability for an object to subscribe to events
14
+ - Added: Ability for subscriber to handle events async
@@ -0,0 +1,74 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ In the interest of fostering an open and welcoming environment, we as
6
+ contributors and maintainers pledge to making participation in our project and
7
+ our community a harassment-free experience for everyone, regardless of age, body
8
+ size, disability, ethnicity, gender identity and expression, level of experience,
9
+ nationality, personal appearance, race, religion, or sexual identity and
10
+ orientation.
11
+
12
+ ## Our Standards
13
+
14
+ Examples of behavior that contributes to creating a positive environment
15
+ include:
16
+
17
+ * Using welcoming and inclusive language
18
+ * Being respectful of differing viewpoints and experiences
19
+ * Gracefully accepting constructive criticism
20
+ * Focusing on what is best for the community
21
+ * Showing empathy towards other community members
22
+
23
+ Examples of unacceptable behavior by participants include:
24
+
25
+ * The use of sexualized language or imagery and unwelcome sexual attention or
26
+ advances
27
+ * Trolling, insulting/derogatory comments, and personal or political attacks
28
+ * Public or private harassment
29
+ * Publishing others' private information, such as a physical or electronic
30
+ address, without explicit permission
31
+ * Other conduct which could reasonably be considered inappropriate in a
32
+ professional setting
33
+
34
+ ## Our Responsibilities
35
+
36
+ Project maintainers are responsible for clarifying the standards of acceptable
37
+ behavior and are expected to take appropriate and fair corrective action in
38
+ response to any instances of unacceptable behavior.
39
+
40
+ Project maintainers have the right and responsibility to remove, edit, or
41
+ reject comments, commits, code, wiki edits, issues, and other contributions
42
+ that are not aligned to this Code of Conduct, or to ban temporarily or
43
+ permanently any contributor for other behaviors that they deem inappropriate,
44
+ threatening, offensive, or harmful.
45
+
46
+ ## Scope
47
+
48
+ This Code of Conduct applies both within project spaces and in public spaces
49
+ when an individual is representing the project or its community. Examples of
50
+ representing a project or community include using an official project e-mail
51
+ address, posting via an official social media account, or acting as an appointed
52
+ representative at an online or offline event. Representation of a project may be
53
+ further defined and clarified by project maintainers.
54
+
55
+ ## Enforcement
56
+
57
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
+ reported by contacting the project team at kris.leech@gmail.com. All
59
+ complaints will be reviewed and investigated and will result in a response that
60
+ is deemed necessary and appropriate to the circumstances. The project team is
61
+ obligated to maintain confidentiality with regard to the reporter of an incident.
62
+ Further details of specific enforcement policies may be posted separately.
63
+
64
+ Project maintainers who do not follow or enforce the Code of Conduct in good
65
+ faith may face temporary or permanent repercussions as determined by other
66
+ members of the project's leadership.
67
+
68
+ ## Attribution
69
+
70
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
+ available at [http://contributor-covenant.org/version/1/4][version]
72
+
73
+ [homepage]: http://contributor-covenant.org
74
+ [version]: http://contributor-covenant.org/version/1/4/
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in ma.gemspec
4
+ gemspec
5
+
6
+ gem 'bundler'
7
+ gem 'rspec'
8
+ gem 'rake'
9
+ gem 'pry-byebug'
10
+
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2019 Kris Leech
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,114 @@
1
+ # Ma 間
2
+
3
+ > Ma (間) is a Japanese word which can be roughly translated as "gap", "space", "pause" or "the space between two structural parts."
4
+
5
+ ## Usage
6
+
7
+ ```ruby
8
+ class MyEvent < Ma::Event
9
+ end
10
+
11
+ class MyPublisher
12
+ include Ma.publisher
13
+
14
+ def call
15
+ # ...
16
+ broadcast(MyEvent.new(user: user))
17
+ end
18
+ end
19
+
20
+ class MyListener
21
+ include Ma.subscriber
22
+
23
+ on(MyEvent) do |event|
24
+ # ...
25
+ end
26
+ end
27
+
28
+ publisher = MyPublisher.new
29
+ publisher.subscribe(MyListener.new)
30
+ publisher.call
31
+ ```
32
+
33
+ #### Handling Events Asynchronously
34
+
35
+ Ma is build on top of [WisperNext](https://gitlab.com/kris.leech/wisper_next)
36
+ and as such can take advantage of the [async adapters](https://gitlab.com/kris.leech/wisper_next#handling-events-asynchronously).
37
+
38
+ Configure an adapter and then pass `:async` as such:
39
+
40
+ ```ruby
41
+ class MyListener
42
+ include Ma.subscriber(:async)
43
+ end
44
+ ```
45
+
46
+ ### Event class
47
+
48
+ The event can be any object which is:
49
+
50
+ * initialized with a `Hash` of attributes
51
+ * responds to `#to_h` returning a `Hash`
52
+
53
+ We provide a simple Struct-like event object, `Ma::Event`, but would recommend using some
54
+ thing like [dry-struct](https://dry-rb.org/gems/dry-struct/1.0/) to define an
55
+ event schema.
56
+
57
+ A useful constraint, if you are using asynchronous listeners, is that
58
+ dry-struct only supports primative types like `String`, `Integer`, `Hash` and
59
+ `Array, which are easily serialized for transport over the wire to a background
60
+ worker.
61
+
62
+ #### Enhancing Events
63
+
64
+ You can add additional information to the payload by either overriding the
65
+ `#initialize` method:
66
+
67
+ ```ruby
68
+ class MyEvent < Ma::Event
69
+ def initialize(attrs)
70
+ super({ timestamp: Time.now.to_i }.merge(atrs))
71
+ end
72
+ end
73
+ ```
74
+
75
+ ## Installation
76
+
77
+ ```ruby
78
+ gem 'ma'
79
+ ```
80
+
81
+ ## Security
82
+
83
+ * gem releases are [signed]()
84
+ * commits are GPG [signed]()
85
+
86
+ ## Development
87
+
88
+ ### Specs
89
+
90
+ Run the specs:
91
+
92
+ ```
93
+ rspec
94
+ ```
95
+
96
+ Runs the specs on file change:
97
+
98
+ ```
99
+ ls ./**/*.rb | entr -c rspec
100
+ ```
101
+
102
+ ## Contributing
103
+
104
+ Bug reports and pull requests are welcome on Gitlab at https://gitlab.com/kris.leech/ma.
105
+
106
+ 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.
107
+
108
+ ## License
109
+
110
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
111
+
112
+ ## Code of Conduct
113
+
114
+ Everyone interacting in the Ma project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://gitlab.com/kris.leech/ma/CODE_OF_CONDUCT.md).
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "ma"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,20 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDQDCCAiigAwIBAgIBATANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBprcmlz
3
+ LmxlZWNoL0RDPWdtYWlsL0RDPWNvbTAeFw0xOTEwMTYxNDEzNDVaFw0yMDEwMTUx
4
+ NDEzNDVaMCUxIzAhBgNVBAMMGmtyaXMubGVlY2gvREM9Z21haWwvREM9Y29tMIIB
5
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8gg/iZE6RFkl6GjisJJf9wQl
6
+ 5Tog+mrGqtylNpe9QKeyQS1fKLNR3Cqmv6sT3f3GlU8hhG+802MXmlJo7VyENs+s
7
+ HdMy85fBnYwhS/szhTzBqduXw43RAAGqB0VaHAoHdufTZBkmFSXET5c0/jUqQrPL
8
+ Zxsm2i0NV8cVpvrZlQcsW4Kf97DG1ZFNncS0IfCDqnluh21qMSgVAuiKHGoVKCYG
9
+ Igey486VuuJ8j6axwW3ii8HoBOxjF8Ka/rJ/t4sB9Ql/p6RHR4RhxP5xIS9geCpI
10
+ dsPGnCSleTW1EnXGHLdOdJpVmJXueYJEQJ1Rh/rR+9PeqAT3RA0D/dxSGIVtrQID
11
+ AQABo3sweTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUyupX2gb3
12
+ +isBRwf4/fhgLnh02sYwHwYDVR0RBBgwFoEUa3Jpcy5sZWVjaEBnbWFpbC5jb20w
13
+ HwYDVR0SBBgwFoEUa3Jpcy5sZWVjaEBnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
14
+ ggEBAExirH+Py0Wm8+ZzNnx/oyFXSF7V9FClYhPUXwQ5FmvQG+gXRlonO9IR/HL+
15
+ wGJNFh4B19fpughgQeJKjKJsG2zk2XnSK2yQyyNGdr/9dHXp/TS5sGvX9jFYVeAr
16
+ 0XCWXRBK+IfEqNnbFvPkwZEK62WLnrL50gMs3u2ILmLP5gkO3EoLyezJvIj33CLO
17
+ HX0Plp0VwiSp8+gEELX5wtdrnJ/UjmrY1lg7szukE+jgOJ++1e7Rzr+woBewIWvF
18
+ xn3z1ObkNQCnLZMRmzEcSa40T10/AuuuEv32emAgb50u9vz+s4y2lnE9i4mWW7+X
19
+ 5vdRgX7VnzYPA+Lc39kD+AcGIrQ=
20
+ -----END CERTIFICATE-----
@@ -0,0 +1,81 @@
1
+ -----BEGIN PGP PUBLIC KEY BLOCK-----
2
+
3
+ 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
80
+ =reHQ
81
+ -----END PGP PUBLIC KEY BLOCK-----
@@ -0,0 +1,12 @@
1
+ require "ma/version"
2
+ require "ma/publisher"
3
+ require "ma/subscriber"
4
+ require "ma/event"
5
+
6
+ module Ma
7
+ class Error < StandardError; end
8
+
9
+ def self.subscriber(*args)
10
+ Subscriber.new(*args)
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ require 'ostruct'
2
+
3
+ module Ma
4
+ class Event < OpenStruct
5
+ def initialize(*args)
6
+ super
7
+ freeze
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,17 @@
1
+ require 'wisper_next'
2
+
3
+ module Ma
4
+ module Publisher
5
+ module Overrides
6
+ def broadcast(event)
7
+ name = event.class.name
8
+ super(name, event.to_h)
9
+ end
10
+ end
11
+
12
+ def self.included(base)
13
+ base.include(WisperNext.publisher)
14
+ base.include(Overrides)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ require 'wisper_next'
2
+
3
+ module Ma
4
+ class Subscriber < Module
5
+
6
+ def initialize(*args)
7
+ @options = WisperNext::CastToOptions.(args)
8
+ end
9
+
10
+ def included(base)
11
+ base.extend(ClassMethods)
12
+ base.include(WisperNext.subscriber(@options.slice(:async)))
13
+ super
14
+ end
15
+
16
+ module ClassMethods
17
+ def on(event_class, &block)
18
+ define_method event_class.name do |payload|
19
+ instance_exec(event_class.new(payload), &block)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,3 @@
1
+ module Ma
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,36 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "ma/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "ma"
7
+ spec.version = Ma::VERSION
8
+ spec.authors = ["Kris Leech"]
9
+ spec.email = ["kris.leech@gmail.com"]
10
+
11
+ spec.summary = "Event Driven Ruby"
12
+ spec.description = "Event Driven Ruby"
13
+ spec.homepage = "https://gitlab.com/kris.leech/ma"
14
+ spec.license = "MIT"
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = spec.homepage
18
+ spec.metadata["changelog_uri"] = "https://gitlab.com/kris.leech/ma/blob/master/CHANGELOG.md"
19
+
20
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
21
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
22
+ end
23
+
24
+ spec.bindir = "exe"
25
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
+ spec.require_paths = ["lib"]
27
+
28
+ spec.add_runtime_dependency 'wisper_next'
29
+
30
+ signing_key = File.expand_path(ENV['HOME'].to_s + '/.ssh/gem-private_key.pem')
31
+
32
+ if File.exist?(signing_key)
33
+ spec.signing_key = signing_key
34
+ spec.cert_chain = ['keys/gem-public_cert.pem']
35
+ end
36
+ end
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ma
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Kris Leech
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDQDCCAiigAwIBAgIBATANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBprcmlz
14
+ LmxlZWNoL0RDPWdtYWlsL0RDPWNvbTAeFw0xOTEwMTYxNDEzNDVaFw0yMDEwMTUx
15
+ NDEzNDVaMCUxIzAhBgNVBAMMGmtyaXMubGVlY2gvREM9Z21haWwvREM9Y29tMIIB
16
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8gg/iZE6RFkl6GjisJJf9wQl
17
+ 5Tog+mrGqtylNpe9QKeyQS1fKLNR3Cqmv6sT3f3GlU8hhG+802MXmlJo7VyENs+s
18
+ HdMy85fBnYwhS/szhTzBqduXw43RAAGqB0VaHAoHdufTZBkmFSXET5c0/jUqQrPL
19
+ Zxsm2i0NV8cVpvrZlQcsW4Kf97DG1ZFNncS0IfCDqnluh21qMSgVAuiKHGoVKCYG
20
+ Igey486VuuJ8j6axwW3ii8HoBOxjF8Ka/rJ/t4sB9Ql/p6RHR4RhxP5xIS9geCpI
21
+ dsPGnCSleTW1EnXGHLdOdJpVmJXueYJEQJ1Rh/rR+9PeqAT3RA0D/dxSGIVtrQID
22
+ AQABo3sweTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUyupX2gb3
23
+ +isBRwf4/fhgLnh02sYwHwYDVR0RBBgwFoEUa3Jpcy5sZWVjaEBnbWFpbC5jb20w
24
+ HwYDVR0SBBgwFoEUa3Jpcy5sZWVjaEBnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
25
+ ggEBAExirH+Py0Wm8+ZzNnx/oyFXSF7V9FClYhPUXwQ5FmvQG+gXRlonO9IR/HL+
26
+ wGJNFh4B19fpughgQeJKjKJsG2zk2XnSK2yQyyNGdr/9dHXp/TS5sGvX9jFYVeAr
27
+ 0XCWXRBK+IfEqNnbFvPkwZEK62WLnrL50gMs3u2ILmLP5gkO3EoLyezJvIj33CLO
28
+ HX0Plp0VwiSp8+gEELX5wtdrnJ/UjmrY1lg7szukE+jgOJ++1e7Rzr+woBewIWvF
29
+ xn3z1ObkNQCnLZMRmzEcSa40T10/AuuuEv32emAgb50u9vz+s4y2lnE9i4mWW7+X
30
+ 5vdRgX7VnzYPA+Lc39kD+AcGIrQ=
31
+ -----END CERTIFICATE-----
32
+ date: 2019-11-01 00:00:00.000000000 Z
33
+ dependencies:
34
+ - !ruby/object:Gem::Dependency
35
+ name: wisper_next
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ type: :runtime
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ description: Event Driven Ruby
49
+ email:
50
+ - kris.leech@gmail.com
51
+ executables: []
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - ".gitignore"
56
+ - ".gitlab-ci.yml"
57
+ - ".rspec"
58
+ - ".ruby-version"
59
+ - ".travis.yml"
60
+ - CHANGELOG.md
61
+ - CODE_OF_CONDUCT.md
62
+ - Gemfile
63
+ - LICENSE.txt
64
+ - README.md
65
+ - Rakefile
66
+ - bin/console
67
+ - bin/setup
68
+ - keys/gem-public_cert.pem
69
+ - keys/kris.leech.gpg.public
70
+ - lib/ma.rb
71
+ - lib/ma/event.rb
72
+ - lib/ma/publisher.rb
73
+ - lib/ma/subscriber.rb
74
+ - lib/ma/version.rb
75
+ - ma.gemspec
76
+ homepage: https://gitlab.com/kris.leech/ma
77
+ licenses:
78
+ - MIT
79
+ metadata:
80
+ homepage_uri: https://gitlab.com/kris.leech/ma
81
+ source_code_uri: https://gitlab.com/kris.leech/ma
82
+ changelog_uri: https://gitlab.com/kris.leech/ma/blob/master/CHANGELOG.md
83
+ post_install_message:
84
+ rdoc_options: []
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ requirements: []
98
+ rubygems_version: 3.0.6
99
+ signing_key:
100
+ specification_version: 4
101
+ summary: Event Driven Ruby
102
+ test_files: []
Binary file