eye 0.7 → 0.8.celluloid15
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/.rubocop.yml +141 -0
 - data/.travis.yml +5 -3
 - data/CHANGES.md +9 -1
 - data/README.md +5 -2
 - data/Rakefile +6 -6
 - data/bin/leye +9 -4
 - data/bin/loader_eye +14 -15
 - data/examples/custom_check.eye +24 -0
 - data/examples/custom_trigger.eye +30 -0
 - data/examples/delayed_job.eye +3 -3
 - data/examples/dependency.eye +10 -11
 - data/examples/leye_example/Eyefile +10 -0
 - data/examples/notify.eye +3 -4
 - data/examples/plugin/main.eye +5 -5
 - data/examples/plugin/plugin.rb +10 -2
 - data/examples/process_thin.rb +8 -8
 - data/examples/processes/em.rb +18 -12
 - data/examples/processes/forking.rb +5 -5
 - data/examples/processes/sample.rb +46 -44
 - data/examples/puma.eye +9 -8
 - data/examples/rbenv.eye +5 -5
 - data/examples/sidekiq.eye +3 -3
 - data/examples/stress_test.eye +4 -4
 - data/examples/syslog.eye +1 -1
 - data/examples/test.eye +1 -2
 - data/examples/thin-farm.eye +7 -8
 - data/examples/triggers.eye +13 -15
 - data/examples/unicorn.eye +12 -13
 - data/eye.gemspec +16 -14
 - data/lib/eye.rb +2 -3
 - data/lib/eye/application.rb +5 -6
 - data/lib/eye/checker.rb +44 -25
 - data/lib/eye/checker/children_count.rb +1 -1
 - data/lib/eye/checker/file_ctime.rb +1 -1
 - data/lib/eye/checker/http.rb +13 -15
 - data/lib/eye/checker/nop.rb +1 -0
 - data/lib/eye/checker/socket.rb +60 -63
 - data/lib/eye/checker/ssl_socket.rb +5 -5
 - data/lib/eye/child_process.rb +6 -4
 - data/lib/eye/cli.rb +74 -46
 - data/lib/eye/cli/commands.rb +4 -5
 - data/lib/eye/cli/render.rb +61 -41
 - data/lib/eye/cli/server.rb +19 -16
 - data/lib/eye/client.rb +1 -0
 - data/lib/eye/config.rb +36 -33
 - data/lib/eye/controller.rb +2 -3
 - data/lib/eye/controller/commands.rb +1 -1
 - data/lib/eye/controller/helpers.rb +2 -2
 - data/lib/eye/controller/load.rb +19 -17
 - data/lib/eye/controller/options.rb +1 -5
 - data/lib/eye/controller/send_command.rb +21 -23
 - data/lib/eye/controller/status.rb +17 -14
 - data/lib/eye/dsl.rb +6 -1
 - data/lib/eye/dsl/application_opts.rb +4 -3
 - data/lib/eye/dsl/chain.rb +2 -2
 - data/lib/eye/dsl/child_process_opts.rb +3 -3
 - data/lib/eye/dsl/config_opts.rb +7 -7
 - data/lib/eye/dsl/group_opts.rb +3 -3
 - data/lib/eye/dsl/helpers.rb +1 -1
 - data/lib/eye/dsl/main.rb +4 -3
 - data/lib/eye/dsl/opts.rb +31 -28
 - data/lib/eye/dsl/process_opts.rb +13 -7
 - data/lib/eye/dsl/pure_opts.rb +13 -9
 - data/lib/eye/dsl/validation.rb +48 -35
 - data/lib/eye/group.rb +23 -8
 - data/lib/eye/group/chain.rb +6 -6
 - data/lib/eye/loader.rb +3 -3
 - data/lib/eye/local.rb +9 -4
 - data/lib/eye/logger.rb +11 -4
 - data/lib/eye/notify.rb +10 -6
 - data/lib/eye/notify/jabber.rb +1 -1
 - data/lib/eye/notify/mail.rb +2 -2
 - data/lib/eye/notify/slack.rb +4 -3
 - data/lib/eye/process.rb +2 -0
 - data/lib/eye/process/children.rb +4 -4
 - data/lib/eye/process/commands.rb +38 -39
 - data/lib/eye/process/config.rb +22 -16
 - data/lib/eye/process/controller.rb +5 -19
 - data/lib/eye/process/data.rb +11 -9
 - data/lib/eye/process/monitor.rb +86 -76
 - data/lib/eye/process/notify.rb +10 -10
 - data/lib/eye/process/scheduler.rb +36 -31
 - data/lib/eye/process/states.rb +7 -5
 - data/lib/eye/process/states_history.rb +9 -3
 - data/lib/eye/process/system.rb +35 -20
 - data/lib/eye/process/trigger.rb +1 -5
 - data/lib/eye/process/watchers.rb +12 -9
 - data/lib/eye/reason.rb +4 -1
 - data/lib/eye/server.rb +3 -2
 - data/lib/eye/system.rb +22 -15
 - data/lib/eye/system_resources.rb +17 -8
 - data/lib/eye/trigger.rb +18 -16
 - data/lib/eye/trigger/check_dependency.rb +7 -4
 - data/lib/eye/trigger/flapping.rb +24 -7
 - data/lib/eye/trigger/starting_guard.rb +7 -6
 - data/lib/eye/trigger/stop_children.rb +2 -2
 - data/lib/eye/trigger/transition.rb +1 -1
 - data/lib/eye/trigger/wait_dependency.rb +3 -2
 - data/lib/eye/utils.rb +4 -3
 - data/lib/eye/utils/alive_array.rb +9 -4
 - data/lib/eye/utils/celluloid_chain.rb +12 -10
 - data/lib/eye/utils/mini_active_support.rb +16 -16
 - data/lib/eye/utils/pmap.rb +2 -0
 - data/lib/eye/utils/tail.rb +2 -2
 - metadata +39 -8
 - data/lib/eye/utils/leak_19.rb +0 -10
 
    
        data/examples/sidekiq.eye
    CHANGED
    
    | 
         @@ -10,14 +10,14 @@ def sidekiq_process(proxy, name) 
     | 
|
| 
       10 
10 
     | 
    
         
             
                daemonize true
         
     | 
| 
       11 
11 
     | 
    
         
             
                stop_signals [:USR1, 0, :TERM, 10.seconds, :KILL]
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
                check :cpu, : 
     | 
| 
       14 
     | 
    
         
            -
                check :memory, : 
     | 
| 
      
 13 
     | 
    
         
            +
                check :cpu, every: 30, below: 100, times: 5
         
     | 
| 
      
 14 
     | 
    
         
            +
                check :memory, every: 30, below: 300.megabytes, times: 5
         
     | 
| 
       15 
15 
     | 
    
         
             
              end
         
     | 
| 
       16 
16 
     | 
    
         
             
            end
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
18 
     | 
    
         
             
            Eye.application :sidekiq_test do
         
     | 
| 
       19 
19 
     | 
    
         
             
              working_dir File.expand_path(File.join(File.dirname(__FILE__), %w[ processes ]))
         
     | 
| 
       20 
     | 
    
         
            -
              env  
     | 
| 
      
 20 
     | 
    
         
            +
              env 'RAILS_ENV' => 'production'
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
22 
     | 
    
         
             
              sidekiq_process self, :sidekiq
         
     | 
| 
       23 
23 
     | 
    
         
             
            end
         
     | 
    
        data/examples/stress_test.eye
    CHANGED
    
    | 
         @@ -3,16 +3,16 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
            PREFIX = ENV['PRE'] || ENV['EYE_V'] || 1
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            Eye.app :stress_test do
         
     | 
| 
       6 
     | 
    
         
            -
              working_dir  
     | 
| 
      
 6 
     | 
    
         
            +
              working_dir '/tmp'
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
              100.times do |i|
         
     | 
| 
       9 
9 
     | 
    
         
             
                process "sleep-#{i}" do
         
     | 
| 
       10 
10 
     | 
    
         
             
                  pid_file "sleep-#{PREFIX}-#{i}.pid"
         
     | 
| 
       11 
     | 
    
         
            -
                  start_command  
     | 
| 
      
 11 
     | 
    
         
            +
                  start_command 'sleep 120'
         
     | 
| 
       12 
12 
     | 
    
         
             
                  daemonize true
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
     | 
    
         
            -
                  checks :cpu, : 
     | 
| 
       15 
     | 
    
         
            -
                  checks :memory, : 
     | 
| 
      
 14 
     | 
    
         
            +
                  checks :cpu, every: 5.seconds, below: 10, times: 5
         
     | 
| 
      
 15 
     | 
    
         
            +
                  checks :memory, every: 6.seconds, below: 50.megabytes, times: 5
         
     | 
| 
       16 
16 
     | 
    
         
             
                end
         
     | 
| 
       17 
17 
     | 
    
         
             
              end
         
     | 
| 
       18 
18 
     | 
    
         
             
            end
         
     | 
    
        data/examples/syslog.eye
    CHANGED
    
    
    
        data/examples/test.eye
    CHANGED
    
    | 
         @@ -66,7 +66,7 @@ Eye.application 'test' do 
     | 
|
| 
       66 
66 
     | 
    
         
             
              end
         
     | 
| 
       67 
67 
     | 
    
         | 
| 
       68 
68 
     | 
    
         
             
              # eventmachine process, daemonized with eye
         
     | 
| 
       69 
     | 
    
         
            -
              process :event_machine do 
     | 
| 
      
 69 
     | 
    
         
            +
              process :event_machine do
         
     | 
| 
       70 
70 
     | 
    
         
             
                pid_file 'em.pid'
         
     | 
| 
       71 
71 
     | 
    
         
             
                start_command 'ruby em.rb'
         
     | 
| 
       72 
72 
     | 
    
         
             
                stdout 'em.log'
         
     | 
| 
         @@ -86,5 +86,4 @@ Eye.application 'test' do 
     | 
|
| 
       86 
86 
     | 
    
         
             
                check :http, url: 'http://127.0.0.1:33233/hello', pattern: /World/,
         
     | 
| 
       87 
87 
     | 
    
         
             
                             every: 5.seconds, times: [2, 3], timeout: 1.second
         
     | 
| 
       88 
88 
     | 
    
         
             
              end
         
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
89 
     | 
    
         
             
            end
         
     | 
    
        data/examples/thin-farm.eye
    CHANGED
    
    | 
         @@ -1,30 +1,29 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            RUBY = 'ruby'
         
     | 
| 
       2 
2 
     | 
    
         
             
            BUNDLE = 'bundle'
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
     | 
    
         
            -
            Eye.load( 
     | 
| 
      
 4 
     | 
    
         
            +
            Eye.load('process_thin.rb')
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            Eye.config do
         
     | 
| 
       7 
     | 
    
         
            -
              logger  
     | 
| 
      
 7 
     | 
    
         
            +
              logger '/tmp/eye.log'
         
     | 
| 
       8 
8 
     | 
    
         
             
            end
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
            Eye.app 'thin-farm' do
         
     | 
| 
       11 
11 
     | 
    
         
             
              working_dir File.expand_path(File.join(File.dirname(__FILE__), %w[ processes ]))
         
     | 
| 
       12 
     | 
    
         
            -
              env  
     | 
| 
      
 12 
     | 
    
         
            +
              env 'RAILS_ENV' => 'production'
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
              # more about stop_on_delete: https://github.com/kostya/eye/wiki/About-stop_on_delete-=-true
         
     | 
| 
       15 
15 
     | 
    
         
             
              stop_on_delete true
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
              trigger :flapping, : 
     | 
| 
       18 
     | 
    
         
            -
              check :memory, : 
     | 
| 
      
 17 
     | 
    
         
            +
              trigger :flapping, times: 10, within: 1.minute
         
     | 
| 
      
 18 
     | 
    
         
            +
              check :memory, below: 60.megabytes, every: 30.seconds, times: 5
         
     | 
| 
       19 
19 
     | 
    
         
             
              start_timeout 30.seconds
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
              group :web do
         
     | 
| 
       22 
     | 
    
         
            -
                chain : 
     | 
| 
       23 
     | 
    
         
            -
                chain : 
     | 
| 
      
 22 
     | 
    
         
            +
                chain action: :restart, grace: 5.seconds
         
     | 
| 
      
 23 
     | 
    
         
            +
                chain action: :start, grace: 0.2.seconds
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
                (5555..5560).each do |port|
         
     | 
| 
       26 
26 
     | 
    
         
             
                  thin self, port
         
     | 
| 
       27 
27 
     | 
    
         
             
                end
         
     | 
| 
       28 
28 
     | 
    
         
             
              end
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
29 
     | 
    
         
             
            end
         
     | 
    
        data/examples/triggers.eye
    CHANGED
    
    | 
         @@ -5,15 +5,14 @@ 
     | 
|
| 
       5 
5 
     | 
    
         
             
            # process.execute_sync(cmd, opts)
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
            Eye.config do
         
     | 
| 
       8 
     | 
    
         
            -
              logger  
     | 
| 
      
 8 
     | 
    
         
            +
              logger '/tmp/eye.log'
         
     | 
| 
       9 
9 
     | 
    
         
             
            end
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
            Eye.app :triggers do
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
12 
     | 
    
         
             
              # Execute shell command before process start
         
     | 
| 
       14 
13 
     | 
    
         
             
              process :a do
         
     | 
| 
       15 
     | 
    
         
            -
                pid_file  
     | 
| 
       16 
     | 
    
         
            -
                start_command  
     | 
| 
      
 14 
     | 
    
         
            +
                pid_file '/tmp/a.pid'
         
     | 
| 
      
 15 
     | 
    
         
            +
                start_command 'sleep 100'
         
     | 
| 
       17 
16 
     | 
    
         
             
                daemonize true
         
     | 
| 
       18 
17 
     | 
    
         | 
| 
       19 
18 
     | 
    
         
             
                # send message async which sendxmpp, before process start
         
     | 
| 
         @@ -24,41 +23,40 @@ Eye.app :triggers do 
     | 
|
| 
       24 
23 
     | 
    
         | 
| 
       25 
24 
     | 
    
         
             
              # Touch some file before process start, remove file after process die
         
     | 
| 
       26 
25 
     | 
    
         
             
              process :b do
         
     | 
| 
       27 
     | 
    
         
            -
                pid_file  
     | 
| 
       28 
     | 
    
         
            -
                start_command  
     | 
| 
      
 26 
     | 
    
         
            +
                pid_file '/tmp/b.pid'
         
     | 
| 
      
 27 
     | 
    
         
            +
                start_command 'sleep 100'
         
     | 
| 
       29 
28 
     | 
    
         
             
                daemonize true
         
     | 
| 
       30 
29 
     | 
    
         | 
| 
       31 
30 
     | 
    
         
             
                # before process starting, touch some file
         
     | 
| 
       32 
31 
     | 
    
         
             
                trigger :transition1, to: :starting, do: -> {
         
     | 
| 
       33 
     | 
    
         
            -
                  process.execute_sync  
     | 
| 
      
 32 
     | 
    
         
            +
                  process.execute_sync 'touch /tmp/bla.file'
         
     | 
| 
       34 
33 
     | 
    
         
             
                }
         
     | 
| 
       35 
34 
     | 
    
         | 
| 
       36 
35 
     | 
    
         
             
                # after process, crashed, or stopped, remove that file
         
     | 
| 
       37 
36 
     | 
    
         
             
                trigger :transition2, to: :down, do: -> {
         
     | 
| 
       38 
     | 
    
         
            -
                  process.execute_sync  
     | 
| 
      
 37 
     | 
    
         
            +
                  process.execute_sync 'rm /tmp/bla.file'
         
     | 
| 
       39 
38 
     | 
    
         
             
                }
         
     | 
| 
       40 
39 
     | 
    
         
             
              end
         
     | 
| 
       41 
40 
     | 
    
         | 
| 
       42 
41 
     | 
    
         
             
              # With restart :c process, send restart to process :a
         
     | 
| 
       43 
42 
     | 
    
         
             
              process :c do
         
     | 
| 
       44 
     | 
    
         
            -
                pid_file  
     | 
| 
       45 
     | 
    
         
            -
                start_command  
     | 
| 
      
 43 
     | 
    
         
            +
                pid_file '/tmp/c.pid'
         
     | 
| 
      
 44 
     | 
    
         
            +
                start_command 'sleep 100'
         
     | 
| 
       46 
45 
     | 
    
         
             
                daemonize true
         
     | 
| 
       47 
46 
     | 
    
         | 
| 
       48 
47 
     | 
    
         
             
                app_name = app.name
         
     | 
| 
       49 
     | 
    
         
            -
                trigger :transition, : 
     | 
| 
       50 
     | 
    
         
            -
                  info  
     | 
| 
      
 48 
     | 
    
         
            +
                trigger :transition, event: :restarting, do: ->{
         
     | 
| 
      
 49 
     | 
    
         
            +
                  info 'send restarting to :a'
         
     | 
| 
       51 
50 
     | 
    
         
             
                  Eye::Control.command('restart', "#{app_name}:a")
         
     | 
| 
       52 
51 
     | 
    
         
             
                }
         
     | 
| 
       53 
52 
     | 
    
         
             
              end
         
     | 
| 
       54 
53 
     | 
    
         | 
| 
       55 
54 
     | 
    
         
             
              # process d cant start, until file /tmp/bla contains string 'bla'
         
     | 
| 
       56 
55 
     | 
    
         
             
              process :d do
         
     | 
| 
       57 
     | 
    
         
            -
                pid_file  
     | 
| 
       58 
     | 
    
         
            -
                start_command  
     | 
| 
      
 56 
     | 
    
         
            +
                pid_file '/tmp/d.pid'
         
     | 
| 
      
 57 
     | 
    
         
            +
                start_command 'sleep 100'
         
     | 
| 
       59 
58 
     | 
    
         
             
                daemonize true
         
     | 
| 
       60 
59 
     | 
    
         | 
| 
       61 
60 
     | 
    
         
             
                trigger :starting_guard, every: 5.seconds, should: -> { `cat /tmp/bla` =~ /bla/ }
         
     | 
| 
       62 
61 
     | 
    
         
             
              end
         
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
62 
     | 
    
         
             
            end
         
     | 
    
        data/examples/unicorn.eye
    CHANGED
    
    | 
         @@ -3,37 +3,36 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
            RUBY = '/usr/local/ruby/1.9.3/bin/ruby' # ruby on the server
         
     | 
| 
       4 
4 
     | 
    
         
             
            RAILS_ENV = 'production'
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
            Eye.application  
     | 
| 
       7 
     | 
    
         
            -
              env  
     | 
| 
      
 6 
     | 
    
         
            +
            Eye.application 'rails_unicorn' do
         
     | 
| 
      
 7 
     | 
    
         
            +
              env 'RAILS_ENV' => RAILS_ENV
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
              # unicorn requires to be `ruby` in path (for soft restart)
         
     | 
| 
       10 
     | 
    
         
            -
              env  
     | 
| 
      
 10 
     | 
    
         
            +
              env 'PATH' => "#{File.dirname(RUBY)}:#{ENV['PATH']}"
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
              working_dir File.expand_path(File.join(File.dirname(__FILE__), %w[ processes ]))
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
     | 
    
         
            -
              process( 
     | 
| 
       15 
     | 
    
         
            -
                pid_file  
     | 
| 
      
 14 
     | 
    
         
            +
              process('unicorn') do
         
     | 
| 
      
 15 
     | 
    
         
            +
                pid_file 'tmp/pids/unicorn.pid'
         
     | 
| 
       16 
16 
     | 
    
         
             
                start_command "#{RUBY} ./bin/unicorn -Dc ./config/unicorn.rb -E #{RAILS_ENV}"
         
     | 
| 
       17 
     | 
    
         
            -
                stdall  
     | 
| 
      
 17 
     | 
    
         
            +
                stdall 'log/unicorn.log'
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
                # stop signals:
         
     | 
| 
       20 
20 
     | 
    
         
             
                # http://unicorn.bogomips.org/SIGNALS.html
         
     | 
| 
       21 
21 
     | 
    
         
             
                stop_signals [:TERM, 10.seconds]
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                # soft restart
         
     | 
| 
       24 
     | 
    
         
            -
                restart_command  
     | 
| 
      
 24 
     | 
    
         
            +
                restart_command 'kill -USR2 {PID}'
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
                check :cpu, : 
     | 
| 
       27 
     | 
    
         
            -
                check :memory, : 
     | 
| 
      
 26 
     | 
    
         
            +
                check :cpu, every: 30, below: 80, times: 3
         
     | 
| 
      
 27 
     | 
    
         
            +
                check :memory, every: 30, below: 150.megabytes, times: [3, 5]
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
       29 
29 
     | 
    
         
             
                start_timeout 100.seconds
         
     | 
| 
       30 
30 
     | 
    
         
             
                restart_grace 30.seconds
         
     | 
| 
       31 
31 
     | 
    
         | 
| 
       32 
32 
     | 
    
         
             
                monitor_children do
         
     | 
| 
       33 
     | 
    
         
            -
                  stop_command  
     | 
| 
       34 
     | 
    
         
            -
                  check :cpu, : 
     | 
| 
       35 
     | 
    
         
            -
                  check :memory, : 
     | 
| 
      
 33 
     | 
    
         
            +
                  stop_command 'kill -QUIT {PID}'
         
     | 
| 
      
 34 
     | 
    
         
            +
                  check :cpu, every: 30, below: 80, times: 3
         
     | 
| 
      
 35 
     | 
    
         
            +
                  check :memory, every: 30, below: 150.megabytes, times: [3, 5]
         
     | 
| 
       36 
36 
     | 
    
         
             
                end
         
     | 
| 
       37 
37 
     | 
    
         
             
              end
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
38 
     | 
    
         
             
            end
         
     | 
    
        data/eye.gemspec
    CHANGED
    
    | 
         @@ -1,29 +1,29 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require File.expand_path('../lib/eye', __FILE__)
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            Gem::Specification.new do |gem|
         
     | 
| 
       4 
     | 
    
         
            -
              gem.authors       =  
     | 
| 
       5 
     | 
    
         
            -
              gem.email         =  
     | 
| 
      
 4 
     | 
    
         
            +
              gem.authors       = 'Konstantin Makarchev'
         
     | 
| 
      
 5 
     | 
    
         
            +
              gem.email         = 'eye-rb@googlegroups.com'
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
              gem.description   = gem.summary = \
         
     | 
| 
       8 
     | 
    
         
            -
                 
     | 
| 
       9 
     | 
    
         
            -
              gem.homepage      =  
     | 
| 
      
 8 
     | 
    
         
            +
                'Process monitoring tool. Inspired from Bluepill and God. Requires Ruby(MRI) >= 1.9.3-p194. Uses Celluloid and Celluloid::IO.'
         
     | 
| 
      
 9 
     | 
    
         
            +
              gem.homepage      = 'http://github.com/kostya/eye'
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
              gem.files         = `git ls-files`.split($\).reject{|n| n =~ %r[png|gif\z]}.reject{|n| n =~ %r[^(test|spec|features)/]}
         
     | 
| 
       12 
     | 
    
         
            -
              gem.executables   = gem.files.grep(%r 
     | 
| 
       13 
     | 
    
         
            -
              #gem.test_files    = gem.files.grep(%r{^(test|spec|features)/})
         
     | 
| 
       14 
     | 
    
         
            -
              gem.name          =  
     | 
| 
       15 
     | 
    
         
            -
              gem.require_paths = [ 
     | 
| 
      
 11 
     | 
    
         
            +
              gem.files         = `git ls-files`.split($\).reject { |n| n =~ %r[png|gif\z] }.reject { |n| n =~ %r[^(test|spec|features)/] }
         
     | 
| 
      
 12 
     | 
    
         
            +
              gem.executables   = gem.files.grep(%r[^bin/]).map { |f| File.basename(f) }
         
     | 
| 
      
 13 
     | 
    
         
            +
              # gem.test_files    = gem.files.grep(%r{^(test|spec|features)/})
         
     | 
| 
      
 14 
     | 
    
         
            +
              gem.name          = 'eye'
         
     | 
| 
      
 15 
     | 
    
         
            +
              gem.require_paths = ['lib']
         
     | 
| 
       16 
16 
     | 
    
         
             
              gem.version       = Eye::VERSION
         
     | 
| 
       17 
     | 
    
         
            -
              gem.license       =  
     | 
| 
      
 17 
     | 
    
         
            +
              gem.license       = 'MIT'
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
              gem.required_ruby_version     = '>= 1.9.2'
         
     | 
| 
       20 
20 
     | 
    
         
             
              gem.required_rubygems_version = '>= 1.3.6'
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
              gem.add_dependency 'celluloid',     '~> 0. 
     | 
| 
       23 
     | 
    
         
            -
              gem.add_dependency 'celluloid-io',  '~> 0. 
     | 
| 
      
 22 
     | 
    
         
            +
              gem.add_dependency 'celluloid',     '~> 0.15.0'
         
     | 
| 
      
 23 
     | 
    
         
            +
              gem.add_dependency 'celluloid-io',  '~> 0.15.0'
         
     | 
| 
       24 
24 
     | 
    
         
             
              gem.add_dependency 'state_machine'
         
     | 
| 
       25 
25 
     | 
    
         
             
              gem.add_dependency 'thor'
         
     | 
| 
       26 
     | 
    
         
            -
              gem.add_dependency 'sigar', 
     | 
| 
      
 26 
     | 
    
         
            +
              gem.add_dependency 'sigar', '~> 0.7.3'
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
       28 
28 
     | 
    
         
             
              gem.add_development_dependency 'rake'
         
     | 
| 
       29 
29 
     | 
    
         
             
              gem.add_development_dependency 'rspec', '< 2.14'
         
     | 
| 
         @@ -31,13 +31,15 @@ Gem::Specification.new do |gem| 
     | 
|
| 
       31 
31 
     | 
    
         
             
              gem.add_development_dependency 'ruby-graphviz'
         
     | 
| 
       32 
32 
     | 
    
         
             
              gem.add_development_dependency 'forking'
         
     | 
| 
       33 
33 
     | 
    
         
             
              gem.add_development_dependency 'fakeweb'
         
     | 
| 
       34 
     | 
    
         
            -
              gem.add_development_dependency 'eventmachine',  
     | 
| 
      
 34 
     | 
    
         
            +
              gem.add_development_dependency 'eventmachine', '>= 1.0.3'
         
     | 
| 
       35 
35 
     | 
    
         
             
              gem.add_development_dependency 'sinatra'
         
     | 
| 
       36 
36 
     | 
    
         
             
              gem.add_development_dependency 'thin'
         
     | 
| 
       37 
37 
     | 
    
         
             
              gem.add_development_dependency 'xmpp4r'
         
     | 
| 
       38 
38 
     | 
    
         
             
              gem.add_development_dependency 'slack-notifier'
         
     | 
| 
       39 
39 
     | 
    
         
             
              gem.add_development_dependency 'coveralls'
         
     | 
| 
      
 40 
     | 
    
         
            +
              gem.add_development_dependency 'tins', '1.6.0' # for coveralls
         
     | 
| 
       40 
41 
     | 
    
         
             
              gem.add_development_dependency 'simplecov', '>= 0.8.1'
         
     | 
| 
       41 
42 
     | 
    
         
             
              gem.add_development_dependency 'parallel_tests', '<= 1.3.1'
         
     | 
| 
       42 
43 
     | 
    
         
             
              gem.add_development_dependency 'parallel_split_test'
         
     | 
| 
      
 44 
     | 
    
         
            +
              gem.add_development_dependency 'rubocop'
         
     | 
| 
       43 
45 
     | 
    
         
             
            end
         
     | 
    
        data/lib/eye.rb
    CHANGED
    
    | 
         @@ -1,5 +1,5 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module Eye
         
     | 
| 
       2 
     | 
    
         
            -
              VERSION   =  
     | 
| 
      
 2 
     | 
    
         
            +
              VERSION   = '0.8.celluloid15'
         
     | 
| 
       3 
3 
     | 
    
         
             
              ABOUT     = "Eye v#{VERSION} (c) 2012-2015 @kostya"
         
     | 
| 
       4 
4 
     | 
    
         
             
              PROCLINE  = "eye monitoring v#{VERSION}"
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
         @@ -8,7 +8,7 @@ module Eye 
     | 
|
| 
       8 
8 
     | 
    
         
             
              autoload :Server,         'eye/server'
         
     | 
| 
       9 
9 
     | 
    
         
             
              autoload :Logger,         'eye/logger'
         
     | 
| 
       10 
10 
     | 
    
         
             
              autoload :System,         'eye/system'
         
     | 
| 
       11 
     | 
    
         
            -
              autoload :SystemResources,'eye/system_resources'
         
     | 
| 
      
 11 
     | 
    
         
            +
              autoload :SystemResources, 'eye/system_resources'
         
     | 
| 
       12 
12 
     | 
    
         
             
              autoload :Checker,        'eye/checker'
         
     | 
| 
       13 
13 
     | 
    
         
             
              autoload :Trigger,        'eye/trigger'
         
     | 
| 
       14 
14 
     | 
    
         
             
              autoload :Group,          'eye/group'
         
     | 
| 
         @@ -21,7 +21,6 @@ module Eye 
     | 
|
| 
       21 
21 
     | 
    
         
             
              autoload :Config,         'eye/config'
         
     | 
| 
       22 
22 
     | 
    
         
             
              autoload :Reason,         'eye/reason'
         
     | 
| 
       23 
23 
     | 
    
         
             
              autoload :Sigar,          'eye/sigar'
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
24 
     | 
    
         
             
              autoload :Controller,     'eye/controller'
         
     | 
| 
       26 
25 
     | 
    
         
             
              autoload :Control,        'eye/control'
         
     | 
| 
       27 
26 
     | 
    
         
             
              autoload :Cli,            'eye/cli'
         
     | 
    
        data/lib/eye/application.rb
    CHANGED
    
    | 
         @@ -21,13 +21,12 @@ class Eye::Application 
     | 
|
| 
       21 
21 
     | 
    
         
             
                @groups << group
         
     | 
| 
       22 
22 
     | 
    
         
             
              end
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
              # sort processes in name order
         
     | 
| 
       25 
24 
     | 
    
         
             
              def resort_groups
         
     | 
| 
       26 
     | 
    
         
            -
                @groups 
     | 
| 
      
 25 
     | 
    
         
            +
                @groups.sort! # used group method <=> to compare
         
     | 
| 
       27 
26 
     | 
    
         
             
              end
         
     | 
| 
       28 
27 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
              def status_data( 
     | 
| 
       30 
     | 
    
         
            -
                h = { name: @name, type: :application, subtree: @groups.map{|gr| gr.status_data( 
     | 
| 
      
 28 
     | 
    
         
            +
              def status_data(opts = {})
         
     | 
| 
      
 29 
     | 
    
         
            +
                h = { name: @name, type: :application, subtree: @groups.map { |gr| gr.status_data(opts) } }
         
     | 
| 
       31 
30 
     | 
    
         
             
                h[:debug] = debug_data if debug
         
     | 
| 
       32 
31 
     | 
    
         
             
                h
         
     | 
| 
       33 
32 
     | 
    
         
             
              end
         
     | 
| 
         @@ -53,13 +52,13 @@ class Eye::Application 
     | 
|
| 
       53 
52 
     | 
    
         | 
| 
       54 
53 
     | 
    
         
             
              def sub_object?(obj)
         
     | 
| 
       55 
54 
     | 
    
         
             
                res = @groups.include?(obj)
         
     | 
| 
       56 
     | 
    
         
            -
                res = @groups.any?{|gr| gr.sub_object?(obj)}  
     | 
| 
      
 55 
     | 
    
         
            +
                res = @groups.any? { |gr| gr.sub_object?(obj) } unless res
         
     | 
| 
       57 
56 
     | 
    
         
             
                res
         
     | 
| 
       58 
57 
     | 
    
         
             
              end
         
     | 
| 
       59 
58 
     | 
    
         | 
| 
       60 
59 
     | 
    
         
             
              def processes
         
     | 
| 
       61 
60 
     | 
    
         
             
                out = []
         
     | 
| 
       62 
     | 
    
         
            -
                @groups.each{|gr| out += gr.processes.to_a }
         
     | 
| 
      
 61 
     | 
    
         
            +
                @groups.each { |gr| out += gr.processes.to_a }
         
     | 
| 
       63 
62 
     | 
    
         
             
                Eye::Utils::AliveArray.new(out)
         
     | 
| 
       64 
63 
     | 
    
         
             
              end
         
     | 
| 
       65 
64 
     | 
    
         | 
    
        data/lib/eye/checker.rb
    CHANGED
    
    | 
         @@ -1,4 +1,5 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            class Eye::Checker
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       2 
3 
     | 
    
         
             
              include Eye::Dsl::Validation
         
     | 
| 
       3 
4 
     | 
    
         | 
| 
       4 
5 
     | 
    
         
             
              autoload :Memory,     'eye/checker/memory'
         
     | 
| 
         @@ -6,35 +7,35 @@ class Eye::Checker 
     | 
|
| 
       6 
7 
     | 
    
         
             
              autoload :Http,       'eye/checker/http'
         
     | 
| 
       7 
8 
     | 
    
         
             
              autoload :FileCTime,  'eye/checker/file_ctime'
         
     | 
| 
       8 
9 
     | 
    
         
             
              autoload :FileSize,   'eye/checker/file_size'
         
     | 
| 
       9 
     | 
    
         
            -
              autoload :FileTouched,'eye/checker/file_touched'
         
     | 
| 
      
 10 
     | 
    
         
            +
              autoload :FileTouched, 'eye/checker/file_touched'
         
     | 
| 
       10 
11 
     | 
    
         
             
              autoload :Socket,     'eye/checker/socket'
         
     | 
| 
       11 
12 
     | 
    
         
             
              autoload :SslSocket,  'eye/checker/ssl_socket'
         
     | 
| 
       12 
13 
     | 
    
         
             
              autoload :Nop,        'eye/checker/nop'
         
     | 
| 
       13 
14 
     | 
    
         
             
              autoload :Runtime,    'eye/checker/runtime'
         
     | 
| 
       14 
15 
     | 
    
         
             
              autoload :Cputime,    'eye/checker/cputime'
         
     | 
| 
       15 
16 
     | 
    
         
             
              autoload :ChildrenCount, 'eye/checker/children_count'
         
     | 
| 
       16 
     | 
    
         
            -
              autoload :ChildrenMemory,'eye/checker/children_memory'
         
     | 
| 
      
 17 
     | 
    
         
            +
              autoload :ChildrenMemory, 'eye/checker/children_memory'
         
     | 
| 
       17 
18 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
              TYPES = {: 
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
      
 19 
     | 
    
         
            +
              TYPES = { memory: 'Memory', cpu: 'Cpu', http: 'Http',
         
     | 
| 
      
 20 
     | 
    
         
            +
                        ctime: 'FileCTime', fsize: 'FileSize', file_touched: 'FileTouched',
         
     | 
| 
      
 21 
     | 
    
         
            +
                        socket: 'Socket', nop: 'Nop', runtime: 'Runtime', cputime: 'Cputime',
         
     | 
| 
      
 22 
     | 
    
         
            +
                        children_count: 'ChildrenCount', children_memory: 'ChildrenMemory', ssl_socket: 'SslSocket' }
         
     | 
| 
       22 
23 
     | 
    
         | 
| 
       23 
24 
     | 
    
         
             
              attr_accessor :value, :values, :options, :pid, :type, :check_count, :process
         
     | 
| 
       24 
25 
     | 
    
         | 
| 
       25 
26 
     | 
    
         
             
              param :every, [Fixnum, Float], false, 5
         
     | 
| 
       26 
27 
     | 
    
         
             
              param :times, [Fixnum, Array], nil, 1
         
     | 
| 
       27 
     | 
    
         
            -
              param :fires, [Symbol, Array], nil, nil, [:stop, :restart, :unmonitor, :start, :delete, :nothing, :notify]
         
     | 
| 
      
 28 
     | 
    
         
            +
              param :fires, [Symbol, Array, Proc], nil, nil, [:stop, :restart, :unmonitor, :start, :delete, :nothing, :notify]
         
     | 
| 
       28 
29 
     | 
    
         
             
              param :initial_grace, [Fixnum, Float]
         
     | 
| 
       29 
30 
     | 
    
         
             
              param :skip_initial_fails, [TrueClass, FalseClass]
         
     | 
| 
       30 
31 
     | 
    
         | 
| 
       31 
32 
     | 
    
         
             
              def self.name_and_class(type)
         
     | 
| 
       32 
33 
     | 
    
         
             
                type = type.to_sym
         
     | 
| 
       33 
     | 
    
         
            -
                return {: 
     | 
| 
      
 34 
     | 
    
         
            +
                return { name: type, type: type } if TYPES[type]
         
     | 
| 
       34 
35 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
                if type =~  
     | 
| 
       36 
     | 
    
         
            -
                  ctype =  
     | 
| 
       37 
     | 
    
         
            -
                  return {: 
     | 
| 
      
 36 
     | 
    
         
            +
                if type =~ %r[\A(.*?)_?[0-9]+\z]
         
     | 
| 
      
 37 
     | 
    
         
            +
                  ctype = Regexp.last_match(1).to_sym
         
     | 
| 
      
 38 
     | 
    
         
            +
                  return { name: type, type: ctype } if TYPES[ctype]
         
     | 
| 
       38 
39 
     | 
    
         
             
                end
         
     | 
| 
       39 
40 
     | 
    
         
             
              end
         
     | 
| 
       40 
41 
     | 
    
         | 
| 
         @@ -50,7 +51,7 @@ class Eye::Checker 
     | 
|
| 
       50 
51 
     | 
    
         
             
              def self.create(pid, options = {}, process = nil)
         
     | 
| 
       51 
52 
     | 
    
         
             
                get_class(options[:type]).new(pid, options, process)
         
     | 
| 
       52 
53 
     | 
    
         | 
| 
       53 
     | 
    
         
            -
              rescue  
     | 
| 
      
 54 
     | 
    
         
            +
              rescue Object => ex
         
     | 
| 
       54 
55 
     | 
    
         
             
                log_ex(ex)
         
     | 
| 
       55 
56 
     | 
    
         
             
                nil
         
     | 
| 
       56 
57 
     | 
    
         
             
              end
         
     | 
| 
         @@ -79,11 +80,11 @@ class Eye::Checker 
     | 
|
| 
       79 
80 
     | 
    
         
             
              end
         
     | 
| 
       80 
81 
     | 
    
         | 
| 
       81 
82 
     | 
    
         
             
              def logger_tag
         
     | 
| 
       82 
     | 
    
         
            -
                @process.logger.prefix  
     | 
| 
      
 83 
     | 
    
         
            +
                @logger_tag ||= @process ? @process.logger.prefix : nil
         
     | 
| 
       83 
84 
     | 
    
         
             
              end
         
     | 
| 
       84 
85 
     | 
    
         | 
| 
       85 
86 
     | 
    
         
             
              def logger_sub_tag
         
     | 
| 
       86 
     | 
    
         
            -
                "check:#{check_name}"
         
     | 
| 
      
 87 
     | 
    
         
            +
                @logger_sub_tag ||= "check:#{check_name}"
         
     | 
| 
       87 
88 
     | 
    
         
             
              end
         
     | 
| 
       88 
89 
     | 
    
         | 
| 
       89 
90 
     | 
    
         
             
              def last_human_values
         
     | 
| 
         @@ -96,22 +97,24 @@ class Eye::Checker 
     | 
|
| 
       96 
97 
     | 
    
         
             
              end
         
     | 
| 
       97 
98 
     | 
    
         | 
| 
       98 
99 
     | 
    
         
             
              def check
         
     | 
| 
       99 
     | 
    
         
            -
                if initial_grace 
     | 
| 
       100 
     | 
    
         
            -
                   
     | 
| 
       101 
     | 
    
         
            -
             
     | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
       103 
     | 
    
         
            -
                   
     | 
| 
      
 100 
     | 
    
         
            +
                if initial_grace
         
     | 
| 
      
 101 
     | 
    
         
            +
                  if Time.now - @initialized_at < initial_grace
         
     | 
| 
      
 102 
     | 
    
         
            +
                    debug { 'skipped initial grace' }
         
     | 
| 
      
 103 
     | 
    
         
            +
                    return true
         
     | 
| 
      
 104 
     | 
    
         
            +
                  else
         
     | 
| 
      
 105 
     | 
    
         
            +
                    @options[:initial_grace] = nil
         
     | 
| 
      
 106 
     | 
    
         
            +
                  end
         
     | 
| 
       104 
107 
     | 
    
         
             
                end
         
     | 
| 
       105 
108 
     | 
    
         | 
| 
       106 
109 
     | 
    
         
             
                @value = get_value_safe
         
     | 
| 
       107 
110 
     | 
    
         
             
                @good_value = good?(value)
         
     | 
| 
       108 
     | 
    
         
            -
                @values << {: 
     | 
| 
      
 111 
     | 
    
         
            +
                @values << { value: @value, good: @good_value }
         
     | 
| 
       109 
112 
     | 
    
         | 
| 
       110 
113 
     | 
    
         
             
                result = true
         
     | 
| 
       111 
114 
     | 
    
         
             
                @check_count += 1
         
     | 
| 
       112 
115 
     | 
    
         | 
| 
       113 
116 
     | 
    
         
             
                if @values.size == max_tries
         
     | 
| 
       114 
     | 
    
         
            -
                  bad_count = @values.count{|v| !v[:good] }
         
     | 
| 
      
 117 
     | 
    
         
            +
                  bad_count = @values.count { |v| !v[:good] }
         
     | 
| 
       115 
118 
     | 
    
         
             
                  result = false if bad_count >= min_tries
         
     | 
| 
       116 
119 
     | 
    
         
             
                end
         
     | 
| 
       117 
120 
     | 
    
         | 
| 
         @@ -123,10 +126,10 @@ class Eye::Checker 
     | 
|
| 
       123 
126 
     | 
    
         
             
                  end
         
     | 
| 
       124 
127 
     | 
    
         
             
                end
         
     | 
| 
       125 
128 
     | 
    
         | 
| 
       126 
     | 
    
         
            -
                info "#{last_human_values} => #{result ? 'OK' : 'Fail'}"
         
     | 
| 
      
 129 
     | 
    
         
            +
                info { "#{last_human_values} => #{result ? 'OK' : 'Fail'}" }
         
     | 
| 
       127 
130 
     | 
    
         
             
                result
         
     | 
| 
       128 
131 
     | 
    
         | 
| 
       129 
     | 
    
         
            -
              rescue  
     | 
| 
      
 132 
     | 
    
         
            +
              rescue Object => ex
         
     | 
| 
       130 
133 
     | 
    
         
             
                log_ex(ex)
         
     | 
| 
       131 
134 
     | 
    
         
             
              end
         
     | 
| 
       132 
135 
     | 
    
         | 
| 
         @@ -189,7 +192,12 @@ class Eye::Checker 
     | 
|
| 
       189 
192 
     | 
    
         
             
                process.notify :warn, "Bounded #{check_name}: #{last_human_values} send to #{actions}"
         
     | 
| 
       190 
193 
     | 
    
         | 
| 
       191 
194 
     | 
    
         
             
                actions.each do |action|
         
     | 
| 
       192 
     | 
    
         
            -
                   
     | 
| 
      
 195 
     | 
    
         
            +
                  reason = Eye::Reason.new("bounded #{check_name}")
         
     | 
| 
      
 196 
     | 
    
         
            +
                  if action.is_a?(Proc)
         
     | 
| 
      
 197 
     | 
    
         
            +
                    process.schedule :execute_proc, reason, &action
         
     | 
| 
      
 198 
     | 
    
         
            +
                  else
         
     | 
| 
      
 199 
     | 
    
         
            +
                    process.schedule action, reason
         
     | 
| 
      
 200 
     | 
    
         
            +
                  end
         
     | 
| 
       193 
201 
     | 
    
         
             
                end
         
     | 
| 
       194 
202 
     | 
    
         
             
              end
         
     | 
| 
       195 
203 
     | 
    
         | 
| 
         @@ -198,9 +206,11 @@ class Eye::Checker 
     | 
|
| 
       198 
206 
     | 
    
         
             
              end
         
     | 
| 
       199 
207 
     | 
    
         | 
| 
       200 
208 
     | 
    
         
             
              class Defer < Eye::Checker
         
     | 
| 
      
 209 
     | 
    
         
            +
             
     | 
| 
       201 
210 
     | 
    
         
             
                def get_value_safe
         
     | 
| 
       202 
     | 
    
         
            -
                  Celluloid::Future.new{ get_value }.value
         
     | 
| 
      
 211 
     | 
    
         
            +
                  Celluloid::Future.new { get_value }.value
         
     | 
| 
       203 
212 
     | 
    
         
             
                end
         
     | 
| 
      
 213 
     | 
    
         
            +
             
     | 
| 
       204 
214 
     | 
    
         
             
              end
         
     | 
| 
       205 
215 
     | 
    
         | 
| 
       206 
216 
     | 
    
         
             
              def self.register(base)
         
     | 
| 
         @@ -214,27 +224,34 @@ class Eye::Checker 
     | 
|
| 
       214 
224 
     | 
    
         
             
              end
         
     | 
| 
       215 
225 
     | 
    
         | 
| 
       216 
226 
     | 
    
         
             
              class CustomCell < Eye::Checker
         
     | 
| 
      
 227 
     | 
    
         
            +
             
     | 
| 
       217 
228 
     | 
    
         
             
                def self.inherited(base)
         
     | 
| 
       218 
229 
     | 
    
         
             
                  super
         
     | 
| 
       219 
230 
     | 
    
         
             
                  register(base)
         
     | 
| 
       220 
231 
     | 
    
         
             
                end
         
     | 
| 
      
 232 
     | 
    
         
            +
             
     | 
| 
       221 
233 
     | 
    
         
             
              end
         
     | 
| 
       222 
234 
     | 
    
         | 
| 
       223 
235 
     | 
    
         
             
              class Custom < Defer
         
     | 
| 
      
 236 
     | 
    
         
            +
             
     | 
| 
       224 
237 
     | 
    
         
             
                def self.inherited(base)
         
     | 
| 
       225 
238 
     | 
    
         
             
                  super
         
     | 
| 
       226 
239 
     | 
    
         
             
                  register(base)
         
     | 
| 
       227 
240 
     | 
    
         
             
                end
         
     | 
| 
      
 241 
     | 
    
         
            +
             
     | 
| 
       228 
242 
     | 
    
         
             
              end
         
     | 
| 
       229 
243 
     | 
    
         | 
| 
       230 
244 
     | 
    
         
             
              class CustomDefer < Defer
         
     | 
| 
      
 245 
     | 
    
         
            +
             
     | 
| 
       231 
246 
     | 
    
         
             
                def self.inherited(base)
         
     | 
| 
       232 
247 
     | 
    
         
             
                  super
         
     | 
| 
       233 
248 
     | 
    
         
             
                  register(base)
         
     | 
| 
       234 
249 
     | 
    
         
             
                end
         
     | 
| 
      
 250 
     | 
    
         
            +
             
     | 
| 
       235 
251 
     | 
    
         
             
              end
         
     | 
| 
       236 
252 
     | 
    
         | 
| 
       237 
253 
     | 
    
         
             
              class Measure < Eye::Checker
         
     | 
| 
      
 254 
     | 
    
         
            +
             
     | 
| 
       238 
255 
     | 
    
         
             
                param :below, [Fixnum, Float]
         
     | 
| 
       239 
256 
     | 
    
         
             
                param :above, [Fixnum, Float]
         
     | 
| 
       240 
257 
     | 
    
         | 
| 
         @@ -255,5 +272,7 @@ class Eye::Checker 
     | 
|
| 
       255 
272 
     | 
    
         
             
                    '-'
         
     | 
| 
       256 
273 
     | 
    
         
             
                  end
         
     | 
| 
       257 
274 
     | 
    
         
             
                end
         
     | 
| 
      
 275 
     | 
    
         
            +
             
     | 
| 
       258 
276 
     | 
    
         
             
              end
         
     | 
| 
      
 277 
     | 
    
         
            +
             
     | 
| 
       259 
278 
     | 
    
         
             
            end
         
     |