ragent 0.0.3 → 0.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c54facdd03c86d41e08adaefff99b8be83eb1ad2
4
- data.tar.gz: 4cb2e744e0485f77757183a8225c871bb45e8198
3
+ metadata.gz: 191cb56fece3b2f00ba49ecf91f182cfd9619958
4
+ data.tar.gz: da425f06681e2593c2193c7135ce94da2bb69098
5
5
  SHA512:
6
- metadata.gz: ed21e03c7ef32bf2ae6b79ad93bbbe86f45b9327f54adafaeec94b359cbece26925540266f9642d0783fbb6acc55fea89c9cc20e859668c17270401e99c3277a
7
- data.tar.gz: 0ffa16bf1b56db80bbb01b2ebaee3faa86539aefb72c0aed5ceaae76152718b763790bc63f724cc599c35e9efac16cb961eceb1278501a9e0aca6d485e44e166
6
+ metadata.gz: efc8b9d1d9b87ba3fd4d02b8dbada0b1d715e94c0b53cd7f2781ee28bcbe265dcf1548bdff67de3459597574868a6267a738063307ec7d34420b2350bddbf91d
7
+ data.tar.gz: eb2c4532db49eb0c22286e6bdcc5a690e9e32ed36d25d08adcbc967969c454532052cbd143b1c9c375dd2b2ba4034b5e1e8bbf72a5a2f66a2d1a032f8b4abb95
data/.rubocop.yml ADDED
@@ -0,0 +1,3 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.3
3
+
data/Gemfile CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  source 'https://rubygems.org'
2
3
 
3
- gemspec
4
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,9 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ragent (0.0.1)
4
+ ragent (0.0.4)
5
5
  celluloid (~> 0.17.0)
6
- logging (~> 2.1.0)
6
+ logging (~> 2.1)
7
+ thor (~> 0.19)
7
8
 
8
9
  GEM
9
10
  remote: https://rubygems.org/
@@ -46,6 +47,7 @@ GEM
46
47
  diff-lcs (>= 1.2.0, < 2.0)
47
48
  rspec-support (~> 3.5.0)
48
49
  rspec-support (3.5.0)
50
+ thor (0.19.4)
49
51
  timers (4.1.2)
50
52
  hitimes
51
53
 
@@ -59,4 +61,4 @@ DEPENDENCIES
59
61
  rspec (~> 3.0)
60
62
 
61
63
  BUNDLED WITH
62
- 1.13.7
64
+ 1.14.3
data/Rakefile CHANGED
@@ -1,6 +1,7 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ # frozen_string_literal: true
2
+ require 'bundler/gem_tasks'
3
+ require 'rspec/core/rake_task'
3
4
 
4
5
  RSpec::Core::RakeTask.new(:spec)
5
6
 
6
- task :default => :spec
7
+ task default: :spec
data/examples/Gemfile CHANGED
@@ -1,6 +1,5 @@
1
+ # frozen_string_literal: true
1
2
  source 'https://rubygems.org'
2
3
 
3
- gem 'ragent', path: "#{__dir__}/../"
4
4
  gem 'celluloid-io'
5
-
6
-
5
+ gem 'ragent', path: "#{__dir__}/../"
@@ -1,4 +1,4 @@
1
- Ragent.plugin :time_bomb
2
- Ragent.plugin :login
1
+ plugin :time_bomb
2
+ plugin :login
3
+
3
4
 
4
- Ragent.run
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'celluloid/current'
2
3
  require 'celluloid/io'
3
4
 
@@ -7,8 +8,7 @@ module Ragent
7
8
  include Ragent::Plugin
8
9
  include Celluloid::IO
9
10
 
10
- def configure
11
- end
11
+ plugin_name 'login'
12
12
 
13
13
  def start
14
14
  @server = TCPServer.new('127.0.0.1', 6666)
@@ -16,7 +16,7 @@ module Ragent
16
16
  end
17
17
 
18
18
  def stop
19
- @server.close if @server
19
+ @server&.close
20
20
  end
21
21
 
22
22
  private
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ module Ragent
3
+ module Plugin
4
+ class TimeBomb
5
+ class Bomb
6
+ include Celluloid
7
+ include Celluloid::Notifications
8
+ include Ragent::Logging
9
+
10
+ finalizer :stop
11
+
12
+ def initialize
13
+ async.start
14
+ end
15
+
16
+ def start
17
+ every(5) do
18
+ publish 'time-bomb-boom', expode_at: Time.now
19
+ end
20
+ end
21
+
22
+ def stop
23
+ info 'disarmed'
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,53 +1,23 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'time_bomb/bomb'
3
+
1
4
  module Ragent
2
5
  module Plugin
3
6
  class TimeBomb
4
- class TestBomb
5
- include Celluloid
6
- include Celluloid::Notifications
7
- include Ragent::Logging
8
-
9
- finalizer :stop
10
-
11
- def initialize
12
- async.start
13
- end
14
-
15
- def start
16
- every(5) do
17
- publish 'time-bomb-boom', expode_at: Time.now
18
- end
19
- end
20
-
21
- def stop
22
- info 'disarmed'
23
- end
24
- end
25
-
26
7
  include Ragent::Plugin
27
8
 
28
- def configure
9
+ plugin_name 'time_bomb'
10
+ commands :tick, :list, :disarm
11
+
12
+ def configure(*_args)
29
13
  @next_time_bomb_id = 1
30
14
  @time_bombs = {}
31
- command('tick', :command_tick)
32
- command('list', :command_list)
33
- command('disarm', :command_disarm)
34
15
  subscribe('time-bomb-boom', :boom_callback)
35
16
  end
36
17
 
37
- def start
38
- end
39
-
40
- def command(sub, method)
41
- cmd = Ragent::Command.new(main: 'time_bomb',
42
- sub: sub,
43
- recipient: self,
44
- method: method)
45
- @ragent.commands.add(cmd)
46
- end
47
-
48
18
  def command_disarm(options)
49
19
  bomb_name = "time_bomb_#{options['bomb']}"
50
- bomb = Actor[bomb_name]
20
+ bomb = agents(bomb_name)
51
21
  if bomb
52
22
  bomb.terminate
53
23
  @time_bombs.delete(bomb_name)
@@ -55,7 +25,7 @@ module Ragent
55
25
  else
56
26
  "no such bomb #{bomb_name}"
57
27
  end
58
- end
28
+ end
59
29
 
60
30
  def command_list(_options)
61
31
  @time_bombs.keys.join("\n")
@@ -67,12 +37,9 @@ module Ragent
67
37
  @time_bombs[as] = true
68
38
  @next_time_bomb_id += 1
69
39
 
70
- @ragent.supervisor.supervise(
71
- type: TimeBomb::TestBomb,
72
- as: as
73
- )
40
+ agent(type: TimeBomb::Bomb, as: as)
74
41
 
75
- 'starting timebomb'
42
+ "starting #{as}"
76
43
  end
77
44
 
78
45
  def boom_callback(_topic, params)
data/exe/ragent CHANGED
@@ -1,12 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require_relative '../lib/ragent'
5
+ require_relative '../lib/ragent/cli'
4
6
 
5
- workdir=Dir.pwd
6
-
7
- ragent=Ragent.setup(
8
- log_level: ENV['RAGENT_LOG_LEVEL'] || 'info',
9
- workdir: workdir
10
- )
11
-
12
- eval File.read(ragent.workdir.join("config.ragent"))
7
+ Ragent::Cli::Main.start(ARGV)
data/lib/ragent/cli.rb ADDED
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+ require 'thor'
3
+
4
+ module Ragent
5
+ module Cli
6
+ class Main < ::Thor
7
+ desc 'start', 'starts the ragent framweork reading your config.ragent file'
8
+ option :log_level, banner: '<debug|info|warn|error|fatal> overrides ENV RAGENT_LOG_LEVEL'
9
+ option :root, banner: '<DIR> the root of the app (default is the pwd)'
10
+ def start
11
+ Ragent.start(workdir: options[:root],
12
+ log_level: options[:log_level],
13
+ blocking: true)
14
+ end
15
+
16
+ long_desc <<-LONGDESC
17
+ ragent console will start an irb console in your terminal. CAUTION when exiting the console
18
+ currently the agent won't shutdown cleanly.
19
+ LONGDESC
20
+ desc 'console', 'start your application but gives you a console'
21
+ option :log_level, banner: '<debug|info|warn|error|fatal> overrides ENV RAGENT_LOG_LEVEL'
22
+ option :root, banner: '<DIR> the root of the app (default is the pwd)'
23
+ def console
24
+ Ragent.start(workdir: options[:root],
25
+ log_level: options[:log_level],
26
+ blocking: false)
27
+ require 'irb'
28
+ ARGV.clear # see http://stackoverflow.com/questions/33070092/irb-start-not-starting
29
+ IRB.start
30
+ end
31
+
32
+ # def plugin
33
+ # puts "TBD: create a new plugin structure"
34
+ # end
35
+
36
+ # def new
37
+ # puts "TBD: create a new ragent app"
38
+ # end
39
+
40
+ desc 'version', 'prints version of metoda-cli'
41
+ def version
42
+ puts Ragent::VERSION.to_s
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,19 +1,23 @@
1
+ # frozen_string_literal: true
1
2
  module Ragent
2
3
  class Command
3
-
4
4
  include Ragent::Logging
5
5
 
6
6
  attr_reader :main, :sub
7
7
  def initialize(main:, sub: nil, recipient:, method:)
8
- @main=main
9
- @sub=sub
10
- @recipient=recipient
11
- @method=method
8
+ @main = main.to_s
9
+ @sub = sub.to_s
10
+ @recipient = recipient
11
+ @method = method
12
12
  end
13
13
 
14
- def execute(options={})
14
+ def execute(options = {})
15
15
  info "running: #{@main} #{@sub}, calling: #{@method}"
16
- @recipient.send(@method,options)
16
+ @recipient.send(@method, options)
17
+ end
18
+
19
+ def sub?
20
+ !sub.empty?
17
21
  end
18
22
 
19
23
  def help
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ module Ragent
3
+ module CommandHelpers
4
+ def command(*commands)
5
+ @prepared_commands = []
6
+ commands.each do |command|
7
+ prep_command = { main: plugin_name, # name of the plugin
8
+ sub: command,
9
+ method: "command_#{command}" }
10
+ @prepared_commands << prep_command
11
+ end
12
+ end
13
+
14
+ def prepared_commands
15
+ @prepared_commands || []
16
+ end
17
+
18
+ alias commands command
19
+ end
20
+ end
@@ -1,43 +1,53 @@
1
+ # frozen_string_literal: true
1
2
  module Ragent
2
3
  class Commands
3
4
  include Ragent::Logging
4
5
 
5
6
  def initialize(ragent)
6
- @ragent=ragent
7
- @commands={}
7
+ @ragent = ragent
8
+ @commands = {}
8
9
  add_help_command
9
10
  end
10
11
 
11
12
  def add(command)
12
- if command.sub
13
+ if command.sub?
13
14
  @commands[command.main] ||= {}
14
- @commands[command.main][command.sub]=command
15
+ @commands[command.main][command.sub] = command
15
16
  else
16
17
  @commands[command.main] ||= command
17
18
  end
18
19
  info "registered command: #{command.help}"
19
20
  end
20
21
 
21
- def lookup(main,sub,options)
22
+ def lookup(main, sub, options)
22
23
  debug "checkig command: #{main},#{sub},#{options}"
23
- cmd=@commands[main]
24
+ cmd = @commands[main]
24
25
  if cmd
25
- if cmd.kind_of?(Hash) && sub
26
- return @commands[main][sub]
26
+
27
+ if cmd.is_a?(Hash) && sub
28
+ sub_cmd = @commands[main][sub]
29
+ if sub_cmd
30
+ debug "command found (#{main},#{sub})"
31
+ else
32
+ debug "command not found (#{main},#{sub})"
33
+ end
34
+ return sub_cmd
27
35
  else
36
+ debug "command found (#{main})"
28
37
  return cmd
29
38
  end
39
+ else
40
+ debug 'command not found'
30
41
  end
31
42
  nil
32
43
  end
44
+
33
45
  private
34
46
 
35
- def help_command(options={})
47
+ def help_command(_options = {})
36
48
  @commands.values.map do |subs|
37
- if subs.kind_of?(Hash)
38
- subs.values.map do |cmd|
39
- cmd.help
40
- end
49
+ if subs.is_a?(Hash)
50
+ subs.values.map(&:help)
41
51
  else
42
52
  subs.help
43
53
  end
@@ -46,11 +56,8 @@ module Ragent
46
56
 
47
57
  def add_help_command
48
58
  add(Ragent::Command.new(main: 'help',
49
- recipient: self,
50
- method: :help_command
51
- ))
59
+ recipient: self,
60
+ method: :help_command))
52
61
  end
53
-
54
-
55
62
  end
56
63
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ module Ragent
3
+ class Configurator
4
+ include Ragent::Logging
5
+
6
+ def initialize(ragent)
7
+ @ragent = ragent
8
+ end
9
+
10
+ def self.load(ragent, filename)
11
+ config = new(ragent)
12
+ config._load(filename)
13
+ end
14
+
15
+ def _load(filename)
16
+ instance_eval File.read(filename)
17
+ end
18
+
19
+ private
20
+
21
+ def plugin(*args, &block)
22
+ @ragent.add_plugin(*args, &block)
23
+ end
24
+ end
25
+ end
@@ -1,8 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  module Ragent
2
3
  module Logging
3
-
4
4
  def self.logger=(logger)
5
- @logger=logger
5
+ @logger = logger
6
6
  end
7
7
 
8
8
  def self.logger
@@ -13,20 +13,20 @@ module Ragent
13
13
  Ragent::Logging.logger
14
14
  end
15
15
 
16
- def debug str
17
- logger.debug(str)
16
+ def debug(str)
17
+ logger.debug(str)
18
18
  end
19
19
 
20
- def warn str
21
- logger.warn(str)
22
- end
20
+ def warn(str)
21
+ logger.warn(str)
22
+ end
23
23
 
24
- def info str
25
- logger.info(str)
26
- end
24
+ def info(str)
25
+ logger.info(str)
26
+ end
27
27
 
28
- def error str
29
- logger.error(str)
30
- end
28
+ def error(str)
29
+ logger.error(str)
30
+ end
31
31
  end
32
32
  end
data/lib/ragent/plugin.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Ragent
2
3
  module Plugin
3
4
  def self.included(klass)
@@ -5,19 +6,42 @@ module Ragent
5
6
  klass.send(:include, Celluloid)
6
7
  klass.send(:include, Celluloid::Notifications)
7
8
  klass.send(:finalizer, :stop)
8
- def initialize(ragent)
9
- @ragent = ragent
10
- @logger = ragent.logger
11
- end
9
+ klass.send(:extend, Ragent::CommandHelpers)
10
+ klass.extend(ClassMethods)
11
+ end
12
12
 
13
- def configure(*args, &block)
13
+ module ClassMethods
14
+ def plugin_name(name = nil)
15
+ if name
16
+ @name = name
17
+ else
18
+ @name
19
+ end
14
20
  end
15
-
16
- def stop
21
+ end
22
+ def initialize(ragent)
23
+ @ragent = ragent
24
+ @logger = ragent.logger
25
+ self.class.prepared_commands.each do |cmd|
26
+ @ragent.commands.add(cmd = Ragent::Command.new(cmd.merge(recipient: self)))
17
27
  end
18
28
  end
19
29
 
30
+ def configure(*args, &block); end
20
31
 
21
- end
32
+ def start; end
22
33
 
34
+ def stop; end
35
+
36
+ def agent(type:, as:)
37
+ @ragent.supervisor.supervise(
38
+ type: type,
39
+ as: as
40
+ )
41
+ end
42
+
43
+ def agents(name)
44
+ Celluloid::Actor[name]
45
+ end
46
+ end
23
47
  end
@@ -1,24 +1,25 @@
1
+ # frozen_string_literal: true
1
2
  # Ragent::Plugin is reserved for plugins!
2
3
  module Ragent
3
4
  class Plugins
4
5
  include Ragent::Logging
5
6
 
6
7
  def initialize(ragent)
7
- @ragent=ragent
8
- @logger=ragent.logger
9
- @plugins={}
10
- @running_plugins=[]
8
+ @ragent = ragent
9
+ @logger = ragent.logger
10
+ @plugins = {}
11
+ @running_plugins = []
11
12
  end
12
13
 
13
- def load(name,*args, &block)
14
+ def load(name, *args, &block)
14
15
  info "loading plugin #{name}"
15
16
  require "ragent/plugin/#{name}"
16
17
  raise "plugin #{name} didn't register" unless @plugins[name.to_s]
17
18
  info "loaded plugin #{name}"
18
- #TODO: load and configure dependencies
19
- plugin=@plugins[name.to_s]
19
+ # TODO: load and configure dependencies
20
+ plugin = @plugins[name.to_s]
20
21
  info "Configure: #{plugin.name}"
21
- running_plugin=plugin.new(@ragent)
22
+ running_plugin = plugin.new(@ragent)
22
23
  running_plugin.configure(*args, &block)
23
24
  debug "Configured: #{plugin.name}"
24
25
  @running_plugins << running_plugin
@@ -29,12 +30,7 @@ module Ragent
29
30
  end
30
31
 
31
32
  def start
32
- @running_plugins.each do |plugin|
33
- info "Starting: #{plugin.name}"
34
- # TODO: start dependencies
35
- plugin.start
36
- debug "Started: #{plugin.name}"
37
- end
33
+ @running_plugins.each(&:start)
38
34
  end
39
35
 
40
36
  def stop
@@ -49,15 +45,15 @@ module Ragent
49
45
 
50
46
  def register_commands
51
47
  # stop
52
- cmd=Ragent::Command.new(main: 'plugins',
53
- sub: 'list',
54
- recipient: self,
55
- method: :plugins_list_command)
48
+ cmd = Ragent::Command.new(main: 'plugins',
49
+ sub: 'list',
50
+ recipient: self,
51
+ method: :plugins_list_command)
56
52
  @ragent.commands.add(cmd)
57
53
  end
58
54
 
59
- def plugins_list_command(options)
60
- @plugins.values.map do |plugin| plugin.name end.join("\n")
55
+ def plugins_list_command(_options)
56
+ @plugins.values.map(&:name).join("\n")
61
57
  end
62
58
  end
63
59
  end
@@ -1,4 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Ragent
2
- VERSION="0.0.3"
3
+ VERSION = '0.0.4'
3
4
  end
4
-
data/lib/ragent.rb CHANGED
@@ -1,36 +1,36 @@
1
- #require 'faye/websocket'
2
- #require 'eventmachine'
1
+ # frozen_string_literal: true
3
2
  require 'thread'
4
3
  require 'celluloid/current'
5
4
  require 'celluloid/autostart'
6
5
 
7
- #require 'active_support/inflector'
8
-
9
6
  require 'logging'
10
7
  require 'pathname'
11
8
 
9
+ require_relative 'ragent/version'
12
10
  require_relative 'ragent/logging'
13
11
  require_relative 'ragent/plugins'
14
12
  require_relative 'ragent/plugin'
15
13
  require_relative 'ragent/commands'
16
14
  require_relative 'ragent/command'
15
+ require_relative 'ragent/configurator'
16
+ require_relative 'ragent/command_helpers'
17
17
 
18
18
  module Ragent
19
- def self.ragent
20
- @ragent
21
- end
19
+ DEFAULT_LOG_LEVEL = 'info'
22
20
 
23
- def self.setup(*args)
24
- @ragent=Agent.new(*args)
21
+ def self.start(workdir: nil, log_level: nil, blocking: true)
22
+ Ragent.setup(
23
+ log_level: ENV['RAGENT_LOG_LEVEL'] || log_level || DEFAULT_LOG_LEVEL,
24
+ workdir: workdir || Dir.pwd
25
+ ).config.run(blocking)
25
26
  end
26
27
 
27
-
28
- def self.plugin(name,*args, &block)
29
- @ragent.plugins.load(name,*args, &block) if name.is_a?(Symbol)
28
+ def self.ragent
29
+ @ragent
30
30
  end
31
31
 
32
- def self.run
33
- @ragent.run
32
+ def self.setup(*args)
33
+ @ragent = Agent.new(*args)
34
34
  end
35
35
 
36
36
  class Agent
@@ -42,55 +42,62 @@ module Ragent
42
42
  attr_reader :plugins
43
43
 
44
44
  def initialize(log_level:, workdir:)
45
- @workdir=Pathname.new(workdir)
46
- $: << @workdir.join('lib').to_s
45
+ @workdir = Pathname.new(workdir)
46
+ $LOAD_PATH << @workdir.join('lib').to_s
47
47
 
48
-
49
- Ragent::Logging.logger=::Logging.logger['ragent']
48
+ # setup logger
49
+ Ragent::Logging.logger = ::Logging.logger['ragent']
50
50
  logger.add_appenders ::Logging.appenders.stdout
51
51
 
52
- @commands=Ragent::Commands.new(self)
52
+ @commands = Ragent::Commands.new(self)
53
+ @plugins = Plugins.new(self)
54
+
53
55
  register_commands
54
- @plugins=Plugins.new(self)
55
56
  end
56
57
 
57
- def run
58
+ def config
59
+ Ragent::Configurator.load(self, workdir.join('config.ragent'))
60
+ self
61
+ end
62
+
63
+ def add_plugin(name, *args, &block)
64
+ plugins.load(name, *args, &block) if name.is_a?(Symbol)
65
+ end
66
+
67
+ def run(blocking = true)
58
68
  @supervisor = Celluloid::Supervision::Container.run!
69
+ plugins.start
70
+ term_wait_loop if blocking
71
+ end
59
72
 
73
+ private
60
74
 
75
+ def term_wait_loop
61
76
  self_read, @self_write = IO.pipe
62
-
63
77
  %w(TERM TTIN INT).each do |sig|
64
78
  Signal.trap sig do
65
79
  @self_write.puts(sig)
66
80
  end
67
81
  end
68
-
69
- #start_em
70
- @plugins.start
71
-
72
- stop=false
82
+ stop = false
73
83
  while stop || readable_io = IO.select([self_read])
74
84
  signal = readable_io.first[0].gets.strip
75
- stop=handle_signal(signal)
76
- exit(0)
85
+ break if handle_signal(signal)
77
86
  end
87
+ info 'Exiting'
78
88
  end
79
89
 
80
- private
81
-
82
- #def start_em
83
90
  # EM.epoll
84
91
  # Thread.new { EventMachine.run } unless EventMachine.reactor_running?
85
92
  # sleep 0.01 until EventMachine.reactor_running?
86
- #end
93
+ # end
87
94
 
88
95
  def handle_signal(signal)
89
96
  info "Got signal #{signal}"
90
97
  case signal
91
- when 'TERM','INT'
92
- info "Shutting down..."
93
- EM.stop if EventMachine.reactor_running?
98
+ when 'TERM', 'INT', 'SHUTDOWN' # shutdown is an internal command
99
+ info 'Shutting down...'
100
+ # EM.stop if EventMachine.reactor_running?
94
101
  @plugins.stop
95
102
  @supervisor.shutdown
96
103
  true
@@ -100,24 +107,22 @@ module Ragent
100
107
  if thread.backtrace
101
108
  warn thread.backtrace.join("\n")
102
109
  else
103
- warn "no backtrace available"
110
+ warn 'no backtrace available'
104
111
  end
105
112
  end
106
113
  false
107
114
  end
108
115
  end
109
116
 
110
-
111
- def shutdown_command(options={})
112
- @self_write.puts("TERM")
117
+ def shutdown_command(_options = {})
118
+ @self_write.puts('SHUTDOWN')
113
119
  end
114
120
 
115
121
  def register_commands
116
- # stop
117
- cmd=Ragent::Command.new(main: 'shutdown',
118
- sub: nil,
119
- recipient: self,
120
- method: :shutdown_command)
122
+ cmd = Ragent::Command.new(main: 'shutdown',
123
+ sub: nil,
124
+ recipient: self,
125
+ method: :shutdown_command)
121
126
  @commands.add(cmd)
122
127
  end
123
128
  end
data/ragent.gemspec CHANGED
@@ -1,43 +1,45 @@
1
1
  # coding: utf-8
2
+ # frozen_string_literal: true
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'ragent/version'
5
6
 
6
7
  Gem::Specification.new do |spec|
7
- spec.name = "ragent"
8
+ spec.name = 'ragent'
8
9
  spec.version = Ragent::VERSION
9
- spec.authors = ["Peter Schrammel"]
10
- spec.email = ["peter.schrammel@gmx.de"]
10
+ spec.authors = ['Peter Schrammel']
11
+ spec.email = ['peter.schrammel@gmx.de']
11
12
 
12
- spec.summary = %q{An agent framework}
13
- spec.description = %q{Writing of agents for monitoring, chatting, ... should be easy. Ragent eases this with a small extraction layer over celluloid.}
14
- spec.homepage = "https://github.com/pschrammel/ragent"
15
- spec.license = "MIT"
13
+ spec.summary = 'An agent framework'
14
+ spec.description = 'Writing of agents for monitoring, chatting, ... should be easy. Ragent eases this with a small extraction layer over celluloid.'
15
+ spec.homepage = 'https://github.com/pschrammel/ragent'
16
+ spec.license = 'MIT'
16
17
 
17
18
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
19
  # to allow pushing to a single host or delete this section to allow pushing to any host.
19
20
  if spec.respond_to?(:metadata)
20
- spec.metadata['allowed_push_host'] = "https://rubygems.org"
21
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
21
22
  else
22
- raise "RubyGems 2.0 or newer is required to protect against " \
23
- "public gem pushes."
23
+ raise 'RubyGems 2.0 or newer is required to protect against ' \
24
+ 'public gem pushes.'
24
25
  end
25
26
 
26
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
28
  f.match(%r{^(test|spec|features)/})
28
29
  end
29
- spec.bindir = "exe"
30
+ spec.bindir = 'exe'
30
31
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
- spec.require_paths = ["lib"]
32
+ spec.require_paths = ['lib']
32
33
 
33
34
  spec.add_dependency 'celluloid', '~>0.17.0'
34
- # spec.add_dependency 'activesupport'
35
- # spec.add_dependency 'eventmachine'
36
- # spec.add_dependency 'faye-websocket'
35
+ spec.add_dependency 'thor', '~>0.19'
36
+ # spec.add_dependency 'activesupport'
37
+ # spec.add_dependency 'eventmachine'
38
+ # spec.add_dependency 'faye-websocket'
37
39
  spec.add_dependency 'logging', '~>2.1'
38
- # spec.add_dependency 'celluloid-io' #needed for a plugin, should be removed
40
+ # spec.add_dependency 'celluloid-io' #needed for a plugin, should be removed
39
41
 
40
- spec.add_development_dependency "bundler", "~> 1.13"
41
- spec.add_development_dependency "rake", "~> 10.0"
42
- spec.add_development_dependency "rspec", "~> 3.0"
42
+ spec.add_development_dependency 'bundler', '~> 1.13'
43
+ spec.add_development_dependency 'rake', '~> 10.0'
44
+ spec.add_development_dependency 'rspec', '~> 3.0'
43
45
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ragent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Schrammel
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-16 00:00:00.000000000 Z
11
+ date: 2017-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: celluloid
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.17.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.19'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.19'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: logging
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -90,6 +104,7 @@ extensions: []
90
104
  extra_rdoc_files: []
91
105
  files:
92
106
  - ".gitignore"
107
+ - ".rubocop.yml"
93
108
  - CODE_OF_CONDUCT.md
94
109
  - Gemfile
95
110
  - Gemfile.lock
@@ -101,10 +116,14 @@ files:
101
116
  - examples/config.ragent
102
117
  - examples/lib/ragent/plugin/login.rb
103
118
  - examples/lib/ragent/plugin/time_bomb.rb
119
+ - examples/lib/ragent/plugin/time_bomb/bomb.rb
104
120
  - exe/ragent
105
121
  - lib/ragent.rb
122
+ - lib/ragent/cli.rb
106
123
  - lib/ragent/command.rb
124
+ - lib/ragent/command_helpers.rb
107
125
  - lib/ragent/commands.rb
126
+ - lib/ragent/configurator.rb
108
127
  - lib/ragent/logging.rb
109
128
  - lib/ragent/plugin.rb
110
129
  - lib/ragent/plugins.rb
@@ -131,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
150
  version: '0'
132
151
  requirements: []
133
152
  rubyforge_project:
134
- rubygems_version: 2.5.1
153
+ rubygems_version: 2.6.10
135
154
  signing_key:
136
155
  specification_version: 4
137
156
  summary: An agent framework