doorkeepr-watcher 0.1.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: 78d7bf81120533eecae38fc64f67c510168d08e5
4
+ data.tar.gz: c7cc22bc7375b0864cb0d7b368fa20f2a0804df6
5
+ SHA512:
6
+ metadata.gz: f9f59b16ac1febe9013bea700aa953357c1e5e084d1bafb8c9c681b8533b6a57c59fbc66eeab7040c4a37316e72f2b6b0f6cc5df17614708cc0e04de7b487a3e
7
+ data.tar.gz: 2a9c06b6e64b88677b74c2b93ca8906de6f5190173b37ce557067382a2bba2e92d99c29812c05f7b87ff77b49ea84d571c4bb9e06478edee8b3565808dc84abe
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.1
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in doorkeepr-watcher.gemspec
4
+ gemspec
@@ -0,0 +1,39 @@
1
+ # Doorkeepr::Watcher
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/doorkeepr/watcher`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'doorkeepr-watcher'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install doorkeepr-watcher
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ 1. Fork it ( https://github.com/[my-github-username]/doorkeepr-watcher/fork )
36
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
37
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
38
+ 4. Push to the branch (`git push origin my-new-feature`)
39
+ 5. Create a new Pull Request
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "doorkeepr/watcher"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ require "pry"
11
+ Pry.start
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'doorkeepr/watcher/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "doorkeepr-watcher"
8
+ spec.version = Doorkeepr::Watcher::VERSION
9
+ spec.authors = ["Mathias Kaufmann"]
10
+ spec.email = ["me@stei.gr"]
11
+
12
+ spec.summary = %q{Doorkeepr Watcher Agent}
13
+ spec.description = %q{Doorkeepr Watcher Agent}
14
+ spec.homepage = "https://doorkeepr.stei.gr/watcher"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "entrance-watcher"
22
+ spec.add_dependency "entrance-publisher"
23
+ spec.add_dependency "resolv-consul"
24
+ spec.add_dependency "thor"
25
+ spec.add_dependency "unirest"
26
+ spec.add_dependency "activesupport"
27
+ spec.add_dependency "boutons"
28
+ spec.add_dependency "synapse-easy"
29
+
30
+ spec.add_development_dependency "bundler", "~> 1.8"
31
+ spec.add_development_dependency "rake", "~> 10.0"
32
+ spec.add_development_dependency "pry"
33
+ end
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "doorkeepr/watcher/cli"
5
+
6
+ Doorkeepr::Watcher::Cli.start
@@ -0,0 +1,8 @@
1
+ require "doorkeepr/watcher/version"
2
+ require "doorkeepr/watcher/config"
3
+ require "doorkeepr/watcher/agent"
4
+ require "doorkeepr/watcher/cli"
5
+ require "doorkeepr/watcher/customer"
6
+ require "doorkeepr/watcher/application"
7
+ require "doorkeepr/watcher/service"
8
+ require "doorkeepr/watcher/event"
@@ -0,0 +1,63 @@
1
+ require "entrance/publisher"
2
+ require "entrance/watcher"
3
+ require "doorkeepr/watcher/config"
4
+ require "doorkeepr/watcher/customer"
5
+ require "doorkeepr/watcher/application"
6
+ require "doorkeepr/watcher/service"
7
+ require "doorkeepr/watcher/event"
8
+
9
+ module Doorkeepr
10
+ module Watcher
11
+ class Agent
12
+ def callback
13
+ Proc.new do |caller|
14
+ self.process caller
15
+ end
16
+ end
17
+ def process caller
18
+ Event.cycle += 1
19
+ # update or build services
20
+ update caller
21
+ # inform frontend servers
22
+ inform caller
23
+ end
24
+ def update caller
25
+ puts "rescan announcements"
26
+ caller.services do |srv|
27
+ puts "http://#{srv.url} => http://#{srv.host}:#{srv.port} (#{srv.application}://#{srv.customer}/#{srv.function}) via #{srv.zk_path}"
28
+ customer = Customer.find_or_create_by(name:srv.customer)
29
+ application = Application.find_or_create_by(name:srv.application,customer_id:customer.id)
30
+ service = Service.find_or_create_by(name:srv.function,application_id:application.id)
31
+ service.host = srv.host
32
+ service.port = srv.port
33
+ service.url = srv.url
34
+ service.zk_path = srv.zk_path
35
+ service.save
36
+ end
37
+ end
38
+ def inform caller
39
+ puts "publish services"
40
+ publisher.publish
41
+ end
42
+ def publisher
43
+ params = {
44
+ name: "entrance-notifier",
45
+ host: Boutons.doorkeepr.host,
46
+ port: Boutons.doorkeepr.port
47
+ }
48
+ @publisher ||= Entrance::Publisher::Agent.new Config.current.publish_path, params
49
+ end
50
+ def watcher
51
+ @watcher ||= Entrance::Watcher::Agent.new Config.current.watch_path, name: "doorkeeper-publisher"
52
+ end
53
+ def start
54
+ publisher.start
55
+ watcher.callback = callback
56
+ watcher.start
57
+ loop do
58
+ sleep 1
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,11 @@
1
+ require "doorkeepr/watcher/customer"
2
+ require "doorkeepr/watcher/rest_resource"
3
+
4
+ module Doorkeepr
5
+ module Watcher
6
+ class Application < RestResource
7
+ belongs_to :customer
8
+ self.parent = Customer
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,22 @@
1
+ require "boutons"
2
+ require "synapse/easy"
3
+ require "doorkeepr/watcher/config"
4
+
5
+ module Doorkeepr
6
+ module Watcher
7
+ module Bouton
8
+ attr_accessor :customer, :application, :function
9
+ def config
10
+ @mode ||= :tcp
11
+ @function ||= "common"
12
+ @application ||= self.class.name.split("::").last
13
+ @customer ||= "global"
14
+ Synapse::Easy::Service.new customer: @customer,
15
+ application: @application,
16
+ function: @function,
17
+ mode: @mode,
18
+ uri: @uri
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,14 @@
1
+ require "doorkeepr/watcher/agent"
2
+ require "thor"
3
+
4
+ module Doorkeepr
5
+ module Watcher
6
+ class Cli < Thor
7
+ desc "start","Starts the annoucement watcher"
8
+ def start
9
+ agent = Agent.new
10
+ agent.start
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,54 @@
1
+ require "resolv/consul"
2
+ require "doorkeepr/watcher/zookeeper"
3
+ require "doorkeepr/watcher/doorkeepr"
4
+ require "unirest"
5
+
6
+ module Doorkeepr
7
+ module Watcher
8
+ class Config
9
+ class << self
10
+ attr_accessor :current
11
+ end
12
+ attr_accessor :publish_path, :watch_path, :api_headers, :user_agent,
13
+ :api_path, :application, :customer, :function
14
+ attr_writer :doorkeepr_server
15
+ def initialize
16
+ @watch_path = "/doorkeepr/publish"
17
+ @publish_path = "/doorkeepr/entrance"
18
+ @api_headers = {
19
+ "X-Doorkeepr-API" => 1,
20
+ "Accept" => 'application/json',
21
+ }
22
+ @api_path = "api"
23
+ @api_timeout = 5
24
+ @user_agent = "Doorkeepr Watcher 1"
25
+ @doorkeepr_server = "localhost:3000"
26
+ @doorkeepr_customer = ENV["USER"]
27
+ @doorkeepr_service = "rails"
28
+ end
29
+ def zk_hosts
30
+ Resolv::Consul.services(:zookeeper)
31
+ end
32
+ def doorkeepr_server
33
+ Pathname.new(Boutons.doorkeepr.to_s || @doorkeepr_server)
34
+ end
35
+ def api_url
36
+ doorkeepr_server.join(api_path)
37
+ end
38
+ def url_for *elements
39
+ api_url.join(elements.join("/")).to_s
40
+ end
41
+ def method_missing method, *args, &block
42
+ return self.instance_variable_get("@#{method}")
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ Doorkeepr::Watcher::Config.current ||= Doorkeepr::Watcher::Config.new
49
+ Doorkeepr::Watcher::Zookeeper.new
50
+ Doorkeepr::Watcher::Doorkeepr.new
51
+ Unirest.timeout(Doorkeepr::Watcher::Config.current.api_timeout)
52
+ Doorkeepr::Watcher::Config.current.api_headers.each do |header,value|
53
+ Unirest.default_header header,value
54
+ end
@@ -0,0 +1,8 @@
1
+ require "doorkeepr/watcher/rest_resource"
2
+
3
+ module Doorkeepr
4
+ module Watcher
5
+ class Customer < RestResource
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,17 @@
1
+ require "doorkeepr/watcher/bouton"
2
+
3
+ module Doorkeepr
4
+ module Watcher
5
+ class Doorkeepr
6
+ include Bouton
7
+ def initialize
8
+ @customer = Config.current.doorkeepr_customer
9
+ @application = "doorkeepr"
10
+ @function = Config.current.doorkeepr_service
11
+ @mode = :http
12
+ @uri = "/doorkeepr"
13
+ Boutons.add config
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ module Doorkeepr
2
+ module Watcher
3
+ module Event
4
+ class << self
5
+ def cycle
6
+ @cycle || 1
7
+ end
8
+ def cycle= cycle
9
+ @cycle = ( cycle.to_i || 1 )
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,171 @@
1
+ require "doorkeepr/watcher/config"
2
+ require "doorkeepr/watcher/event"
3
+ require "unirest"
4
+ require "active_support/core_ext/class/attribute_accessors"
5
+ require "active_support/core_ext/string/inflections"
6
+ require "active_support/core_ext/module/introspection"
7
+ require "ostruct"
8
+
9
+ module Doorkeepr
10
+ module Watcher
11
+ class RestResource < OpenStruct
12
+ class << self
13
+ attr_accessor :parent
14
+ attr_writer :data
15
+ attr_accessor :cycle
16
+ def data
17
+ update if (self.cycle||0) < Event.cycle
18
+ @data
19
+ end
20
+ def first
21
+ self.data.values.first
22
+ end
23
+ def last
24
+ self.data.values.last
25
+ end
26
+ def all
27
+ self.data.values
28
+ end
29
+ def collection_name
30
+ resource_name.pluralize
31
+ end
32
+ def resource_name
33
+ self.name.split("::").last.underscore
34
+ end
35
+ def resource_id_label
36
+ "#{resource_name}_ids"
37
+ end
38
+ def update
39
+ result_data = {}
40
+ if parent
41
+ parent.data.each do |id,parent_data|
42
+ parent_data[resource_id_label].each do |instance_id|
43
+ url = Config.current.url_for(collection_name,instance_id.values.first)
44
+ tries = 0
45
+ begin
46
+ response = Unirest.get(url)
47
+ raise Exception if response.code != 200
48
+ rescue Exception
49
+ if tries < 100
50
+ tries += 1
51
+ sleep 0.5
52
+ retry
53
+ end
54
+ end
55
+ http_data = response.body[resource_name]
56
+ result_data[http_data["id"]] = self.new http_data.merge(persisted:true)
57
+ end
58
+ end
59
+ else
60
+ url = Config.current.url_for(collection_name)
61
+ tries = 0
62
+ begin
63
+ response = Unirest.get(url)
64
+ raise Exception if response.code != 200
65
+ rescue
66
+ if tries < 100
67
+ tries += 1
68
+ sleep 0.5
69
+ retry
70
+ end
71
+ end
72
+
73
+ collection_data = response.body
74
+ collection_data[collection_name].each do |instance_data|
75
+ http_data = instance_data[resource_name]
76
+ result_data[http_data["id"]] = self.new http_data.merge(persisted:true)
77
+ end
78
+ end
79
+ self.data = result_data
80
+ self.cycle = Event.cycle += 1
81
+ end
82
+ def where params
83
+ data.values.select do |instance|
84
+ params.map{|k,v| instance.send(k) == v }.reduce(:&)
85
+ end
86
+ end
87
+ def find_by params
88
+ where(params).first
89
+ end
90
+ def find id
91
+ where(id:id).first
92
+ end
93
+ def find_or_create_by params={}
94
+ result = find_by params
95
+ result ||= self.new params.merge(persisted:false)
96
+ result.save
97
+ result
98
+ end
99
+ def find_or_create id
100
+ find_or_create_by id: id
101
+ end
102
+ def create params={}
103
+ self.new(params).save
104
+ end
105
+ def belongs_to instance_name
106
+ @associations ||= []
107
+ @associations << instance_name
108
+ end
109
+ def associations
110
+ @associations ||= []
111
+ end
112
+ end
113
+ def save
114
+ if persisted
115
+ Unirest.put(url,parameters:to_h)
116
+ else
117
+ http_data = Unirest.post(url,parameters:to_h).body[self.class.resource_name]
118
+ update_instance http_data
119
+ end
120
+ self
121
+ end
122
+ def reload
123
+ update_instance Unirest.get(url).body[self.class.resource_name]
124
+ self
125
+ end
126
+ def delete
127
+ Unirest.delete(url) if persisted
128
+ self.class.data.delete(id) if id
129
+ self.persisted = false
130
+ self
131
+ end
132
+ def url
133
+ return Config.current.url_for(self.class.collection_name,id) if persisted
134
+ return Config.current.url_for(self.class.collection_name) if self.class.associations.empty?
135
+ if self.class.associations.count == 1
136
+ association_name = self.class.associations.first
137
+ return self.send(association_name).url + "/#{self.class.collection_name}"
138
+ end
139
+ end
140
+ def update_instance params={}
141
+ return unless params
142
+ ap params, raw: true
143
+ @table = @table.merge params
144
+ end
145
+ def to_h
146
+ { self.class.resource_name => filtered_attributes }
147
+ end
148
+ def filtered_attributes
149
+ result = @table
150
+ result = result.except(:id,:persisted)
151
+ result = result.reject{|k,v| [/_ids$/].map{|r| true if k =~ r}.reduce(:|) }
152
+ result = result.reject{|k,v| v.is_a? RestResource }
153
+ result
154
+ end
155
+ def method_missing method, *args, &block
156
+ if self.class.associations.include? method
157
+ if @table[:"#{method}_id"]
158
+ klass = "#{self.class.parent_name}::#{method.to_s.classify}".constantize
159
+ @table[method] = klass.find(@table[:"#{method}_id"])
160
+ return @table[method]
161
+ end
162
+ end
163
+ if method =~ /=$/
164
+ @table.[]= method.to_s.sub(/=$/,''), *args
165
+ else
166
+ @table.[] method.to_s
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,11 @@
1
+ require "doorkeepr/watcher/application"
2
+ require "doorkeepr/watcher/rest_resource"
3
+
4
+ module Doorkeepr
5
+ module Watcher
6
+ class Service < RestResource
7
+ belongs_to :application
8
+ self.parent = Application
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ module Doorkeepr
2
+ module Watcher
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ require "doorkeepr/watcher/bouton"
2
+
3
+ module Doorkeepr
4
+ module Watcher
5
+ class Zookeeper
6
+ include Bouton
7
+ def initialize
8
+ @customer = ENV["CUSTOMER"]
9
+ @application = "zookeeper"
10
+ Boutons.add config
11
+ end
12
+ end
13
+ end
14
+ end
metadata ADDED
@@ -0,0 +1,220 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: doorkeepr-watcher
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mathias Kaufmann
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-04-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: entrance-watcher
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: entrance-publisher
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: resolv-consul
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: thor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: unirest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activesupport
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: boutons
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: synapse-easy
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: bundler
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.8'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.8'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rake
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '10.0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '10.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: pry
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: Doorkeepr Watcher Agent
168
+ email:
169
+ - me@stei.gr
170
+ executables:
171
+ - doorkeeper-watcher
172
+ extensions: []
173
+ extra_rdoc_files: []
174
+ files:
175
+ - ".gitignore"
176
+ - ".travis.yml"
177
+ - Gemfile
178
+ - README.md
179
+ - Rakefile
180
+ - bin/console
181
+ - bin/setup
182
+ - doorkeepr-watcher.gemspec
183
+ - exe/doorkeeper-watcher
184
+ - lib/doorkeepr/watcher.rb
185
+ - lib/doorkeepr/watcher/agent.rb
186
+ - lib/doorkeepr/watcher/application.rb
187
+ - lib/doorkeepr/watcher/bouton.rb
188
+ - lib/doorkeepr/watcher/cli.rb
189
+ - lib/doorkeepr/watcher/config.rb
190
+ - lib/doorkeepr/watcher/customer.rb
191
+ - lib/doorkeepr/watcher/doorkeepr.rb
192
+ - lib/doorkeepr/watcher/event.rb
193
+ - lib/doorkeepr/watcher/rest_resource.rb
194
+ - lib/doorkeepr/watcher/service.rb
195
+ - lib/doorkeepr/watcher/version.rb
196
+ - lib/doorkeepr/watcher/zookeeper.rb
197
+ homepage: https://doorkeepr.stei.gr/watcher
198
+ licenses: []
199
+ metadata: {}
200
+ post_install_message:
201
+ rdoc_options: []
202
+ require_paths:
203
+ - lib
204
+ required_ruby_version: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ required_rubygems_version: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - ">="
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ requirements: []
215
+ rubyforge_project:
216
+ rubygems_version: 2.4.6
217
+ signing_key:
218
+ specification_version: 4
219
+ summary: Doorkeepr Watcher Agent
220
+ test_files: []