service 1.0.1 → 2.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 014411ad19101419e3294a47ab2ffaa3413ab578
4
+ data.tar.gz: 065676ea6aa57f1ea4a4597a2accd4aab16e9a1d
5
+ SHA512:
6
+ metadata.gz: 8b0f6ae156be43fd61794402b4b816e181aa16a7f1a84f55f37b562d7f187f9560d832287ae802c3a7b021bfe05f9342d123e6513fbf0506c96214efc4b8ea1b
7
+ data.tar.gz: 05cd10eb30527a7b4131d2c5126c3e63d4844e1815d8db2f50b003d224c70f5379a0c443089823610ae40c00e5e99dd3538c67571011e95374463f3a2f981870
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012 Ryan Scott Lewis <ryan@rynet.us>.
1
+ Copyright (c) 2012 Ryan Scott Lewis <ryanscottlewis@gmail.com>.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,9 +1,7 @@
1
1
  # Service
2
2
 
3
- __serv·ice__ _noun_ _/ˈsɜr vɪs/_ __:__ The action of helping or doing work for someone.
4
-
5
- Service encapsulates an object which executes a bit of code in a loop that can be started or
6
- stopped and query whether it is running or not.
3
+ Service encapsulates an object which executes a bit of code in a loop that can be started or stopped and query whether
4
+ it is running or not.
7
5
 
8
6
  ## Install
9
7
 
@@ -13,52 +11,65 @@ stopped and query whether it is running or not.
13
11
 
14
12
  ## Usage
15
13
 
14
+ > See the `examples/` directory for more usage examples.
15
+
16
+ ### Requiring
17
+
18
+ Class/Module | File
19
+ -----------------|--------------------------
20
+ `Service` | `service`
21
+ `Service::Base` | `service/base`
22
+
16
23
  ### Defining
17
24
 
18
- You can define an Object as a Service by subclassing `Service` or by including/extending
19
- `Service::Base`.
25
+ You can define an Object as a Service by subclassing `Service` or by including `Service::Base`:
20
26
 
21
27
  ```ruby
22
28
  class ServiceA < Service
23
29
  end
24
30
 
25
31
  class ServiceB
32
+
26
33
  include Service::Base
27
- end
28
34
 
29
- class ServiceC
30
- extend Service::Base
31
35
  end
32
36
  ```
33
37
 
34
- A `Service` object stores it's state in the `@_service_state` instance variable as to be as
35
- unobtrusive as possible when integrating with your custom objects.
38
+ > A `Service` object stores it's state in the `@_service_state` instance variable as to be as unobtrusive as possible
39
+ > when integrating with your custom objects.
36
40
 
37
- The next thing to do is define a `execute` instance method on your object:
41
+ The next thing to do is to define an `#execute` instance method on your object:
38
42
 
39
43
  ```ruby
40
44
  class MyService < Service
45
+
41
46
  def execute
42
47
  # ...
43
48
  end
49
+
44
50
  end
45
51
  ```
46
52
 
47
53
  ### Running
48
54
 
49
- Service gives simply allows you to run your code that is within the `execute` method in four different ways:
50
- once (`execute`), once in a new Thread (`execute!`), in a loop (`start`/`run`), or in a loop within a
51
- new Thread (`start!`/`run!`)
55
+ Service simply allows you to run your code that is within the `#execute` instance method in four different ways:
56
+
57
+ * Once (`#execute`)
58
+ * Once, within a new Thread (`#execute!`)
59
+ * Looping (`#start`/`#run`)
60
+ * Looping, within a new Thread (`#start!`/`#run!`)
52
61
 
53
62
  ***
54
63
 
55
- Use the `start`/`run` instance method to call the `execute` instance method in a loop.
64
+ Use the `#start`/`#run` instance method to call the `#execute` instance method in a loop.
56
65
 
57
66
  ```ruby
58
67
  class MyService < Service
68
+
59
69
  def execute
60
70
  puts "Hello"
61
71
  end
72
+
62
73
  end
63
74
 
64
75
  MyService.new.run
@@ -67,13 +78,15 @@ MyService.new.run
67
78
  # => ...
68
79
  ```
69
80
 
70
- Use `start!`/`run!` to call the `run` in a new Thread.
81
+ Use `#start!`/`#run!` to call the `#execute` instance method in a new Thread.
71
82
 
72
83
  ```ruby
73
84
  class MyService < Service
85
+
74
86
  def execute
75
87
  puts "Hello"
76
88
  end
89
+
77
90
  end
78
91
 
79
92
  thread = MyService.new.run!
@@ -85,88 +98,58 @@ thread.join
85
98
 
86
99
  ### Stopping
87
100
 
88
- Use the `stop` instance method break the run loop.
89
- This will also kill the Thread it is running in, if running in a Thread.
101
+ Use the `#stop` instance method break the run loop.
102
+ This will also kill the Thread it is running in, if running within a Thread.
90
103
 
91
104
  ```ruby
92
- class MyService < Service
105
+ class CountingService < Service
106
+
107
+ def initialize
108
+ @count = 0
109
+ end
110
+
93
111
  def execute
94
- sleep 3
95
- stop
112
+ puts @count
113
+ sleep 1
114
+
115
+ @count += 1
96
116
  end
117
+
97
118
  end
98
119
 
99
- print "Running MyService in a new Thread... "
100
- thread = MyService.new.run!
101
- thread.join
102
- puts "Done!"
120
+ service = CountingService.new
121
+
122
+ service.run! # Run the #execute method in a loop within a new Thread
123
+ sleep 5
124
+ service.stop
103
125
  ```
104
126
 
105
127
  ### Querying State
106
128
 
107
- Use the `started?`/`running?` or `stopped?` instance methods to determine the current state of
129
+ Use the `started?`/`running?` or `stopped?` instance methods to determine the current state of
108
130
  the Service instance.
109
131
 
110
132
  ```ruby
111
133
  class MyService < Service
134
+
112
135
  def execute
113
136
  sleep 10
114
137
  end
138
+
115
139
  end
116
140
 
117
141
  service = MyService.new
142
+
118
143
  p service.running? # => false
144
+
119
145
  service.run!
120
146
  sleep 1
121
- p service.running? # => true
122
- ```
123
-
124
- ## Example
125
-
126
- ```ruby
127
- require 'service'
128
-
129
- class PingService < Service
130
- def execute
131
- sleep rand(5)
132
- print 'ping'
133
- stop
134
- end
135
- end
136
147
 
137
- class PongService
138
- include Service::Base
139
-
140
- def execute
141
- sleep rand(5)
142
- print 'pong'
143
- stop
144
- end
145
- end
146
-
147
- class ExcitementService
148
- extend Service::Base
149
-
150
- def execute
151
- sleep rand(5)
152
- print '!'
153
- stop
154
- end
155
- end
156
-
157
- threads = []
158
- threads << PingService.new.run!
159
- threads << PongService.new.run!
160
- threads << ExcitementService.new.run!
161
-
162
- threads.each(&:join)
148
+ p service.running? # => true
163
149
  ```
164
150
 
165
151
  ## Copyright
166
152
 
167
- Copyright © 2012 Ryan Scott Lewis <ryan@rynet.us>.
153
+ Copyright © 2012 Ryan Scott Lewis <ryanscottlewis@gmail.com>.
168
154
 
169
155
  The MIT License (MIT) - See LICENSE for further details.
170
-
171
- [message_queue]: http://en.wikipedia.org/wiki/Message_queue
172
- [queue]: http://rubydoc.info/stdlib/thread/Queue
data/Rakefile CHANGED
@@ -1,51 +1,9 @@
1
- require 'pathname'
1
+ spec = eval(File.read('service.gemspec'))
2
2
 
3
- def require_task(path)
4
- begin
5
- require path
6
-
7
- yield
8
- rescue LoadError
9
- puts '', "Could not load '#{path}'.", 'Try to `rake gem:spec` and `bundle install` and try again.', ''
10
- end
11
- end
12
-
13
- spec = Gem::Specification.new do |s|
14
-
15
- # Variables
16
- s.name = 'service'
17
- s.author = 'Ryan Scott Lewis'
18
- s.email = 'ryan@rynet.us'
19
- s.summary = 'A basic implementation of a Service, which has a run loop can be start and stopped or run an a new Thread.'
20
- s.description = 'Service encapsulates an object which executes a bit of code in a loop that can be started or stopped and query whether it is running or not.'
21
-
22
- # Dependencies
23
- s.add_dependency 'version', '~> 1.0'
24
- s.add_development_dependency 'rake', '~> 10.0'
25
- s.add_development_dependency 'guard-yard', '~> 2.0'
26
- s.add_development_dependency 'rb-fsevent', '~> 0.9'
27
- s.add_development_dependency 'redcarpet', '~> 2.2.2'
28
- s.add_development_dependency 'github-markup', '~> 0.7'
29
-
30
- # Pragmatically set variables
31
- s.homepage = "http://github.com/RyanScottLewis/#{s.name}"
32
- s.version = Pathname.glob('VERSION*').first.read
33
- s.require_paths = ['lib']
34
- s.files = `git ls-files`.lines.to_a.collect { |s| s.strip }
35
- s.executables = `git ls-files -- bin/*`.lines.to_a.collect { |s| File.basename(s.strip) }
36
-
37
- end
38
-
39
- desc 'Generate the gemspec defined in this Rakefile'
40
- task :gemspec do
41
- Pathname.new("#{spec.name}.gemspec").open('w') { |f| f.write(spec.to_ruby) }
42
- end
43
-
44
- require_task 'rake/version_task' do
45
- Rake::VersionTask.new do |t|
46
- t.with_git_tag = true
47
- t.with_gemspec = spec
48
- end
3
+ require 'rake/version_task'
4
+ Rake::VersionTask.new do |t|
5
+ t.with_git_tag = true
6
+ t.with_gemspec = spec
49
7
  end
50
8
 
51
9
  require 'rubygems/package_task'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.1
1
+ 2.0.0
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file was generated by Bundler.
5
+ #
6
+ # The application 'rake' is installed as part of a gem, and
7
+ # this file is here to facilitate running it.
8
+ #
9
+
10
+ require "pathname"
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
12
+ Pathname.new(__FILE__).realpath)
13
+
14
+ require "rubygems"
15
+ require "bundler/setup"
16
+
17
+ load Gem.bin_path("rake", "rake")
@@ -0,0 +1,51 @@
1
+ require 'service'
2
+
3
+ # Generates the string "ping pong" asynchronously.
4
+ # Calls to `sleep 5` simulate computationally intensive work.
5
+ #
6
+ # Example of using the `#execute!` to execute a service in a new Thread.
7
+ # Should take ~5s (instead of ~10s)
8
+
9
+ class BaseService < Service
10
+
11
+ def initialize(buffer)
12
+ @buffer = buffer
13
+ end
14
+
15
+ end
16
+
17
+ class PingService < BaseService
18
+
19
+ def execute
20
+ sleep 5
21
+
22
+ @buffer[0] = 'ping'
23
+ end
24
+
25
+ end
26
+
27
+ class PongService < BaseService
28
+
29
+ def execute
30
+ sleep 5
31
+
32
+ @buffer[1] = 'pong'
33
+ end
34
+
35
+ end
36
+
37
+
38
+ buffer = []
39
+ threads = []
40
+
41
+ started_at = Time.now
42
+
43
+ threads << PingService.new(buffer).execute!
44
+ threads << PongService.new(buffer).execute!
45
+
46
+ threads.each(&:join)
47
+
48
+ result = buffer.join
49
+
50
+ puts "Done: '#{result}'"
51
+ puts "Took #{Time.now - started_at}s"
@@ -0,0 +1,49 @@
1
+ require 'service'
2
+ # require 'thread' # For the Queue class
3
+
4
+ # Running two services which transfer data to each other in a thread-safe manner.
5
+ #
6
+ # Example of using the `#run!` to execute a service's run loop in a new Thread.
7
+
8
+ class BaseService < Service
9
+
10
+ def initialize(queue)
11
+ @queue = queue
12
+ end
13
+
14
+ end
15
+
16
+ # A service which counts infinitely, adding each number to the queue.
17
+ class CountService < BaseService
18
+
19
+ def initialize(queue)
20
+ super
21
+
22
+ @count = 0
23
+ end
24
+
25
+ def execute
26
+ sleep rand(2) # Simulate computationally intensive work
27
+ @queue << @count # Add the current count to the queue
28
+ @count += 1 # Increment the count
29
+ end
30
+
31
+ end
32
+
33
+ # A service which pops all values off each value and prints it each cycle
34
+ class ReportService < BaseService
35
+
36
+ def execute
37
+ sleep 1 # Wait for a bit, to allow the queue to populate
38
+ puts(@queue.pop) until @queue.empty? # Until the queue is empty, pop a value off the queue and print it
39
+ end
40
+
41
+ end
42
+
43
+ threads = []
44
+ queue = Queue.new
45
+
46
+ threads << CountService.new(queue).run!
47
+ threads << ReportService.new(queue).run!
48
+
49
+ threads.each(&:join)
@@ -1,88 +1,74 @@
1
- require 'version'
2
-
3
- # Service encapsulates an object which executes a bit of code in a loop
4
- # that can be started or stopped and query whether it is running or not.
5
- #
6
- # Objects can subclass Service.
1
+ # Service encapsulates an object which executes a bit of code in a loop that can be started or stopped and query whether
2
+ # it is running or not.
7
3
  class Service
8
- is_versioned
9
-
10
- # The Base module for Services.
11
- # Objects can include or extend Service::Base.
4
+
5
+ VERSION = "2.0.0".freeze
6
+
7
+ # The instance methods to be mixed into a Service.
12
8
  module Base
13
-
14
- # The instance methods to be mixed into modules which include/extend Service::Base.
15
- module InstanceMethods
16
-
17
- # Query if the service is currently stopped.
18
- #
19
- # @returns [true, false]
20
- def stopped?
21
- @_service_state == :stopped
22
- end
23
-
24
- # Query if the service is currently started.
25
- #
26
- # @returns [true, false]
27
- def started?
28
- @_service_state == :started
29
- end
30
- alias_method :running?, :started?
31
-
32
- # The code that will be executed within the run loop.
33
- # @abstract Subclass and override {#run} to implement a custom Service.
34
- def execute
35
- raise NotImplementedError
36
- end
37
-
38
- # Call the {#execute} method within a new Thread.
39
- #
40
- # @return [Thread]
41
- def execute!
42
- Thread.new { execute }
43
- end
44
-
45
- # Stop the run loop.
46
- def stop
47
- @_service_state = :stopped
48
- end
49
-
50
- # Start the run loop.
51
- def start
52
- @_service_state = :started
53
- loop do
54
- break if stopped?
55
- execute
56
- end
57
- end
58
- alias_method :run, :start
59
-
60
- # Start the run loop in a new Thread.
61
- #
62
- # @return [Thread]
63
- def start!
64
- Thread.new { start }
65
- end
66
- alias_method :run!, :start!
67
-
9
+
10
+ # Query if the service is currently stopped.
11
+ #
12
+ # @return [Boolean]
13
+ def stopped?
14
+ @_service_state == :stopped
68
15
  end
69
-
70
- class << self
71
-
72
- # Include Service::Base::InstanceMethods when Service::Base is included.
73
- def included(base)
74
- base.send(:include, InstanceMethods)
75
- end
76
-
77
- # Include Service::Base::InstanceMethods when Service::Base is extended.
78
- def extended(base)
79
- base.send(:include, InstanceMethods)
16
+
17
+ # Query if the service is currently started.
18
+ #
19
+ # @return [Boolean]
20
+ def started?
21
+ @_service_state == :started
22
+ end
23
+ alias_method :running?, :started?
24
+
25
+ # The code that will be executed within the run loop.
26
+ #
27
+ # @abstract Override {#execute} to implement a custom Service.
28
+ def execute
29
+ raise NotImplementedError
30
+ end
31
+
32
+ # Call the {#execute} method within a new Thread.
33
+ #
34
+ # @return [Thread]
35
+ def execute!
36
+ Thread.new { execute }
37
+ end
38
+
39
+ # Stop the run loop.
40
+ #
41
+ # @return [Symbol] The current state (`:stopped`).
42
+ def stop
43
+ @_service_state = :stopped
44
+ end
45
+
46
+ # Start the run loop.
47
+ #
48
+ # @return [Symbol] The current state (`:started`).
49
+ def start
50
+ @_service_state = :started
51
+
52
+ loop do
53
+ break if stopped?
54
+
55
+ execute
80
56
  end
81
-
82
57
  end
83
-
58
+
59
+ alias_method :run, :start
60
+
61
+ # Start the run loop in a new Thread.
62
+ #
63
+ # @return [Thread]
64
+ def start!
65
+ Thread.new { start }
66
+ end
67
+
68
+ alias_method :run!, :start!
69
+
84
70
  end
85
-
71
+
86
72
  include Base
87
-
73
+
88
74
  end
@@ -1,44 +1,19 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
1
  Gem::Specification.new do |s|
4
- s.name = "service"
5
- s.version = "1.0.1"
6
-
7
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["Ryan Scott Lewis"]
9
- s.date = "2012-12-16"
10
- s.description = "Service encapsulates an object which executes a bit of code in a loop that can be started or stopped and query whether it is running or not."
11
- s.email = "ryan@rynet.us"
12
- s.files = ["Gemfile", "LICENSE", "README.md", "Rakefile", "VERSION", "lib/service.rb", "service.gemspec"]
13
- s.homepage = "http://github.com/RyanScottLewis/service"
14
- s.require_paths = ["lib"]
15
- s.rubygems_version = "1.8.24"
16
- s.summary = "A basic implementation of a Service, which has a run loop can be start and stopped or run an a new Thread."
2
+ # Variables
3
+ s.name = 'service'
4
+ s.author = 'Ryan Scott Lewis'
5
+ s.email = 'ryanscottlewis@gmail.com'
6
+ s.summary = 'A basic implementation of a Service, which has a run loop can be start and stopped or run an a new Thread.'
7
+ s.description = 'Service encapsulates an object which executes a bit of code in a loop that can be started or stopped and query whether it is running or not.'
17
8
 
18
- if s.respond_to? :specification_version then
19
- s.specification_version = 3
9
+ # Dependencies
10
+ s.add_development_dependency 'version', '~> 1.0'
11
+ s.add_development_dependency 'rake', '~> 10.0'
20
12
 
21
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
22
- s.add_runtime_dependency(%q<version>, ["~> 1.0"])
23
- s.add_development_dependency(%q<rake>, ["~> 10.0"])
24
- s.add_development_dependency(%q<guard-yard>, ["~> 2.0"])
25
- s.add_development_dependency(%q<rb-fsevent>, ["~> 0.9"])
26
- s.add_development_dependency(%q<redcarpet>, ["~> 2.2.2"])
27
- s.add_development_dependency(%q<github-markup>, ["~> 0.7"])
28
- else
29
- s.add_dependency(%q<version>, ["~> 1.0"])
30
- s.add_dependency(%q<rake>, ["~> 10.0"])
31
- s.add_dependency(%q<guard-yard>, ["~> 2.0"])
32
- s.add_dependency(%q<rb-fsevent>, ["~> 0.9"])
33
- s.add_dependency(%q<redcarpet>, ["~> 2.2.2"])
34
- s.add_dependency(%q<github-markup>, ["~> 0.7"])
35
- end
36
- else
37
- s.add_dependency(%q<version>, ["~> 1.0"])
38
- s.add_dependency(%q<rake>, ["~> 10.0"])
39
- s.add_dependency(%q<guard-yard>, ["~> 2.0"])
40
- s.add_dependency(%q<rb-fsevent>, ["~> 0.9"])
41
- s.add_dependency(%q<redcarpet>, ["~> 2.2.2"])
42
- s.add_dependency(%q<github-markup>, ["~> 0.7"])
43
- end
13
+ # Pragmatically set variables
14
+ s.homepage = "http://github.com/RyanScottLewis/#{s.name}"
15
+ s.version = File.read('VERSION')
16
+ s.require_paths = ['lib']
17
+ s.files = `git ls-files`.lines.to_a.collect { |s| s.strip }
18
+ s.executables = `git ls-files -- bin/*`.lines.to_a.collect { |s| File.basename(s.strip) }
44
19
  end
metadata CHANGED
@@ -1,116 +1,48 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: service
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
5
- prerelease:
4
+ version: 2.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Ryan Scott Lewis
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-12-16 00:00:00.000000000 Z
11
+ date: 2018-01-16 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: version
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: '1.0'
22
- type: :runtime
20
+ type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: '1.0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
33
  version: '10.0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
40
  version: '10.0'
46
- - !ruby/object:Gem::Dependency
47
- name: guard-yard
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ~>
52
- - !ruby/object:Gem::Version
53
- version: '2.0'
54
- type: :development
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: '2.0'
62
- - !ruby/object:Gem::Dependency
63
- name: rb-fsevent
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ~>
68
- - !ruby/object:Gem::Version
69
- version: '0.9'
70
- type: :development
71
- prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ~>
76
- - !ruby/object:Gem::Version
77
- version: '0.9'
78
- - !ruby/object:Gem::Dependency
79
- name: redcarpet
80
- requirement: !ruby/object:Gem::Requirement
81
- none: false
82
- requirements:
83
- - - ~>
84
- - !ruby/object:Gem::Version
85
- version: 2.2.2
86
- type: :development
87
- prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ~>
92
- - !ruby/object:Gem::Version
93
- version: 2.2.2
94
- - !ruby/object:Gem::Dependency
95
- name: github-markup
96
- requirement: !ruby/object:Gem::Requirement
97
- none: false
98
- requirements:
99
- - - ~>
100
- - !ruby/object:Gem::Version
101
- version: '0.7'
102
- type: :development
103
- prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - ~>
108
- - !ruby/object:Gem::Version
109
- version: '0.7'
110
41
  description: Service encapsulates an object which executes a bit of code in a loop
111
42
  that can be started or stopped and query whether it is running or not.
112
- email: ryan@rynet.us
113
- executables: []
43
+ email: ryanscottlewis@gmail.com
44
+ executables:
45
+ - rake
114
46
  extensions: []
115
47
  extra_rdoc_files: []
116
48
  files:
@@ -119,34 +51,33 @@ files:
119
51
  - README.md
120
52
  - Rakefile
121
53
  - VERSION
54
+ - bin/rake
55
+ - examples/ping_pong.rb
56
+ - examples/queue.rb
122
57
  - lib/service.rb
123
58
  - service.gemspec
124
59
  homepage: http://github.com/RyanScottLewis/service
125
60
  licenses: []
61
+ metadata: {}
126
62
  post_install_message:
127
63
  rdoc_options: []
128
64
  require_paths:
129
65
  - lib
130
66
  required_ruby_version: !ruby/object:Gem::Requirement
131
- none: false
132
67
  requirements:
133
- - - ! '>='
68
+ - - ">="
134
69
  - !ruby/object:Gem::Version
135
70
  version: '0'
136
- segments:
137
- - 0
138
- hash: 900928583881142489
139
71
  required_rubygems_version: !ruby/object:Gem::Requirement
140
- none: false
141
72
  requirements:
142
- - - ! '>='
73
+ - - ">="
143
74
  - !ruby/object:Gem::Version
144
75
  version: '0'
145
76
  requirements: []
146
77
  rubyforge_project:
147
- rubygems_version: 1.8.24
78
+ rubygems_version: 2.6.11
148
79
  signing_key:
149
- specification_version: 3
80
+ specification_version: 4
150
81
  summary: A basic implementation of a Service, which has a run loop can be start and
151
82
  stopped or run an a new Thread.
152
83
  test_files: []