eshq 0.0.2
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/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/eshq.gemspec +26 -0
- data/lib/eshq/client.rb +36 -0
- data/lib/eshq/version.rb +3 -0
- data/lib/eshq.rb +27 -0
- data/test/client_test.rb +32 -0
- data/test/eshq_test.rb +45 -0
- metadata +112 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/eshq.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "eshq/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "eshq"
|
7
|
+
s.version = ESHQ::VERSION
|
8
|
+
s.authors = ["Mathias Biilmann Christensen"]
|
9
|
+
s.email = ["mathiasch@eventsourcehq.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{EventSource HQ API Client}
|
12
|
+
s.description = ""
|
13
|
+
|
14
|
+
s.rubyforge_project = "eshq"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
s.add_development_dependency "mocha"
|
23
|
+
s.add_development_dependency "timecop"
|
24
|
+
|
25
|
+
s.add_runtime_dependency "json"
|
26
|
+
end
|
data/lib/eshq/client.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require "digest/sha1"
|
2
|
+
require "net/http"
|
3
|
+
require "uri"
|
4
|
+
require "json"
|
5
|
+
|
6
|
+
module ESHQ
|
7
|
+
class Client
|
8
|
+
attr_reader :url, :key, :secret
|
9
|
+
|
10
|
+
def initialize(url, api_key, api_secret)
|
11
|
+
@url = url
|
12
|
+
@key = api_key
|
13
|
+
@secret = api_secret
|
14
|
+
end
|
15
|
+
|
16
|
+
def post(path, params)
|
17
|
+
response = Net::HTTP.post_form(url_for(path), params.merge(credentials))
|
18
|
+
JSON.parse(response.body)
|
19
|
+
end
|
20
|
+
|
21
|
+
def credentials
|
22
|
+
time = Time.now.to_i.to_s
|
23
|
+
{:key => key, :timestamp => time, :token => token(time)}
|
24
|
+
end
|
25
|
+
|
26
|
+
def token(time)
|
27
|
+
Digest::SHA1.hexdigest([key, secret, time].join(":"))
|
28
|
+
end
|
29
|
+
|
30
|
+
def url_for(path)
|
31
|
+
URI.parse(url).tap do |url|
|
32
|
+
url.path = path
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/eshq/version.rb
ADDED
data/lib/eshq.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require "eshq/version"
|
2
|
+
require "eshq/client"
|
3
|
+
|
4
|
+
module ESHQ
|
5
|
+
def self.client
|
6
|
+
@@client ||= Client.new(*settings)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.reset_client
|
10
|
+
@@client = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.open(options)
|
14
|
+
client.post("/socket", options)["socket"]
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.send(options)
|
18
|
+
client.post("/event", options)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def self.settings
|
23
|
+
["ESHQ_URL", "ESHQ_KEY", "ESHQ_SECRET"].map { |v|
|
24
|
+
ENV[v] || raise("Missing environment variable #{v}")
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
data/test/client_test.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "mocha"
|
3
|
+
require "timecop"
|
4
|
+
require "digest/sha1"
|
5
|
+
require "net/http"
|
6
|
+
|
7
|
+
require "eshq/client"
|
8
|
+
|
9
|
+
class TestClient < Test::Unit::TestCase
|
10
|
+
attr_reader :client
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@client = ESHQ::Client.new("http://example.com", "key", "secret")
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_post
|
17
|
+
Net::HTTP.expects(:post_form).with() { |uri, params|
|
18
|
+
uri.to_s == "http://example.com/socket" &&
|
19
|
+
params.keys.sort == [:key, :presence_id, :timestamp, :token]
|
20
|
+
}.returns(stub(:body => '{"socket": "12345"}'))
|
21
|
+
res = client.post("/socket", :presence_id => "Mathias")
|
22
|
+
assert_equal "12345", res["socket"]
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_credentials
|
26
|
+
t = Time.now
|
27
|
+
hash = Digest::SHA1.hexdigest("key:secret:#{t.to_i}")
|
28
|
+
Timecop.freeze(t) do
|
29
|
+
assert_equal({:key => "key", :timestamp => t.to_i.to_s, :token => hash}, client.credentials)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/test/eshq_test.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "mocha"
|
3
|
+
|
4
|
+
require "eshq"
|
5
|
+
|
6
|
+
class TestESHQ < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
ESHQ.reset_client
|
9
|
+
ENV["ESHQ_URL"] = "http://example.com"
|
10
|
+
ENV["ESHQ_KEY"] = "key"
|
11
|
+
ENV["ESHQ_SECRET"] = "secret"
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_client_instantiation
|
15
|
+
client = ESHQ.client
|
16
|
+
assert_equal "http://example.com", client.url
|
17
|
+
assert_equal "key", client.key
|
18
|
+
assert_equal "secret", client.secret
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_caches_client
|
22
|
+
ESHQ::Client.expects(:new).once.returns(stub(:client))
|
23
|
+
2.times { ESHQ.client }
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_missing_settings
|
27
|
+
ENV["ESHQ_KEY"] = nil
|
28
|
+
begin
|
29
|
+
ESHQ.client
|
30
|
+
flunk "No exception raised"
|
31
|
+
rescue => e
|
32
|
+
assert_match /Missing environment variable/, e.to_s
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_open
|
37
|
+
ESHQ.client.expects(:post).with("/socket", {:channel => "test"}).returns({"socket" => "12345"})
|
38
|
+
assert_equal "12345", ESHQ.open(:channel => "test")
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_send
|
42
|
+
ESHQ.client.expects(:post).with("/event", :channel => "test", :data => "Testing", :type => "test-event")
|
43
|
+
ESHQ.send(:channel => "test", :data => "Testing", :type => "test-event")
|
44
|
+
end
|
45
|
+
end
|
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: eshq
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Mathias Biilmann Christensen
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-09-26 00:00:00 +02:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: mocha
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
type: :development
|
32
|
+
version_requirements: *id001
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: timecop
|
35
|
+
prerelease: false
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
version: "0"
|
44
|
+
type: :development
|
45
|
+
version_requirements: *id002
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: json
|
48
|
+
prerelease: false
|
49
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
segments:
|
55
|
+
- 0
|
56
|
+
version: "0"
|
57
|
+
type: :runtime
|
58
|
+
version_requirements: *id003
|
59
|
+
description: ""
|
60
|
+
email:
|
61
|
+
- mathiasch@eventsourcehq.com
|
62
|
+
executables: []
|
63
|
+
|
64
|
+
extensions: []
|
65
|
+
|
66
|
+
extra_rdoc_files: []
|
67
|
+
|
68
|
+
files:
|
69
|
+
- .gitignore
|
70
|
+
- Gemfile
|
71
|
+
- Rakefile
|
72
|
+
- eshq.gemspec
|
73
|
+
- lib/eshq.rb
|
74
|
+
- lib/eshq/client.rb
|
75
|
+
- lib/eshq/version.rb
|
76
|
+
- test/client_test.rb
|
77
|
+
- test/eshq_test.rb
|
78
|
+
has_rdoc: true
|
79
|
+
homepage: ""
|
80
|
+
licenses: []
|
81
|
+
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
|
85
|
+
require_paths:
|
86
|
+
- lib
|
87
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
segments:
|
93
|
+
- 0
|
94
|
+
version: "0"
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
segments:
|
101
|
+
- 0
|
102
|
+
version: "0"
|
103
|
+
requirements: []
|
104
|
+
|
105
|
+
rubyforge_project: eshq
|
106
|
+
rubygems_version: 1.3.7
|
107
|
+
signing_key:
|
108
|
+
specification_version: 3
|
109
|
+
summary: EventSource HQ API Client
|
110
|
+
test_files:
|
111
|
+
- test/client_test.rb
|
112
|
+
- test/eshq_test.rb
|