metric 0.0.5 → 0.0.6

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.
data/Gemfile CHANGED
@@ -1,7 +1,11 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
- gem "ruby-debug", :platform => :ruby_18
4
- gem "linecache19", :platform => :ruby_19
5
- gem "ruby-debug19", :platform => :ruby_19
3
+ gem 'ruby-debug', :platform => :ruby_18
4
+ gem 'linecache19', :platform => :ruby_19
5
+ gem 'ruby-debug19', :platform => :ruby_19
6
+
7
+ group :test do
8
+ gem 'webmock'
9
+ end
6
10
 
7
11
  gemspec
@@ -1,4 +1,4 @@
1
- # Metric
1
+ # Metric [![Build Status](http://travis-ci.org/bittersweet/metric.png)](http://travis-ci.org/bittersweet/metric)
2
2
 
3
3
  Track simple metrics via [metric.io](metric.io).
4
4
 
@@ -51,6 +51,10 @@ def register
51
51
  end
52
52
  ```
53
53
 
54
+ ## Documentation
55
+
56
+ Although the code is pretty lightweight and self-explanatory, [documentation](http://rdoc.info/github/bittersweet/metric/master/frames) is available via rdoc.info.
57
+
54
58
  ## Thanks
55
59
 
56
60
  [jeffkreeftmeijer](https://github.com/jeffkreeftmeijer) for providing me with the awesome domainname!
@@ -1,40 +1,35 @@
1
1
  require 'metric/configuration'
2
- require 'open-uri'
2
+ require 'metric/track'
3
+ require 'metric/receive'
3
4
  require 'cgi'
4
5
 
5
6
  module Metric
6
7
  class << self
8
+ # Holds the configuration for easy access to settings
7
9
  attr_accessor :configuration
8
10
 
11
+ # Configures gem options
12
+ #
13
+ # @param [Block]
9
14
  def configure
10
15
  self.configuration ||= Metric::Configuration.new
11
16
  yield(configuration)
12
17
  end
13
18
 
14
- def compose(metric, options = {})
15
- amount = options[:amount]
16
- trigger = options[:trigger]
17
-
18
- key = "?api_key=" + Metric.configuration.api_key
19
- url = Metric.configuration.metric_host + '/track'
20
- url << key
21
- url << parse_metric(metric)
22
- url << "&amount=#{amount}" if amount
23
- url << "&trigger=1" if trigger
24
- url
25
- end
26
-
19
+ # Tracks metrics
20
+ #
21
+ # @param [String, Hash]
22
+ # @return [nil]
27
23
  def track(metric, options = {})
28
- return if defined?(Rails) && !Rails.env.production?
29
-
30
- url = compose(metric, options)
31
- Thread.new do
32
- `curl "#{url}" 2>&1 ; `
33
- end
24
+ Metric::Track.track(metric, options)
34
25
  end
35
26
 
36
- def parse_metric(metric)
37
- "&metric=#{CGI.escape(metric)}"
27
+ # Fetches data from the API
28
+ #
29
+ # @param [String, String]
30
+ # @return [Hash]
31
+ def receive(metric, range)
32
+ Metric::Receive.receive(metric, range)
38
33
  end
39
34
  end
40
35
  end
@@ -1,10 +1,20 @@
1
1
  module Metric
2
+
3
+ # Used for configuration of the Metric gem. The only required option is
4
+ # api_key, secret_key is only used if you want to pull data out from the API
5
+ # and metric_host is used for local debugging purposes.
6
+
2
7
  class Configuration
8
+ # Key used to identify the website
3
9
  attr_accessor :api_key
4
10
 
5
- # Allows setting a different host, used for development purposes
11
+ # Allows setting a different host to send data to, used for development purposes
6
12
  attr_accessor :metric_host
7
13
 
14
+ # Used to generate a hash for getting data out
15
+ attr_accessor :secret_key
16
+
17
+ # Sets defaults
8
18
  def initialize
9
19
  @metric_host = "http://api.metric.io"
10
20
  end
@@ -0,0 +1,61 @@
1
+ require 'digest/md5'
2
+ require 'faraday'
3
+ require 'multi_json'
4
+
5
+ module Metric
6
+
7
+ # Fetch data via the metric.io API
8
+
9
+ class Receive
10
+ # Generate a hash of the site's secret_key and metric identifier
11
+ #
12
+ # @param [String] metric Metric identifier
13
+ # @return [String]
14
+ def self.generate_token(metric)
15
+ Digest::MD5.hexdigest(Metric.configuration.secret_key + metric)
16
+ end
17
+
18
+ # Generate the url with query strings
19
+ #
20
+ # @param [String] metric Metric identifier
21
+ # @param [String] range Range identifier, either total, today, week or month
22
+ # @return [String]
23
+ def self.compose(metric, range)
24
+ key = "?api_key=" + Metric.configuration.api_key
25
+ url = Metric.configuration.metric_host + '/receive'
26
+ url << key
27
+ url << "&token=" + generate_token(metric)
28
+ url << parse_metric(metric)
29
+ url << "&range=" + range
30
+ end
31
+
32
+ # Returns and memoizes a Faraday connection
33
+ #
34
+ # @return [Faraday::Connection]
35
+ def self.connection
36
+ @connection ||= Faraday.new do |builder|
37
+ builder.adapter :net_http
38
+ end
39
+ end
40
+
41
+ # Perform the actual request and parse JSON
42
+ #
43
+ # @param [String] metric Metric identifier
44
+ # @param [String] range Range identifier, either total, today, week or month
45
+ # @return [Hash] response from the API
46
+ def self.receive(metric, range)
47
+ url = compose(metric, range)
48
+ response = connection.get(url)
49
+ MultiJson.decode(response.body)
50
+ end
51
+
52
+ # CGI escape the metric name so spaces and characters are allowed
53
+ #
54
+ # @param [String] metric Metric identifier
55
+ # @return [String]
56
+ def self.parse_metric(metric)
57
+ "&metric=#{CGI.escape(metric)}"
58
+ end
59
+ end
60
+ end
61
+
@@ -0,0 +1,49 @@
1
+ module Metric
2
+
3
+ # Used to track metrics
4
+
5
+ class Track
6
+ # Generate the url with query strings
7
+ #
8
+ # @param [String] metric Metric identifier
9
+ # @param [Hash] options Options
10
+ # @option options [Symbol] :amount Amount to track
11
+ # @option options [Symbol] :trigger Flag for email notification
12
+ # @return [String]
13
+ def self.compose(metric, options = {})
14
+ amount = options[:amount]
15
+ trigger = options[:trigger]
16
+
17
+ key = "?api_key=" + Metric.configuration.api_key
18
+ url = Metric.configuration.metric_host + '/track'
19
+ url << key
20
+ url << parse_metric(metric)
21
+ url << "&amount=#{amount}" if amount
22
+ url << "&trigger=1" if trigger
23
+ url
24
+ end
25
+
26
+ # Uses a thread to perform the request
27
+ # @note If this gem is used with Rails it will only track data in the production environment
28
+ #
29
+ # @param [String, Hash]
30
+ # @return [nil]
31
+ def self.track(metric, options = {})
32
+ return if defined?(Rails) && !Rails.env.production?
33
+ return if options[:amount] && options[:amount] == 0
34
+
35
+ url = compose(metric, options)
36
+ Thread.new do
37
+ `curl "#{url}" 2>&1 ; `
38
+ end
39
+ end
40
+
41
+ # CGI escape the metric name so spaces and characters are allowed
42
+ #
43
+ # @param [String]
44
+ # @return [String]
45
+ def self.parse_metric(metric)
46
+ "&metric=#{CGI.escape(metric)}"
47
+ end
48
+ end
49
+ end
@@ -1,3 +1,3 @@
1
1
  module Metric
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
@@ -15,6 +15,9 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ['lib']
16
16
  gem.version = Metric::VERSION
17
17
 
18
+ gem.add_runtime_dependency 'faraday'
19
+ gem.add_runtime_dependency 'multi_json'
20
+
18
21
  # Tests
19
22
  gem.add_development_dependency 'rspec'
20
23
  gem.add_development_dependency 'webmock'
@@ -8,6 +8,13 @@ describe Metric::Configuration do
8
8
  Metric.configuration.metric_host.should == "http://api.metric.io"
9
9
  end
10
10
 
11
+ it "configures metric host" do
12
+ Metric.configure do |config|
13
+ config.metric_host = "http://localhost:5000"
14
+ end
15
+ Metric.configuration.metric_host.should == "http://localhost:5000"
16
+ end
17
+
11
18
  it "configures api_key" do
12
19
  Metric.configure do |config|
13
20
  config.api_key = "test"
@@ -15,10 +22,10 @@ describe Metric::Configuration do
15
22
  Metric.configuration.api_key.should == "test"
16
23
  end
17
24
 
18
- it "configures metric host" do
25
+ it "configures secret key" do
19
26
  Metric.configure do |config|
20
- config.metric_host = "http://localhost:5000"
27
+ config.secret_key = "random_string"
21
28
  end
22
- Metric.configuration.metric_host.should == "http://localhost:5000"
29
+ Metric.configuration.secret_key.should == "random_string"
23
30
  end
24
31
  end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Metric::Receive do
4
+ before do
5
+ reset_config
6
+ Metric.configure do |config|
7
+ config.secret_key = "1234"
8
+ end
9
+ end
10
+
11
+ it "generates correct hash via secret_token" do
12
+ Metric::Receive.generate_token("hits").should == "c6daa87bcf8bf7cb4d1c74d872793e5e"
13
+ end
14
+
15
+ it "gets total" do
16
+ request = "http://api.metric.io/receive?api_key=spec&token=c6daa87bcf8bf7cb4d1c74d872793e5e&metric=hits&range=total"
17
+ Metric::Receive.compose("hits", "total").should == request
18
+ end
19
+
20
+ it "gets today" do
21
+ request = "http://api.metric.io/receive?api_key=spec&token=c6daa87bcf8bf7cb4d1c74d872793e5e&metric=hits&range=today"
22
+ Metric::Receive.compose("hits", "today").should == request
23
+ end
24
+
25
+ it "gets week" do
26
+ request = "http://api.metric.io/receive?api_key=spec&token=c6daa87bcf8bf7cb4d1c74d872793e5e&metric=hits&range=week"
27
+ Metric::Receive.compose("hits", "week").should == request
28
+ end
29
+
30
+ it "gets month" do
31
+ request = "http://api.metric.io/receive?api_key=spec&token=c6daa87bcf8bf7cb4d1c74d872793e5e&metric=hits&range=month"
32
+ Metric::Receive.compose("hits", "month").should == request
33
+ end
34
+
35
+ it "grabs actual data" do
36
+ stub_request(:get, "http://api.metric.io/receive?api_key=spec&metric=hits&range=today&token=c6daa87bcf8bf7cb4d1c74d872793e5e").
37
+ to_return(:status => 200, :body => "{\"total\":\"1\"}", :headers => {})
38
+ Metric::Receive.receive("hits", "today").should == {"total" => "1"}
39
+ end
40
+ end
41
+
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Metric::Track do
4
+ before do
5
+ reset_config
6
+ end
7
+
8
+ it "composes the request url" do
9
+ Metric::Track.compose("hits").should == "http://api.metric.io/track?api_key=spec&metric=hits"
10
+ end
11
+
12
+ it "gets correct url when tracking" do
13
+ Metric::Track.should_receive(:compose).with("hits", {})
14
+ Metric::Track.track("hits")
15
+ end
16
+
17
+ it "encodes the request url" do
18
+ Metric::Track.parse_metric("hits and spaces").should == "&metric=hits+and+spaces"
19
+ end
20
+
21
+ it "sends trigger param" do
22
+ url = "http://api.metric.io/track?api_key=spec&metric=hits&trigger=1"
23
+ Metric::Track.compose("hits", {:trigger => true}).should == url
24
+ end
25
+
26
+ it "sends custom amount" do
27
+ url = "http://api.metric.io/track?api_key=spec&metric=hits&amount=42"
28
+ Metric::Track.compose("hits", {:amount => 42}).should == url
29
+ end
30
+
31
+ it "does nothing if amount is 0" do
32
+ Metric::Track.track("hits", {:amount => 0}).should == nil
33
+ end
34
+ end
35
+
36
+
@@ -5,27 +5,14 @@ describe Metric do
5
5
  reset_config
6
6
  end
7
7
 
8
- it "composes the request url" do
9
- Metric.compose("hits").should == "http://api.metric.io/track?api_key=spec&metric=hits"
10
- end
11
-
12
- it "gets correct url when tracking" do
13
- Metric.should_receive(:compose).with("hits", {})
8
+ it "passes through options to track" do
9
+ Metric::Track.should_receive(:track).with("hits", {})
14
10
  Metric.track("hits")
15
11
  end
16
12
 
17
- it "encodes the request url" do
18
- Metric.parse_metric("hits and spaces").should == "&metric=hits+and+spaces"
19
- end
20
-
21
- it "sends trigger param" do
22
- url = "http://api.metric.io/track?api_key=spec&metric=hits&trigger=1"
23
- Metric.compose("hits", {:trigger => true}).should == url
24
- end
25
-
26
- it "sends custom amount" do
27
- url = "http://api.metric.io/track?api_key=spec&metric=hits&amount=42"
28
- Metric.compose("hits", {:amount => 42}).should == url
13
+ it "passes through options to receive" do
14
+ Metric::Receive.should_receive(:receive).with("hits", "total")
15
+ Metric.receive("hits", "total")
29
16
  end
30
17
  end
31
18
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metric
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
5
- prerelease: false
4
+ hash: 19
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 5
10
- version: 0.0.5
9
+ - 6
10
+ version: 0.0.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Mark Mulder
@@ -15,11 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-08-31 00:00:00 +02:00
18
+ date: 2011-09-08 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: rspec
22
+ name: faraday
23
23
  prerelease: false
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
@@ -30,10 +30,10 @@ dependencies:
30
30
  segments:
31
31
  - 0
32
32
  version: "0"
33
- type: :development
33
+ type: :runtime
34
34
  version_requirements: *id001
35
35
  - !ruby/object:Gem::Dependency
36
- name: webmock
36
+ name: multi_json
37
37
  prerelease: false
38
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
39
  none: false
@@ -44,8 +44,36 @@ dependencies:
44
44
  segments:
45
45
  - 0
46
46
  version: "0"
47
- type: :development
47
+ type: :runtime
48
48
  version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: rspec
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :development
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ name: webmock
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ type: :development
76
+ version_requirements: *id004
49
77
  description: Track metrics via metric.io
50
78
  email:
51
79
  - markmulder@gmail.com
@@ -60,13 +88,18 @@ files:
60
88
  - .rspec
61
89
  - .travis.yml
62
90
  - Gemfile
91
+ - Gemfile.lock
63
92
  - README.markdown
64
93
  - Rakefile
65
94
  - lib/metric.rb
66
95
  - lib/metric/configuration.rb
96
+ - lib/metric/receive.rb
97
+ - lib/metric/track.rb
67
98
  - lib/metric/version.rb
68
99
  - metric.gemspec
69
100
  - spec/metric/configuration_spec.rb
101
+ - spec/metric/receive_spec.rb
102
+ - spec/metric/track_spec.rb
70
103
  - spec/metric_spec.rb
71
104
  - spec/spec_helper.rb
72
105
  has_rdoc: true
@@ -99,11 +132,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
132
  requirements: []
100
133
 
101
134
  rubyforge_project:
102
- rubygems_version: 1.3.7
135
+ rubygems_version: 1.6.2
103
136
  signing_key:
104
137
  specification_version: 3
105
138
  summary: Companion gem to the metric.io site to track metrics
106
139
  test_files:
107
140
  - spec/metric/configuration_spec.rb
141
+ - spec/metric/receive_spec.rb
142
+ - spec/metric/track_spec.rb
108
143
  - spec/metric_spec.rb
109
144
  - spec/spec_helper.rb