adhearsion-stats 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 +7 -0
- data/.gitignore +22 -0
- data/.rspec +2 -0
- data/.travis.yml +12 -0
- data/Gemfile +3 -0
- data/Guardfile +5 -0
- data/LICENSE.txt +22 -0
- data/README.md +121 -0
- data/Rakefile +8 -0
- data/adhearsion-stats.gemspec +29 -0
- data/lib/adhearsion-stats.rb +5 -0
- data/lib/adhearsion-stats/metrics_logger.rb +17 -0
- data/lib/adhearsion-stats/plugin.rb +35 -0
- data/lib/adhearsion-stats/version.rb +3 -0
- data/spec/adhearsion-stats/plugin_spec.rb +60 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/statsd_test_helper.rb +17 -0
- metadata +158 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d587ad87763835b7a5f856f76682467a653924f7
|
4
|
+
data.tar.gz: 1d4afde478e4c00eb75b01b36bf263d0fc57dacc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: db4891c188316c18910dd11ed2b0afc93394a2fcfc1d4b42833d30e3ba55f996a96ad567e361e77909082dcf6075455f8a91ec5a293fd906602842ef1d108e46
|
7
|
+
data.tar.gz: b71ad1fe5885410f537439a03a7c1786124d471b6d0ae026c25890086e3530aa69f6831859a87d8de3f622a1bc26d61fbaea2a77918f4d9de13c364b312e2c74
|
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# Gem related stuff
|
2
|
+
*.gem
|
3
|
+
/pkg
|
4
|
+
/.bundle
|
5
|
+
/Gemfile.lock
|
6
|
+
/vendor
|
7
|
+
|
8
|
+
# RBX stuff
|
9
|
+
/.rbx/
|
10
|
+
|
11
|
+
# Editor temp/backup files
|
12
|
+
*~
|
13
|
+
.*.sw?
|
14
|
+
|
15
|
+
# General
|
16
|
+
/nbproject
|
17
|
+
.DS_Store
|
18
|
+
/.rvmrc
|
19
|
+
/.yardoc
|
20
|
+
/doc
|
21
|
+
/tmp
|
22
|
+
/coverage
|
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2013 Adhearsion Foundation Inc.
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
# Adhearsion Stats [](http://travis-ci.org/JustinAiken/adhearsion-stats)[](https://codeclimate.com/github/JustinAiken/adhearsion-stats)[](https://coveralls.io/r/JustinAiken/adhearsion-stats)
|
2
|
+
|
3
|
+
This is an Adhearsion plugin for sending metrics to a [statsd server](https://github.com/etsy/statsd/).
|
4
|
+
|
5
|
+
It uses the [statsd gem](https://github.com/reinh/statsd).
|
6
|
+
|
7
|
+
## Usage Example
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
class WellTrackedCallController < Adhearsion::CallController
|
11
|
+
|
12
|
+
before_call :start_stats
|
13
|
+
after_call :end_stats
|
14
|
+
|
15
|
+
def run
|
16
|
+
answer
|
17
|
+
...
|
18
|
+
hangup
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def start_stats
|
24
|
+
@call_started = Time.now.to_f
|
25
|
+
AdhearsionStats.increment "calls.started"
|
26
|
+
AdhearsionStats.gauge "calls.in_progress", "+1"
|
27
|
+
end
|
28
|
+
|
29
|
+
def end_stats
|
30
|
+
AdhearsionStats.gauge "calls.in_progress", "-1"
|
31
|
+
|
32
|
+
#Track call duration in ms
|
33
|
+
call_duration = Time.now.to_f - @call_started
|
34
|
+
AdhearsionStats.timing "calls.length", (call_duration * 1000).to_i
|
35
|
+
end
|
36
|
+
end
|
37
|
+
```
|
38
|
+
|
39
|
+
## Optional Logging
|
40
|
+
|
41
|
+
If you set the `log_metrics` option to true, it will generate a log file called `adhearsion-stats.log` next to the `adhearsion.log` showing every call send to statsd:
|
42
|
+
|
43
|
+
```
|
44
|
+
...
|
45
|
+
2014-01-14 01:08:53 PM: increment(foo)
|
46
|
+
2014-01-14 01:08:53 PM: timing(bar,100)
|
47
|
+
...
|
48
|
+
```
|
49
|
+
|
50
|
+
## Stat Types
|
51
|
+
|
52
|
+
#### Counters (`#increment` and `#decrement`)
|
53
|
+
|
54
|
+
Either increments or decrements a simple counter. Mostly used for checking rate of things happening.
|
55
|
+
By default will go up or down one, but you can also pass a value to increment a set amount:
|
56
|
+
|
57
|
+
```ruby
|
58
|
+
AdhearsionStats.increment "foo", 10
|
59
|
+
```
|
60
|
+
|
61
|
+
#### Timers (`#timing` and `#time`)
|
62
|
+
|
63
|
+
Besides timing, can also be used for percents:
|
64
|
+
|
65
|
+
```ruby
|
66
|
+
6.times do
|
67
|
+
AdhearsionStats.timing "foo", 100
|
68
|
+
end
|
69
|
+
|
70
|
+
4.times do
|
71
|
+
AdhearsionStats.timing "foo", 0
|
72
|
+
end
|
73
|
+
|
74
|
+
# Sixty percent of the time, it works every time!
|
75
|
+
|
76
|
+
```
|
77
|
+
|
78
|
+
A block method is also available if you want to time an action:
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
|
82
|
+
AdhearsionStats.time "time_spent_in_menu" do
|
83
|
+
menu menu_message do
|
84
|
+
...
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
```
|
89
|
+
|
90
|
+
#### Gauges (`#gauge`)
|
91
|
+
|
92
|
+
Used to track running counts of something - these aren't reset each flush period.
|
93
|
+
|
94
|
+
```ruby
|
95
|
+
AdhearsionStats.gauge "foo", +4 #This now goes up 4 and stays up 4 until the next time the gauge is sent something
|
96
|
+
```
|
97
|
+
|
98
|
+
### Links
|
99
|
+
|
100
|
+
* [Adhearsion](http://adhearsion.com)
|
101
|
+
* [Source](https://github.com/JustinAiken/adhearsion-stats)
|
102
|
+
* [Bug Tracker](https://github.com/JustinAiken/adhearsion-stats/issues)
|
103
|
+
|
104
|
+
### Note on Patches/Pull Requests
|
105
|
+
|
106
|
+
* Fork the project.
|
107
|
+
* Make your feature addition or bug fix.
|
108
|
+
* Add tests for it. This is important so I don't break it in a future version unintentionally.
|
109
|
+
* Commit, do not mess with Rakefile, version, or history.
|
110
|
+
* If you want to have your own version, that is fine but bump version in a commit by itself so I can ignore when I pull
|
111
|
+
* Send me a pull request. Bonus points for topic branches.
|
112
|
+
|
113
|
+
### Credits
|
114
|
+
|
115
|
+
Original author: [JustinAiken](https://github.com/JustinAiken)
|
116
|
+
|
117
|
+
Developed for [Mojo Lingo](http://mojolingo.com).
|
118
|
+
|
119
|
+
### Copyright
|
120
|
+
|
121
|
+
Copyright (c) 2013 Adhearsion Foundation Inc. MIT license (see LICENSE for details).
|
data/Rakefile
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "adhearsion-stats/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "adhearsion-stats"
|
7
|
+
s.version = AdhearsionStats::VERSION
|
8
|
+
s.authors = ["JustinAiken"]
|
9
|
+
s.email = ["jaiken@mojolingo.com"]
|
10
|
+
s.homepage = "https://github.com/polysics/adhearsion-stats"
|
11
|
+
s.summary = %q{Adhearsion plugin for stats}
|
12
|
+
s.description = %q{Adhearsion plugin for stats. Reports via statsd.}
|
13
|
+
s.license = 'MIT'
|
14
|
+
|
15
|
+
s.rubyforge_project = "adhearsion-stats"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {spec}/*`.split("\n")
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_runtime_dependency %q<adhearsion>, ["~> 2.1"]
|
22
|
+
s.add_runtime_dependency %q<statsd-ruby>
|
23
|
+
|
24
|
+
s.add_development_dependency %q<coveralls>, ['>= 0']
|
25
|
+
s.add_development_dependency %q<bundler>, ["~> 1.0"]
|
26
|
+
s.add_development_dependency %q<rspec>, ["~> 2.5"]
|
27
|
+
s.add_development_dependency %q<rake>, [">= 0"]
|
28
|
+
s.add_development_dependency %q<guard-rspec>
|
29
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module AdhearsionStats
|
4
|
+
|
5
|
+
class MetricsLogger < Logger
|
6
|
+
def format_message(severity, timestamp, progname, msg)
|
7
|
+
nice = timestamp.strftime("%Y-%m-%d %I:%M:%S %p")
|
8
|
+
"#{nice}: #{msg}\n"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.setup_logger
|
13
|
+
logfile = File.open(File.dirname(__FILE__) + "#{Adhearsion.root}/log/adhearsion-stats.log", 'a')
|
14
|
+
logfile.sync = true
|
15
|
+
@metrics_logger = MetricsLogger.new(logfile)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'statsd'
|
2
|
+
|
3
|
+
module AdhearsionStats
|
4
|
+
|
5
|
+
class << self
|
6
|
+
attr_accessor :statsd, :loaded, :metrics_logger
|
7
|
+
end
|
8
|
+
|
9
|
+
class Plugin < Adhearsion::Plugin
|
10
|
+
|
11
|
+
config :statsd do
|
12
|
+
host "127.0.0.1", desc: "The host that statsd is found at"
|
13
|
+
port 8125, desc: "The port that statsd is found at"
|
14
|
+
log_metrics false, desc: "Whether or not to log stats sent to statsd"
|
15
|
+
end
|
16
|
+
|
17
|
+
init :statsd do
|
18
|
+
AdhearsionStats.setup_logger if Adhearsion.config.statsd.log_metrics
|
19
|
+
|
20
|
+
AdhearsionStats.statsd = Statsd.new Adhearsion.config.statsd.host, Adhearsion.config.statsd.port
|
21
|
+
AdhearsionStats.loaded = true
|
22
|
+
|
23
|
+
logger.info "Adhearsion-Stats has been loaded"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class << self
|
28
|
+
def method_missing(meth, *args, &blk)
|
29
|
+
if Adhearsion.config[:statsd].log_metrics
|
30
|
+
metrics_logger.send :info, "#{meth}(#{args.join(",")})"
|
31
|
+
end
|
32
|
+
AdhearsionStats.statsd.send meth, *args
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AdhearsionStats do
|
4
|
+
|
5
|
+
describe "plugin configuration" do
|
6
|
+
it "sets the default values" do
|
7
|
+
Adhearsion.config[:statsd].host.should == '127.0.0.1'
|
8
|
+
Adhearsion.config[:statsd].port.should == 8125
|
9
|
+
Adhearsion.config[:statsd].log_metrics.should be_false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "initialization" do
|
14
|
+
let(:logfile) { double "File", 'sync=' => true }
|
15
|
+
let!(:dummy_logger) { AdhearsionStats::MetricsLogger.new(STDOUT) }
|
16
|
+
|
17
|
+
before do
|
18
|
+
File.stub(:open).and_return logfile
|
19
|
+
AdhearsionStats::MetricsLogger.stub(:new).with(logfile).and_return dummy_logger
|
20
|
+
Adhearsion.config[:statsd].log_metrics = true
|
21
|
+
Adhearsion::Plugin.initializers.each { |plugin_initializer| plugin_initializer.run }
|
22
|
+
end
|
23
|
+
|
24
|
+
it "sets init variables" do
|
25
|
+
subject.statsd.should be_an_instance_of Statsd
|
26
|
+
subject.statsd.host.should == "127.0.0.1"
|
27
|
+
subject.statsd.port.should == 8125
|
28
|
+
|
29
|
+
subject.metrics_logger.should be_an_instance_of AdhearsionStats::MetricsLogger
|
30
|
+
subject.loaded.should be_true
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "the plugin" do
|
34
|
+
let(:statsd) { FakeStatsd.new }
|
35
|
+
let(:stats_sent) { statsd.socket.buffer.flatten }
|
36
|
+
|
37
|
+
before { subject.statsd = statsd }
|
38
|
+
|
39
|
+
it "has methods that calls statsd" do
|
40
|
+
subject.increment "foo"
|
41
|
+
subject.timing "bar", 100
|
42
|
+
subject.gauge "biz", "+1"
|
43
|
+
|
44
|
+
stats_sent.should include "foo:1|c"
|
45
|
+
stats_sent.should include "bar:100|ms"
|
46
|
+
stats_sent.should include "biz:+1|g"
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "logging" do
|
50
|
+
it "adds logging to all reporting methods" do
|
51
|
+
subject.metrics_logger.should_receive(:info).with 'increment(foo)'
|
52
|
+
subject.increment "foo"
|
53
|
+
|
54
|
+
subject.metrics_logger.should_receive(:info).with 'timing(bar,100)'
|
55
|
+
subject.timing "bar", 100
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'adhearsion'
|
2
|
+
|
3
|
+
require 'coveralls'
|
4
|
+
Coveralls.wear!
|
5
|
+
|
6
|
+
require 'adhearsion-stats'
|
7
|
+
require 'support/statsd_test_helper'
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
config.color_enabled = true
|
11
|
+
config.tty = true
|
12
|
+
|
13
|
+
config.filter_run focus: true
|
14
|
+
config.run_all_when_everything_filtered = true
|
15
|
+
end
|
16
|
+
|
metadata
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: adhearsion-stats
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- JustinAiken
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-01-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: adhearsion
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: statsd-ruby
|
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: coveralls
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
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: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '2.5'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '2.5'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
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: guard-rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: Adhearsion plugin for stats. Reports via statsd.
|
112
|
+
email:
|
113
|
+
- jaiken@mojolingo.com
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- .gitignore
|
119
|
+
- .rspec
|
120
|
+
- .travis.yml
|
121
|
+
- Gemfile
|
122
|
+
- Guardfile
|
123
|
+
- LICENSE.txt
|
124
|
+
- README.md
|
125
|
+
- Rakefile
|
126
|
+
- adhearsion-stats.gemspec
|
127
|
+
- lib/adhearsion-stats.rb
|
128
|
+
- lib/adhearsion-stats/metrics_logger.rb
|
129
|
+
- lib/adhearsion-stats/plugin.rb
|
130
|
+
- lib/adhearsion-stats/version.rb
|
131
|
+
- spec/adhearsion-stats/plugin_spec.rb
|
132
|
+
- spec/spec_helper.rb
|
133
|
+
- spec/support/statsd_test_helper.rb
|
134
|
+
homepage: https://github.com/polysics/adhearsion-stats
|
135
|
+
licenses:
|
136
|
+
- MIT
|
137
|
+
metadata: {}
|
138
|
+
post_install_message:
|
139
|
+
rdoc_options: []
|
140
|
+
require_paths:
|
141
|
+
- lib
|
142
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - '>='
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - '>='
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
requirements: []
|
153
|
+
rubyforge_project: adhearsion-stats
|
154
|
+
rubygems_version: 2.0.3
|
155
|
+
signing_key:
|
156
|
+
specification_version: 4
|
157
|
+
summary: Adhearsion plugin for stats
|
158
|
+
test_files: []
|