dboard 1.0.3 → 1.1.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 +7 -0
- data/.github/workflows/ci.yml +26 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +5 -0
- data/Gemfile +6 -1
- data/README.md +2 -0
- data/Rakefile +3 -3
- data/dboard.gemspec +5 -6
- data/lib/api.rb +8 -8
- data/lib/cache.rb +1 -1
- data/lib/collector.rb +38 -19
- data/lib/dboard.rb +3 -3
- data/lib/publisher.rb +2 -2
- data/lib/version.rb +1 -1
- data/spec/collector_spec.rb +30 -17
- data/spec/publisher_spec.rb +5 -7
- data/spec/spec_helper.rb +7 -7
- metadata +94 -118
- data/.rvmrc +0 -1
- data/spec/integration_spec.rb +0 -54
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 60c9af8ba57dc09e45ec0f39a2e8394705c4cfadd771f52210578438f4f64219
|
|
4
|
+
data.tar.gz: d1422616d6c609c49cd32c1a88481ae929391d5d3d937cc81b5abb1e37457a90
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: '091c5bebede637161ece4d905ec07acb12d018c2d7dde186bb427639edbebe43211393ea6279b9ec212f02cdaff847b9812d21e6f1e1bc98dd9dbf117d0ee33a'
|
|
7
|
+
data.tar.gz: dcc00cb4d504f0911b19f68c98af3db66e76a4cef444a8efcbb0e1a8daaa2a281da11f12eb3ae132bee5c7b06c09e0e228c17b2ad1ad2af005e47d379d71c5b0
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
name: Ruby CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ master ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ master ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
|
|
14
|
+
strategy:
|
|
15
|
+
matrix:
|
|
16
|
+
ruby-version: ["3.0", "2.7", "2.6", "2.5"]
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v2
|
|
20
|
+
- name: Set up Ruby ${{ matrix.ruby-version }}
|
|
21
|
+
uses: ruby/setup-ruby@v1
|
|
22
|
+
with:
|
|
23
|
+
ruby-version: ${{ matrix.ruby-version }}
|
|
24
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
|
25
|
+
- name: Run tests
|
|
26
|
+
run: bundle exec rake
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
[](https://github.com/barsoom/dboard/actions/workflows/ci.yml)
|
|
2
|
+
|
|
1
3
|
A dashboard framework.
|
|
2
4
|
|
|
3
5
|
It handles collecting data from user defined sources (simple ruby classes) and provides a simple API to poll for updates. See the [example app](https://github.com/joakimk/dboard_example) for information on how to use it.
|
data/Rakefile
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
require
|
|
2
|
-
require
|
|
1
|
+
require "bundler"
|
|
2
|
+
require "rspec/core/rake_task"
|
|
3
3
|
|
|
4
4
|
Bundler::GemHelper.install_tasks
|
|
5
5
|
|
|
@@ -7,4 +7,4 @@ desc "Run specs"
|
|
|
7
7
|
RSpec::Core::RakeTask.new do |t|
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
task :
|
|
10
|
+
task default: :spec
|
data/dboard.gemspec
CHANGED
|
@@ -6,22 +6,21 @@ Gem::Specification.new do |s|
|
|
|
6
6
|
s.name = "dboard"
|
|
7
7
|
s.version = Dboard::VERSION
|
|
8
8
|
s.platform = Gem::Platform::RUBY
|
|
9
|
-
s.authors = ["Joakim Kolsjö"]
|
|
10
|
-
s.email = ["joakim.kolsjo@gmail.com"]
|
|
9
|
+
s.authors = [ "Joakim Kolsjö" ]
|
|
10
|
+
s.email = [ "joakim.kolsjo@gmail.com" ]
|
|
11
11
|
s.homepage = ""
|
|
12
12
|
s.summary = %q{Dashboard framework}
|
|
13
13
|
s.description = %q{Dashboard framework}
|
|
14
14
|
s.license = "MIT"
|
|
15
|
+
s.metadata = { "rubygems_mfa_required" => "true" }
|
|
15
16
|
|
|
16
17
|
s.files = `git ls-files`.split("\n")
|
|
17
|
-
s.
|
|
18
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
|
19
|
-
s.require_paths = ["lib"]
|
|
18
|
+
s.require_paths = [ "lib" ]
|
|
20
19
|
|
|
21
20
|
s.add_dependency "httparty"
|
|
22
21
|
s.add_dependency "rake"
|
|
23
22
|
s.add_dependency "json"
|
|
24
23
|
s.add_dependency "dalli"
|
|
25
24
|
s.add_dependency "sinatra"
|
|
26
|
-
s.add_development_dependency "rspec", "
|
|
25
|
+
s.add_development_dependency "rspec", "~> 3.9"
|
|
27
26
|
end
|
data/lib/api.rb
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__),
|
|
2
|
-
require File.expand_path(File.join(File.dirname(__FILE__),
|
|
3
|
-
require
|
|
4
|
-
require
|
|
5
|
-
require
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "cache"))
|
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "collector.rb"))
|
|
3
|
+
require "digest/md5"
|
|
4
|
+
require "json"
|
|
5
|
+
require "httparty"
|
|
6
6
|
|
|
7
7
|
module Dboard
|
|
8
8
|
class Api
|
|
@@ -15,12 +15,12 @@ module Dboard
|
|
|
15
15
|
|
|
16
16
|
def self.get(params)
|
|
17
17
|
types = {}
|
|
18
|
-
params[:types].split(
|
|
18
|
+
params[:types].split(",").each do |type|
|
|
19
19
|
raw_data = CACHE.get("dashboard::source::#{type}")
|
|
20
20
|
data = raw_data ? JSON.parse(raw_data) : {}
|
|
21
|
-
types.merge!(type => { :
|
|
21
|
+
types.merge!(type => { data: data, checksum: Digest::MD5.hexdigest(data.inspect) })
|
|
22
22
|
end
|
|
23
|
-
{ :
|
|
23
|
+
{ version: (@@version || ENV["COMMIT_HASH"] || "unversioned"), sources: types }.to_json
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def self.version=(version)
|
data/lib/cache.rb
CHANGED
data/lib/collector.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__),
|
|
2
|
-
require
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "publisher"))
|
|
2
|
+
require "singleton"
|
|
3
3
|
|
|
4
4
|
module Dboard
|
|
5
5
|
class Collector
|
|
@@ -15,6 +15,10 @@ module Dboard
|
|
|
15
15
|
Collector.instance.register_after_update_callback(callback)
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
+
def self.register_error_callback(callback)
|
|
19
|
+
Collector.instance.register_error_callback(callback)
|
|
20
|
+
end
|
|
21
|
+
|
|
18
22
|
def self.start
|
|
19
23
|
instance.start
|
|
20
24
|
end
|
|
@@ -22,11 +26,14 @@ module Dboard
|
|
|
22
26
|
def initialize
|
|
23
27
|
@sources = {}
|
|
24
28
|
@after_update_callback = lambda {}
|
|
29
|
+
@error_callback = lambda { |exception| }
|
|
25
30
|
end
|
|
26
31
|
|
|
27
32
|
def start
|
|
28
33
|
@sources.each do |source, instance|
|
|
29
34
|
Thread.new do
|
|
35
|
+
wait_a_little_bit_to_not_start_all_fetches_at_once
|
|
36
|
+
|
|
30
37
|
loop do
|
|
31
38
|
update_in_thread(source, instance)
|
|
32
39
|
end
|
|
@@ -35,20 +42,19 @@ module Dboard
|
|
|
35
42
|
loop { sleep 1 }
|
|
36
43
|
end
|
|
37
44
|
|
|
38
|
-
def
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
time_until_next_update = 0 if time_until_next_update < 0
|
|
45
|
-
puts "#{source} done in #{elapsed_time} seconds, will update again in #{time_until_next_update} seconds (interval: #{instance.update_interval})."
|
|
46
|
-
sleep time_until_next_update
|
|
47
|
-
rescue Exception => ex
|
|
48
|
-
puts "Something failed outside the update_source method. #{ex.message}"
|
|
49
|
-
puts ex.backtrace
|
|
45
|
+
def register_source(key, instance)
|
|
46
|
+
@sources.merge!({ key => instance })
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def register_after_update_callback(callback)
|
|
50
|
+
@after_update_callback = callback
|
|
50
51
|
end
|
|
51
52
|
|
|
53
|
+
def register_error_callback(callback)
|
|
54
|
+
@error_callback = callback
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Public because the old tests depend on it
|
|
52
58
|
def update_source(source, instance)
|
|
53
59
|
begin
|
|
54
60
|
data = instance.fetch
|
|
@@ -59,18 +65,31 @@ module Dboard
|
|
|
59
65
|
rescue Exception => ex
|
|
60
66
|
puts "Failed to update #{source}: #{ex.message}"
|
|
61
67
|
puts ex.backtrace
|
|
68
|
+
@error_callback.call(ex)
|
|
62
69
|
end
|
|
63
70
|
|
|
64
|
-
|
|
65
|
-
@sources.merge!({ key => instance })
|
|
66
|
-
end
|
|
71
|
+
private
|
|
67
72
|
|
|
68
|
-
def
|
|
69
|
-
|
|
73
|
+
def update_in_thread(source, instance)
|
|
74
|
+
time = Time.now
|
|
75
|
+
puts "#{source} updating..."
|
|
76
|
+
update_source(source, instance)
|
|
77
|
+
elapsed_time = Time.now - time
|
|
78
|
+
time_until_next_update = instance.update_interval - elapsed_time
|
|
79
|
+
time_until_next_update = 0 if time_until_next_update < 0
|
|
80
|
+
puts "#{source} done in #{elapsed_time} seconds, will update again in #{time_until_next_update} seconds (interval: #{instance.update_interval})."
|
|
81
|
+
sleep time_until_next_update
|
|
82
|
+
rescue Exception => ex
|
|
83
|
+
puts "Something failed outside the update_source method. #{ex.message}"
|
|
84
|
+
puts ex.backtrace
|
|
70
85
|
end
|
|
71
86
|
|
|
72
87
|
def publish_data(source, data)
|
|
73
88
|
Publisher.publish(source, data)
|
|
74
89
|
end
|
|
90
|
+
|
|
91
|
+
def wait_a_little_bit_to_not_start_all_fetches_at_once
|
|
92
|
+
sleep 10 * rand
|
|
93
|
+
end
|
|
75
94
|
end
|
|
76
95
|
end
|
data/lib/dboard.rb
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__),
|
|
2
|
-
require File.expand_path(File.join(File.dirname(__FILE__),
|
|
3
|
-
require File.expand_path(File.join(File.dirname(__FILE__),
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "config.rb"))
|
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "api.rb"))
|
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "collector.rb"))
|
data/lib/publisher.rb
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
require
|
|
1
|
+
require "json"
|
|
2
2
|
|
|
3
3
|
module Dboard
|
|
4
4
|
class Publisher
|
|
5
5
|
def self.publish(source, data)
|
|
6
|
-
Api::Client.post("/sources/#{source}", :
|
|
6
|
+
Api::Client.post("/sources/#{source}", body: { data: data.to_json }, timeout: 10000)
|
|
7
7
|
rescue SocketError => ex
|
|
8
8
|
puts "SocketError: #{ex.message}"
|
|
9
9
|
end
|
data/lib/version.rb
CHANGED
data/spec/collector_spec.rb
CHANGED
|
@@ -1,32 +1,46 @@
|
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__),
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
|
|
2
2
|
|
|
3
3
|
describe Dboard::Collector, "register_source" do
|
|
4
|
-
|
|
5
4
|
before do
|
|
6
5
|
Dboard::Collector.instance.sources.clear
|
|
7
6
|
end
|
|
8
7
|
|
|
9
8
|
it "can register a source" do
|
|
10
|
-
new_relic =
|
|
11
|
-
new_relic.
|
|
9
|
+
new_relic = double
|
|
10
|
+
allow(new_relic).to receive(:update_interval).and_return(5)
|
|
12
11
|
Dboard::Collector.register_source :new_relic, new_relic
|
|
13
|
-
Dboard::Collector.instance.sources.
|
|
12
|
+
expect(Dboard::Collector.instance.sources).to eq({ new_relic: new_relic })
|
|
14
13
|
end
|
|
15
14
|
|
|
16
15
|
it "can register an after update callback" do
|
|
17
|
-
new_relic =
|
|
18
|
-
new_relic.
|
|
19
|
-
callback =
|
|
16
|
+
new_relic = double
|
|
17
|
+
allow(new_relic).to receive(:fetch).and_return({ db: "100%" })
|
|
18
|
+
callback = double
|
|
20
19
|
Dboard::Collector.register_after_update_callback callback
|
|
21
20
|
|
|
22
|
-
callback.
|
|
23
|
-
Dboard::Publisher.
|
|
21
|
+
expect(callback).to receive(:call)
|
|
22
|
+
allow(Dboard::Publisher).to receive(:publish)
|
|
24
23
|
Dboard::Collector.instance.update_source(:new_relic, new_relic)
|
|
25
24
|
|
|
26
25
|
# since it is a singleton, and this callbacks leaks into the other tests
|
|
27
26
|
Dboard::Collector.register_after_update_callback(lambda {})
|
|
28
27
|
end
|
|
29
28
|
|
|
29
|
+
it "can register an error callback" do
|
|
30
|
+
new_relic = double
|
|
31
|
+
error = RuntimeError.new("error")
|
|
32
|
+
allow(new_relic).to receive(:fetch).and_raise(error)
|
|
33
|
+
callback = double
|
|
34
|
+
Dboard::Collector.register_error_callback callback
|
|
35
|
+
|
|
36
|
+
expect(callback).to receive(:call).with(error)
|
|
37
|
+
allow(Dboard::Publisher).to receive(:publish)
|
|
38
|
+
allow_any_instance_of(Dboard::Collector).to receive(:puts)
|
|
39
|
+
Dboard::Collector.instance.update_source(:new_relic, new_relic)
|
|
40
|
+
|
|
41
|
+
# since it is a singleton, and this callbacks leaks into the other tests
|
|
42
|
+
Dboard::Collector.register_error_callback(lambda { |_| })
|
|
43
|
+
end
|
|
30
44
|
end
|
|
31
45
|
|
|
32
46
|
describe Dboard::Collector, "update_source" do
|
|
@@ -35,17 +49,16 @@ describe Dboard::Collector, "update_source" do
|
|
|
35
49
|
end
|
|
36
50
|
|
|
37
51
|
it "should collect and publish data from sources" do
|
|
38
|
-
new_relic =
|
|
39
|
-
new_relic.
|
|
40
|
-
Dboard::Publisher.
|
|
52
|
+
new_relic = double
|
|
53
|
+
allow(new_relic).to receive(:fetch).and_return({ db: "100%" })
|
|
54
|
+
expect(Dboard::Publisher).to receive(:publish).with(:new_relic, { db: "100%" })
|
|
41
55
|
Dboard::Collector.instance.update_source(:new_relic, new_relic)
|
|
42
56
|
end
|
|
43
57
|
|
|
44
58
|
it "should print out debugging info" do
|
|
45
|
-
new_relic =
|
|
46
|
-
new_relic.
|
|
47
|
-
Dboard::Collector.instance.
|
|
59
|
+
new_relic = double
|
|
60
|
+
allow(new_relic).to receive(:fetch).and_raise(Exception.new("some error"))
|
|
61
|
+
expect(Dboard::Collector.instance).to receive(:puts).twice
|
|
48
62
|
Dboard::Collector.instance.update_source(:new_relic, new_relic)
|
|
49
63
|
end
|
|
50
|
-
|
|
51
64
|
end
|
data/spec/publisher_spec.rb
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__),
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
|
|
2
2
|
|
|
3
3
|
describe "Publisher", "publish" do
|
|
4
|
-
|
|
5
4
|
it "should send data to the dashboard server" do
|
|
6
|
-
Dboard::Api::Client.
|
|
7
|
-
Dboard::Publisher.publish(:new_relic, { :
|
|
5
|
+
expect(Dboard::Api::Client).to receive(:post).with("/sources/new_relic", body: { data: { db: "80%" }.to_json }, timeout: 10000)
|
|
6
|
+
Dboard::Publisher.publish(:new_relic, { db: "80%" })
|
|
8
7
|
end
|
|
9
8
|
|
|
10
9
|
it "should handle and log socket errors" do
|
|
11
|
-
Dboard::Api::Client.
|
|
12
|
-
Dboard::Publisher.
|
|
10
|
+
expect(Dboard::Api::Client).to receive(:post).and_raise(SocketError.new("failed to connect"))
|
|
11
|
+
expect(Dboard::Publisher).to receive(:puts).with("SocketError: failed to connect")
|
|
13
12
|
Dboard::Publisher.publish(:new_relic, {})
|
|
14
13
|
end
|
|
15
|
-
|
|
16
14
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
require "rspec"
|
|
2
2
|
|
|
3
|
-
ENV["RACK_ENV"] ||=
|
|
4
|
-
ENV[
|
|
5
|
-
ENV[
|
|
6
|
-
ENV[
|
|
3
|
+
ENV["RACK_ENV"] ||= "test"
|
|
4
|
+
ENV["API_URL"] = "http://localhost:20843"
|
|
5
|
+
ENV["API_USER"] = "test"
|
|
6
|
+
ENV["API_PASSWORD"] = "test"
|
|
7
7
|
|
|
8
|
-
require File.expand_path(File.join(File.dirname(__FILE__),
|
|
8
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "../lib/dboard"))
|
|
9
9
|
|
|
10
|
-
Dboard::Api::Client.basic_auth(ENV[
|
|
11
|
-
Dboard::Api::Client.base_uri(ENV[
|
|
10
|
+
Dboard::Api::Client.basic_auth(ENV["API_USER"], ENV["API_PASSWORD"])
|
|
11
|
+
Dboard::Api::Client.base_uri(ENV["API_URL"])
|
metadata
CHANGED
|
@@ -1,121 +1,109 @@
|
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dboard
|
|
3
|
-
version: !ruby/object:Gem::Version
|
|
4
|
-
|
|
5
|
-
prerelease:
|
|
6
|
-
segments:
|
|
7
|
-
- 1
|
|
8
|
-
- 0
|
|
9
|
-
- 3
|
|
10
|
-
version: 1.0.3
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.1.1
|
|
11
5
|
platform: ruby
|
|
12
|
-
authors:
|
|
13
|
-
-
|
|
6
|
+
authors:
|
|
7
|
+
- Joakim Kolsjö
|
|
14
8
|
autorequire:
|
|
15
9
|
bindir: bin
|
|
16
10
|
cert_chain: []
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
dependencies:
|
|
21
|
-
- !ruby/object:Gem::Dependency
|
|
11
|
+
date: 2021-11-19 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
22
14
|
name: httparty
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
none: false
|
|
26
|
-
requirements:
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
27
17
|
- - ">="
|
|
28
|
-
- !ruby/object:Gem::Version
|
|
29
|
-
|
|
30
|
-
segments:
|
|
31
|
-
- 0
|
|
32
|
-
version: "0"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
33
20
|
type: :runtime
|
|
34
|
-
version_requirements: *id001
|
|
35
|
-
- !ruby/object:Gem::Dependency
|
|
36
|
-
name: rake
|
|
37
21
|
prerelease: false
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
requirements:
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
41
24
|
- - ">="
|
|
42
|
-
- !ruby/object:Gem::Version
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rake
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ">="
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
47
34
|
type: :runtime
|
|
48
|
-
version_requirements: *id002
|
|
49
|
-
- !ruby/object:Gem::Dependency
|
|
50
|
-
name: json
|
|
51
35
|
prerelease: false
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
requirements:
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
55
38
|
- - ">="
|
|
56
|
-
- !ruby/object:Gem::Version
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: json
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
61
48
|
type: :runtime
|
|
62
|
-
version_requirements: *id003
|
|
63
|
-
- !ruby/object:Gem::Dependency
|
|
64
|
-
name: dalli
|
|
65
49
|
prerelease: false
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
requirements:
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
69
52
|
- - ">="
|
|
70
|
-
- !ruby/object:Gem::Version
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: dalli
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
75
62
|
type: :runtime
|
|
76
|
-
version_requirements: *id004
|
|
77
|
-
- !ruby/object:Gem::Dependency
|
|
78
|
-
name: sinatra
|
|
79
63
|
prerelease: false
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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: sinatra
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
83
73
|
- - ">="
|
|
84
|
-
- !ruby/object:Gem::Version
|
|
85
|
-
|
|
86
|
-
segments:
|
|
87
|
-
- 0
|
|
88
|
-
version: "0"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0'
|
|
89
76
|
type: :runtime
|
|
90
|
-
version_requirements: *id005
|
|
91
|
-
- !ruby/object:Gem::Dependency
|
|
92
|
-
name: rspec
|
|
93
77
|
prerelease: false
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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: rspec
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '3.9'
|
|
105
90
|
type: :development
|
|
106
|
-
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '3.9'
|
|
107
97
|
description: Dashboard framework
|
|
108
|
-
email:
|
|
98
|
+
email:
|
|
109
99
|
- joakim.kolsjo@gmail.com
|
|
110
100
|
executables: []
|
|
111
|
-
|
|
112
101
|
extensions: []
|
|
113
|
-
|
|
114
102
|
extra_rdoc_files: []
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
- .gitignore
|
|
118
|
-
- .
|
|
103
|
+
files:
|
|
104
|
+
- ".github/workflows/ci.yml"
|
|
105
|
+
- ".gitignore"
|
|
106
|
+
- ".rubocop.yml"
|
|
119
107
|
- Gemfile
|
|
120
108
|
- LICENCE
|
|
121
109
|
- README.md
|
|
@@ -129,42 +117,30 @@ files:
|
|
|
129
117
|
- lib/publisher.rb
|
|
130
118
|
- lib/version.rb
|
|
131
119
|
- spec/collector_spec.rb
|
|
132
|
-
- spec/integration_spec.rb
|
|
133
120
|
- spec/publisher_spec.rb
|
|
134
121
|
- spec/spec_helper.rb
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
licenses:
|
|
122
|
+
homepage: ''
|
|
123
|
+
licenses:
|
|
138
124
|
- MIT
|
|
125
|
+
metadata:
|
|
126
|
+
rubygems_mfa_required: 'true'
|
|
139
127
|
post_install_message:
|
|
140
128
|
rdoc_options: []
|
|
141
|
-
|
|
142
|
-
require_paths:
|
|
129
|
+
require_paths:
|
|
143
130
|
- lib
|
|
144
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
|
145
|
-
|
|
146
|
-
requirements:
|
|
131
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
132
|
+
requirements:
|
|
147
133
|
- - ">="
|
|
148
|
-
- !ruby/object:Gem::Version
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
version: "0"
|
|
153
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
154
|
-
none: false
|
|
155
|
-
requirements:
|
|
134
|
+
- !ruby/object:Gem::Version
|
|
135
|
+
version: '0'
|
|
136
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
137
|
+
requirements:
|
|
156
138
|
- - ">="
|
|
157
|
-
- !ruby/object:Gem::Version
|
|
158
|
-
|
|
159
|
-
segments:
|
|
160
|
-
- 0
|
|
161
|
-
version: "0"
|
|
139
|
+
- !ruby/object:Gem::Version
|
|
140
|
+
version: '0'
|
|
162
141
|
requirements: []
|
|
163
|
-
|
|
164
|
-
rubyforge_project:
|
|
165
|
-
rubygems_version: 1.5.3
|
|
142
|
+
rubygems_version: 3.2.28
|
|
166
143
|
signing_key:
|
|
167
|
-
specification_version:
|
|
144
|
+
specification_version: 4
|
|
168
145
|
summary: Dashboard framework
|
|
169
146
|
test_files: []
|
|
170
|
-
|
data/.rvmrc
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
rvm ree-1.8.7-2011.03@dboard --create
|
data/spec/integration_spec.rb
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
|
|
2
|
-
|
|
3
|
-
# Test app
|
|
4
|
-
require 'sinatra'
|
|
5
|
-
|
|
6
|
-
get "/sources" do
|
|
7
|
-
Dboard::Api.get(params)
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
post "/sources/:type" do
|
|
11
|
-
Dboard::Api.update(params)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
describe "Dashboard" do
|
|
15
|
-
|
|
16
|
-
def app
|
|
17
|
-
Sinatra::Application
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def start_app
|
|
21
|
-
app.port = 20843
|
|
22
|
-
app.environment = 'test'
|
|
23
|
-
@app_thread = Thread.new { app.run! }
|
|
24
|
-
sleep 1
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def stop_app
|
|
28
|
-
@app_thread && @app_thread.kill
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
before do
|
|
32
|
-
ENV['API_URL'] = "http://localhost:20843"
|
|
33
|
-
ENV['API_USER'] = 'test'
|
|
34
|
-
ENV['API_PASSWORD'] = 'test'
|
|
35
|
-
@new_relic = mock
|
|
36
|
-
@new_relic.stub!(:fetch).and_return({ :db => "33.3%", :memory => "33333 MB" })
|
|
37
|
-
Dboard::CACHE.delete "dashboard::source::new_relic"
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it "should collect stats and post them to the server" do
|
|
41
|
-
start_app
|
|
42
|
-
body = Dboard::Api::Client.get("/sources?types=new_relic")
|
|
43
|
-
JSON.parse(body)["sources"]["new_relic"]["data"].should == {}
|
|
44
|
-
Dboard::Collector.instance.update_source(:new_relic, @new_relic)
|
|
45
|
-
body = Dboard::Api::Client.get("/sources?types=new_relic")
|
|
46
|
-
JSON.parse(body)["sources"]["new_relic"]["data"].should == { "db" => "33.3%", "memory" => "33333 MB" }
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
after do
|
|
50
|
-
stop_app
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
end
|
|
54
|
-
|