api-harvester 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1c3cf94bfe071aeb31bbd6d099233a5337b19d68
4
+ data.tar.gz: 661f5f04cce3e0eb9a76bda402cfd68d59e3c17c
5
+ SHA512:
6
+ metadata.gz: 4af8693fb8daee99347534316ce89859bfa31aee2cad50fbbf7565a08cf43bdebcc1e78bc7c37be237654e9b1b9c87ee7fb79c8e5d8398354422f1cec187bb75
7
+ data.tar.gz: 8bfd3ec9d48a8740235ed1f8bf1371175d1c2554416ec0e11b8459b9c77d98baba926a61a3d7b42ea2b46004da64c6b077c95eac9e9b46bba973624880486cb3
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.gitignore ADDED
@@ -0,0 +1,50 @@
1
+ # rcov generated
2
+ coverage
3
+ coverage.data
4
+
5
+ # rdoc generated
6
+ rdoc
7
+
8
+ # yard generated
9
+ doc
10
+ .yardoc
11
+
12
+ # bundler
13
+ .bundle
14
+ vendor
15
+ # jeweler generated
16
+ pkg
17
+
18
+ harvester.yaml
19
+ # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
20
+ #
21
+ # * Create a file at ~/.gitignore
22
+ # * Include files you want ignored
23
+ # * Run: git config --global core.excludesfile ~/.gitignore
24
+ #
25
+ # After doing this, these files will be ignored in all your git projects,
26
+ # saving you from having to 'pollute' every project you touch with them
27
+ #
28
+ # Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
29
+ #
30
+ # For MacOS:
31
+ #
32
+ .DS_Store
33
+
34
+ # For TextMate
35
+ #*.tmproj
36
+ #tmtags
37
+
38
+ # For emacs:
39
+ #*~
40
+ #\#*
41
+ #.\#*
42
+
43
+ # For vim:
44
+ #*.swp
45
+
46
+ # For redcar:
47
+ #.redcar
48
+
49
+ # For rubinius:
50
+ #*.rbc
data/Gemfile ADDED
@@ -0,0 +1,28 @@
1
+ source 'http://rubygems.org'
2
+ group :development do
3
+ gem "shoulda", ">= 0"
4
+ gem "rdoc", "~> 3.12"
5
+ gem "bundler", "~> 1.0"
6
+ gem "jeweler", "~> 2.0.1"
7
+ gem "simplecov", ">= 0"
8
+ gem 'pry'
9
+ gem 'pry-nav'
10
+ end
11
+
12
+
13
+ gem 'faraday'
14
+ gem 'excon'
15
+ gem 'commander'
16
+ gem 'ezmq'
17
+ gem 'msgpack'
18
+
19
+
20
+ gem 'influxdb', '~> 0.1.9'
21
+ gem 'eye'
22
+ gem 'moneta'
23
+ gem 'sinatra'
24
+ gem 'rainbow'
25
+ gem 'oj'
26
+
27
+ gem 'terminal-announce'
28
+ gem 'settingslogic'
data/Gemfile.lock ADDED
@@ -0,0 +1,154 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activesupport (4.2.3)
5
+ i18n (~> 0.7)
6
+ json (~> 1.7, >= 1.7.7)
7
+ minitest (~> 5.1)
8
+ thread_safe (~> 0.3, >= 0.3.4)
9
+ tzinfo (~> 1.1)
10
+ addressable (2.3.8)
11
+ builder (3.2.2)
12
+ cause (0.1)
13
+ celluloid (0.15.2)
14
+ timers (~> 1.1.0)
15
+ celluloid-io (0.15.0)
16
+ celluloid (>= 0.15.0)
17
+ nio4r (>= 0.5.0)
18
+ coderay (1.1.0)
19
+ commander (4.3.4)
20
+ highline (~> 1.7.2)
21
+ contracts (0.11.0)
22
+ descendants_tracker (0.0.4)
23
+ thread_safe (~> 0.3, >= 0.3.1)
24
+ docile (1.1.5)
25
+ excon (0.45.4)
26
+ eye (0.6.4)
27
+ celluloid (~> 0.15.0)
28
+ celluloid-io (~> 0.15.0)
29
+ sigar (~> 0.7.2)
30
+ state_machine
31
+ thor
32
+ ezmq (0.4.4)
33
+ ffi-rzmq (~> 2.0)
34
+ faraday (0.9.1)
35
+ multipart-post (>= 1.2, < 3)
36
+ ffi (1.9.10)
37
+ ffi-rzmq (2.0.4)
38
+ ffi-rzmq-core (>= 1.0.1)
39
+ ffi-rzmq-core (1.0.3)
40
+ ffi (~> 1.9)
41
+ git (1.2.9.1)
42
+ github_api (0.12.4)
43
+ addressable (~> 2.3)
44
+ descendants_tracker (~> 0.0.4)
45
+ faraday (~> 0.8, < 0.10)
46
+ hashie (>= 3.4)
47
+ multi_json (>= 1.7.5, < 2.0)
48
+ nokogiri (~> 1.6.6)
49
+ oauth2
50
+ hashie (3.4.2)
51
+ highline (1.7.2)
52
+ i18n (0.7.0)
53
+ influxdb (0.1.9)
54
+ cause
55
+ json
56
+ jeweler (2.0.1)
57
+ builder
58
+ bundler (>= 1.0)
59
+ git (>= 1.2.5)
60
+ github_api
61
+ highline (>= 1.6.15)
62
+ nokogiri (>= 1.5.10)
63
+ rake
64
+ rdoc
65
+ json (1.8.3)
66
+ jwt (1.5.1)
67
+ method_source (0.8.2)
68
+ mini_portile (0.6.2)
69
+ minitest (5.8.0)
70
+ moneta (0.8.0)
71
+ msgpack (0.6.2)
72
+ multi_json (1.11.2)
73
+ multi_xml (0.5.5)
74
+ multipart-post (2.0.0)
75
+ nio4r (1.1.1)
76
+ nokogiri (1.6.6.2)
77
+ mini_portile (~> 0.6.0)
78
+ oauth2 (1.0.0)
79
+ faraday (>= 0.8, < 0.10)
80
+ jwt (~> 1.0)
81
+ multi_json (~> 1.3)
82
+ multi_xml (~> 0.5)
83
+ rack (~> 1.2)
84
+ oj (2.12.10)
85
+ pry (0.10.1)
86
+ coderay (~> 1.1.0)
87
+ method_source (~> 0.8.1)
88
+ slop (~> 3.4)
89
+ pry-nav (0.2.4)
90
+ pry (>= 0.9.10, < 0.11.0)
91
+ rack (1.6.4)
92
+ rack-protection (1.5.3)
93
+ rack
94
+ rainbow (2.0.0)
95
+ rake (10.4.2)
96
+ rdoc (3.12.2)
97
+ json (~> 1.4)
98
+ settingslogic (2.0.9)
99
+ shoulda (3.5.0)
100
+ shoulda-context (~> 1.0, >= 1.0.1)
101
+ shoulda-matchers (>= 1.4.1, < 3.0)
102
+ shoulda-context (1.2.1)
103
+ shoulda-matchers (2.8.0)
104
+ activesupport (>= 3.0.0)
105
+ sigar (0.7.3)
106
+ simplecov (0.10.0)
107
+ docile (~> 1.1.0)
108
+ json (~> 1.8)
109
+ simplecov-html (~> 0.10.0)
110
+ simplecov-html (0.10.0)
111
+ sinatra (1.4.6)
112
+ rack (~> 1.4)
113
+ rack-protection (~> 1.4)
114
+ tilt (>= 1.3, < 3)
115
+ slop (3.6.0)
116
+ state_machine (1.2.0)
117
+ terminal-announce (1.0.0)
118
+ bundler
119
+ contracts
120
+ rainbow
121
+ thor (0.19.1)
122
+ thread_safe (0.3.5)
123
+ tilt (2.0.1)
124
+ timers (1.1.0)
125
+ tzinfo (1.2.2)
126
+ thread_safe (~> 0.1)
127
+
128
+ PLATFORMS
129
+ ruby
130
+
131
+ DEPENDENCIES
132
+ bundler (~> 1.0)
133
+ commander
134
+ excon
135
+ eye
136
+ ezmq
137
+ faraday
138
+ influxdb (~> 0.1.9)
139
+ jeweler (~> 2.0.1)
140
+ moneta
141
+ msgpack
142
+ oj
143
+ pry
144
+ pry-nav
145
+ rainbow
146
+ rdoc (~> 3.12)
147
+ settingslogic
148
+ shoulda
149
+ simplecov
150
+ sinatra
151
+ terminal-announce
152
+
153
+ BUNDLED WITH
154
+ 1.10.4
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2015 kkwoker
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1 @@
1
+ harvest key_transactions --from https://api.newrelic.com/v2/key_transactions.json --every 5s
data/Rakefile ADDED
@@ -0,0 +1,51 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
17
+ gem.name = "harvester"
18
+ gem.homepage = "http://github.com/kkwoker/harvester"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{TODO: one-line summary of your gem}
21
+ gem.description = %Q{TODO: longer description of your gem}
22
+ gem.email = "kkwoker@gmail.com"
23
+ gem.authors = ["kkwoker"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rake/testtask'
29
+ Rake::TestTask.new(:test) do |test|
30
+ test.libs << 'lib' << 'test'
31
+ test.pattern = 'test/**/test_*.rb'
32
+ test.verbose = true
33
+ end
34
+
35
+ desc "Code coverage detail"
36
+ task :simplecov do
37
+ ENV['COVERAGE'] = "true"
38
+ Rake::Task['test'].execute
39
+ end
40
+
41
+ task :default => :test
42
+
43
+ require 'rdoc/task'
44
+ Rake::RDocTask.new do |rdoc|
45
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
46
+
47
+ rdoc.rdoc_dir = 'rdoc'
48
+ rdoc.title = "harvester #{version}"
49
+ rdoc.rdoc_files.include('README*')
50
+ rdoc.rdoc_files.include('lib/**/*.rb')
51
+ end
@@ -0,0 +1,29 @@
1
+ Gem::Specification.new do |gem|
2
+ gem.name = 'api-harvester'
3
+ gem.version = '0.0.1'
4
+ gem.licenses = 'MIT'
5
+ gem.authors = ['Kinnan Kwok']
6
+ gem.email = 'kkwoker@gmail.com'
7
+ gem.summary = 'Allows you to specify an endpoint to retrieve data from, parse it, and store into any database'
8
+
9
+ gem.files = `git ls-files`.split("\n")
10
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
11
+ gem.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
12
+ gem.require_paths = ['lib']
13
+
14
+ gem.add_runtime_dependency 'ezmq', '~> 0.4.4'
15
+ gem.add_runtime_dependency 'faraday'
16
+ gem.add_runtime_dependency 'excon'
17
+ gem.add_runtime_dependency 'commander'
18
+ gem.add_runtime_dependency 'msgpack'
19
+ gem.add_runtime_dependency 'influxdb', '~> 0.1.9'
20
+ gem.add_runtime_dependency 'eye'
21
+ gem.add_runtime_dependency 'moneta'
22
+ gem.add_runtime_dependency 'sinatra'
23
+ gem.add_runtime_dependency 'rainbow'
24
+ gem.add_runtime_dependency 'oj'
25
+ gem.add_runtime_dependency 'terminal-announce'
26
+ gem.add_runtime_dependency 'settingslogic'
27
+
28
+ gem.add_development_dependency 'pry'
29
+ end
data/bin/harvester.rb ADDED
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'commander'
4
+ require_relative '../lib/harvester'
5
+
6
+ Commander.configure do
7
+ program :name, 'Harvester'
8
+ program :version, '0.0.1'
9
+ program :description, 'harvest from endpoints'
10
+ program :help, 'Author', 'Kinnan Kwok <kkwoker@gmail.com>'
11
+
12
+ default_command :harvest
13
+
14
+ command :harvest do |command|
15
+ command.syntax = 'harvester harvest [options]'
16
+ command.summary = ''
17
+ command.description = 'Starts processes for harvesting data'
18
+ command.example 'description', 'command example'
19
+ command.option '--from STRING', String, 'Adds an endpoint to harvest from'
20
+ command.option '--with STRING', String, 'Adds a parsing method ruby file'
21
+ command.option '--every INTEGER', Integer, 'Adds an interval for polling'
22
+ command.action do |_args, options|
23
+ # Do something or c.when_called Harvester::Commands::Harvest
24
+ abort 'Must provide parameters --from, --with, and --every' unless options.from && options.with && options.every
25
+ name = options.with
26
+ endpoint = options.from
27
+ timeout = options.every
28
+
29
+ # Create an eye file.
30
+ EyeGenerator.initialize name, endpoint, timeout
31
+ # Load Eye file
32
+ system "eye load #{name}.d/config.eye"
33
+ system "eye restart #{name}"
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,58 @@
1
+ #!/bin/env ruby
2
+ require 'pry'
3
+ def key_transactions incoming_data
4
+ outgoing_data = []
5
+ transactions = incoming_data['key_transactions']
6
+ transactions.each do |transaction|
7
+ transaction['application_summary'] = {} unless transaction['application_summary']
8
+ transaction['end_user_summary'] = {} unless transaction['end_user_summary']
9
+ plowed = {
10
+ "database_name": "NewRelic-transactions",
11
+ "series_name": transaction['name'],
12
+ "application-response_time": transaction['application_summary']['response_time'],
13
+ "application-throughput": transaction['application_summary']['throughput'],
14
+ "application-error_rate": transaction['application_summary']['error_rate'],
15
+ "application-apdex_target": transaction['application_summary']['apdex_target'],
16
+ "application-apdex_score": transaction['application_summary']['apdex_score'],
17
+ "application-host_count": transaction['application_summary']['host_count'],
18
+ "application-instance_count": transaction['application_summary']['instance_count'],
19
+ "application-concurrent_instance_count": transaction['application_summary']['concurrent_instance_count'],
20
+ "end_user-response_time": transaction['end_user_summary']['response_time'],
21
+ "end_user-throughput": transaction['end_user_summary']['throughput'],
22
+ "end_user-apdex_target": transaction['end_user_summary']['apdex_target'],
23
+ "end_user-apdex_score": transaction['end_user_summary']['apdex_score']
24
+ }
25
+ outgoing_data << plowed.keep_if {|_,value| !value.nil?}
26
+ end
27
+ outgoing_data
28
+ end
29
+
30
+ # {
31
+ # "key_transaction": {
32
+ # "id": "integer",
33
+ # "name": "string",
34
+ # "transaction_name": "string",
35
+ # "health_status": "string",
36
+ # "reporting": "boolean",
37
+ # "last_reported_at": "time",
38
+ # "application_summary": {
39
+ # "response_time": "float",
40
+ # "throughput": "float",
41
+ # "error_rate": "float",
42
+ # "apdex_target": "float",
43
+ # "apdex_score": "float",
44
+ # "host_count": "integer",
45
+ # "instance_count": "integer",
46
+ # "concurrent_instance_count": "integer"
47
+ # },
48
+ # "end_user_summary": {
49
+ # "response_time": "float",
50
+ # "throughput": "float",
51
+ # "apdex_target": "float",
52
+ # "apdex_score": "float"
53
+ # },
54
+ # "links": {
55
+ # "application": "integer"
56
+ # }
57
+ # }
58
+ # }
@@ -0,0 +1,33 @@
1
+ require_relative '../../template/default_eye'
2
+
3
+ module EyeGenerator
4
+ def self.create_eye_config name
5
+ config = Default.eye_config name
6
+ File.open("#{name}.d/config.eye", 'w') { |file| file.write(config)}
7
+ end
8
+
9
+ def self.create_puller name, endpoint, timeout
10
+ puller = Default.puller name, endpoint, timeout
11
+ File.open("#{name}.d/puller.rb", 'w') { |file| file.write(puller)}
12
+ end
13
+
14
+ def self.create_parser name, endpoint
15
+ parser = Default.parser name, endpoint
16
+ File.open("#{name}.d/parser.rb", 'w') { |file| file.write(parser)}
17
+ end
18
+
19
+ def self.create_pusher name, endpoint
20
+ pusher = Default.pusher name, endpoint
21
+ File.open("#{name}.d/pusher.rb", 'w') { |file| file.write(pusher)}
22
+ end
23
+
24
+ def self.initialize name, endpoint, timeout
25
+ system "mkdir -p #{name}.d"
26
+ system "mkdir -p #{name}.d/logs"
27
+ system "mkdir -p #{name}.d/pids"
28
+ create_eye_config name
29
+ create_puller name, endpoint, timeout
30
+ create_parser name, endpoint
31
+ create_pusher name, endpoint
32
+ end
33
+ end
@@ -0,0 +1,23 @@
1
+ require 'pry'
2
+ require 'ezmq'
3
+ require 'msgpack'
4
+ require 'oj'
5
+ require_relative 'settings'
6
+ require_relative '../../key_transactions'
7
+ module Parser
8
+ @broadcaster = EZMQ::Publisher.new :bind, port: 6000, encode: -> m { Oj.dump m }
9
+ def self.activate topic, endpoint
10
+ puts topic, endpoint
11
+ listener = EZMQ::Subscriber.new :connect, port: 5000, topic: topic, decode: -> m { Oj.load m }
12
+ listener.listen do |message, topic|
13
+ data = plow message, topic
14
+ data.each do |item|
15
+ puts @broadcaster.send item, topic: topic
16
+ end
17
+ end
18
+ end
19
+
20
+ def self.plow message, parse
21
+ send(parse, message)
22
+ end
23
+ end
@@ -0,0 +1,32 @@
1
+ require 'ezmq'
2
+ require 'msgpack'
3
+ require 'faraday'
4
+ require 'oj'
5
+ require 'excon'
6
+ require_relative 'settings'
7
+
8
+ module Puller
9
+ @broadcaster = EZMQ::Publisher.new :bind, port: 5000
10
+ def self.fetch_data(endpoint)
11
+ conn = Faraday.new(url: endpoint) do |faraday|
12
+ faraday.adapter :excon
13
+ faraday.headers['X-Api-Key'] = Settings.newrelic_key
14
+ end
15
+ conn.get.body
16
+ # rescue Exception => e
17
+ # puts "Puller#fetch_data"
18
+ # puts "#{e.inspect}: #{e.message}"
19
+ end
20
+
21
+ def self.send(data, topic)
22
+ # puts "Puller#send"
23
+ @broadcaster.send data, topic: topic
24
+ end
25
+
26
+ def self.activate(name, endpoint, timeout)
27
+ loop do
28
+ puts send fetch_data(endpoint), name
29
+ sleep timeout
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ require 'pry'
2
+ require 'ezmq'
3
+ require 'oj'
4
+ require 'influxdb'
5
+ require_relative 'settings'
6
+
7
+ module Pusher
8
+ @connection = InfluxDB::Client.new host: Settings.influx_host, username: Settings.influx_user, password: Settings.influx_pass
9
+
10
+ def self.activate topic, endpoint
11
+ listener = EZMQ::Subscriber.new :connect, port: 6000, topic: topic, decode: -> m { Oj.load m }
12
+ listener.listen do |message, topic|
13
+ puts write message
14
+ end
15
+ end
16
+
17
+ def self.write data
18
+ series = data.delete :series_name
19
+ db = data.delete :database_name
20
+ use_or_create db
21
+ @connection.write_point(series, data)
22
+ data.length
23
+ end
24
+
25
+ def self.use_or_create(db_name)
26
+ dbs = @connection.get_database_list.map { |db| db["name"] }
27
+ @connection.create_database db_name unless dbs.include? db_name
28
+ @connection = InfluxDB::Client.new db_name, host: Settings.influx_host,
29
+ username: Settings.influx_user,
30
+ password: Settings.influx_pass
31
+ end
32
+
33
+ end
@@ -0,0 +1,15 @@
1
+ require 'settingslogic'
2
+ require 'terminal-announce'
3
+ class Settings < Settingslogic
4
+ config_paths = %w(/etc /usr/local/etc ~/.config . ../)
5
+
6
+ config_paths.each do |config_path|
7
+ config_file = File.expand_path "#{ config_path }/harvester.yaml"
8
+ source config_file if File.exist? config_file
9
+ end
10
+
11
+ load!
12
+ rescue Errno::ENOENT
13
+ Announce.failure "Unable to locate configuration in #{ config_paths }."
14
+ abort
15
+ end
data/lib/harvester.rb ADDED
@@ -0,0 +1,4 @@
1
+ require_relative 'harvester/puller'
2
+ require_relative 'harvester/parser'
3
+ require_relative 'harvester/pusher'
4
+ require_relative 'harvester/eye_generator'
@@ -0,0 +1,62 @@
1
+ module Default
2
+
3
+
4
+ def self.puller name, endpoint, timeout
5
+ %Q(#!/bin/env ruby
6
+ require_relative '../lib/harvester/puller'
7
+ Puller.activate("#{name}", "#{endpoint}", #{timeout})
8
+ )
9
+ end
10
+
11
+ def self.parser name, endpoint
12
+ %Q(#!/bin/env ruby
13
+ require_relative '../lib/harvester/parser'
14
+ Parser.activate("#{name}", "#{endpoint}")
15
+ )
16
+ end
17
+
18
+ def self.pusher name, endpoint
19
+ %Q(#!/bin/env ruby
20
+ require_relative '../lib/harvester/pusher'
21
+ Pusher.activate("#{name}", "#{endpoint}")
22
+ )
23
+ end
24
+
25
+ def self.eye_config name
26
+ %Q(#!/bin/env ruby
27
+
28
+ Eye.application 'harvester' do
29
+
30
+ working_dir File.expand_path(File.join(File.dirname(__FILE__)))
31
+
32
+ group "#{name}" do
33
+ process :puller do
34
+ pid_file 'pids/puller.pid'
35
+ start_command "ruby puller.rb"
36
+ daemonize true
37
+ stdout 'logs/puller.log'
38
+ check :memory, every: 20.seconds, below: 300.megabytes, times: 3
39
+ end
40
+
41
+ process :parser do
42
+ pid_file 'pids/parser.pid'
43
+ start_command "ruby parser.rb"
44
+ daemonize true
45
+ stdout 'logs/parser.log'
46
+ check :memory, every: 20.seconds, below: 300.megabytes, times: 3
47
+ end
48
+
49
+ process :pusher do
50
+ pid_file 'pids/pusher.pid'
51
+ start_command "ruby pusher.rb"
52
+ daemonize true
53
+ stdout 'logs/pusher.log'
54
+ check :memory, every: 20.seconds, below: 300.megabytes, times: 3
55
+ end
56
+
57
+ end
58
+ end
59
+ )
60
+ end
61
+
62
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,34 @@
1
+ require 'simplecov'
2
+
3
+ module SimpleCov::Configuration
4
+ def clean_filters
5
+ @filters = []
6
+ end
7
+ end
8
+
9
+ SimpleCov.configure do
10
+ clean_filters
11
+ load_adapter 'test_frameworks'
12
+ end
13
+
14
+ ENV["COVERAGE"] && SimpleCov.start do
15
+ add_filter "/.rvm/"
16
+ end
17
+ require 'rubygems'
18
+ require 'bundler'
19
+ begin
20
+ Bundler.setup(:default, :development)
21
+ rescue Bundler::BundlerError => e
22
+ $stderr.puts e.message
23
+ $stderr.puts "Run `bundle install` to install missing gems"
24
+ exit e.status_code
25
+ end
26
+ require 'test/unit'
27
+ require 'shoulda'
28
+
29
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
30
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
31
+ require 'harvester'
32
+
33
+ class Test::Unit::TestCase
34
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestHarvester < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,263 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: api-harvester
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Kinnan Kwok
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-08-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ezmq
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.4.4
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.4.4
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday
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: excon
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: commander
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: msgpack
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: influxdb
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.1.9
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.1.9
97
+ - !ruby/object:Gem::Dependency
98
+ name: eye
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: moneta
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: sinatra
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rainbow
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: oj
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: terminal-announce
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: settingslogic
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: pry
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ description:
210
+ email: kkwoker@gmail.com
211
+ executables:
212
+ - harvester.rb
213
+ extensions: []
214
+ extra_rdoc_files: []
215
+ files:
216
+ - ".document"
217
+ - ".gitignore"
218
+ - Gemfile
219
+ - Gemfile.lock
220
+ - LICENSE.txt
221
+ - README.md
222
+ - Rakefile
223
+ - api-harvester.gemspec
224
+ - bin/harvester.rb
225
+ - key_transactions.rb
226
+ - lib/harvester.rb
227
+ - lib/harvester/eye_generator.rb
228
+ - lib/harvester/parser.rb
229
+ - lib/harvester/puller.rb
230
+ - lib/harvester/pusher.rb
231
+ - lib/harvester/settings.rb
232
+ - template/default_eye.rb
233
+ - test/helper.rb
234
+ - test/test_harvester.rb
235
+ homepage:
236
+ licenses:
237
+ - MIT
238
+ metadata: {}
239
+ post_install_message:
240
+ rdoc_options: []
241
+ require_paths:
242
+ - lib
243
+ required_ruby_version: !ruby/object:Gem::Requirement
244
+ requirements:
245
+ - - ">="
246
+ - !ruby/object:Gem::Version
247
+ version: '0'
248
+ required_rubygems_version: !ruby/object:Gem::Requirement
249
+ requirements:
250
+ - - ">="
251
+ - !ruby/object:Gem::Version
252
+ version: '0'
253
+ requirements: []
254
+ rubyforge_project:
255
+ rubygems_version: 2.4.6
256
+ signing_key:
257
+ specification_version: 4
258
+ summary: Allows you to specify an endpoint to retrieve data from, parse it, and store
259
+ into any database
260
+ test_files:
261
+ - test/helper.rb
262
+ - test/test_harvester.rb
263
+ has_rdoc: