mirror-api 0.0.1 → 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/.rspec +1 -0
- data/.travis.yml +4 -0
- data/README.md +16 -4
- data/Rakefile +3 -0
- data/lib/mirror-api/base.rb +20 -11
- data/lib/mirror-api/timeline.rb +30 -8
- data/lib/mirror-api/timeline_item_request.rb +33 -0
- data/lib/mirror-api/timeline_request.rb +32 -0
- data/lib/mirror-api/version.rb +1 -1
- data/mirror-api.gemspec +8 -3
- data/spec/fixtures/timeline_item.json +9 -0
- data/spec/fixtures/timeline_item_response_headers.json +5 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/timeline_spec.rb +64 -0
- metadata +81 -4
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Mirror::Api
|
2
2
|
|
3
|
-
Mirror
|
3
|
+
Simple Mirror Api client library
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -19,16 +19,28 @@ Or install it yourself as:
|
|
19
19
|
## Usage
|
20
20
|
|
21
21
|
``` ruby
|
22
|
+
api = Mirror::Api::Timeline.new(token)
|
23
|
+
|
24
|
+
# Getting all the timeline items
|
25
|
+
items = api.list
|
22
26
|
|
23
27
|
# Insert a simple text item - https://developers.google.com/glass/timeline#inserting_a_simple_timeline_item
|
24
|
-
|
25
|
-
item = timeline_api.post({:text => "Hello Word"})
|
28
|
+
item1 = api.create({text: "Hello Word"})
|
26
29
|
|
27
30
|
# Inserting an item with reply actions - https://developers.google.com/glass/timeline#user_interaction_with_menu_items
|
28
|
-
item2 =
|
31
|
+
item2 = api.create({text: "Hello Word", menu_items:[{action: "REPLY"}]})
|
32
|
+
|
33
|
+
item2 = api.update(item2.id, {text: "Hello Again Word", menu_items:[{action: "REPLY"}]})
|
29
34
|
|
35
|
+
api.delete(item2.id)
|
30
36
|
```
|
31
37
|
|
38
|
+
## See Also
|
39
|
+
|
40
|
+
Generic Google API Ruby Client
|
41
|
+
|
42
|
+
https://github.com/google/google-api-ruby-client
|
43
|
+
|
32
44
|
## Contributing
|
33
45
|
|
34
46
|
1. Fork it
|
data/Rakefile
CHANGED
data/lib/mirror-api/base.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
require "rest-client"
|
2
|
+
require "json"
|
3
|
+
require "hashie/mash"
|
4
|
+
|
1
5
|
module Mirror
|
2
6
|
module Api
|
3
7
|
|
@@ -5,7 +9,7 @@ module Mirror
|
|
5
9
|
|
6
10
|
attr_accessor :last_error, :logger, :host, :last_exception, :throw_on_fail, :response, :data, :creds
|
7
11
|
|
8
|
-
def initialize(credentials, throw_on_fail=false, host, logger=nil)
|
12
|
+
def initialize(credentials, throw_on_fail=false, host="https://www.googleapis.com", logger=nil)
|
9
13
|
@creds = credentials
|
10
14
|
@last_exception = nil
|
11
15
|
@throw_on_fail = throw_on_fail
|
@@ -41,15 +45,22 @@ module Mirror
|
|
41
45
|
@request = request
|
42
46
|
case response.code
|
43
47
|
when 422
|
44
|
-
@logger
|
48
|
+
if @logger
|
49
|
+
msg = "ERROR - Rejected #{request.inspect} to #{self.invoke_url} with params #{self.params}. Response is #{response.body}"
|
50
|
+
@logger.error(msg)
|
51
|
+
end
|
45
52
|
response
|
46
53
|
else
|
47
54
|
response.return!(request, result, &block)
|
48
55
|
end
|
49
56
|
end
|
50
57
|
|
58
|
+
def expected_response
|
59
|
+
200
|
60
|
+
end
|
61
|
+
|
51
62
|
def successful_response?
|
52
|
-
@response and @response.code ==
|
63
|
+
@response and @response.code == expected_response
|
53
64
|
end
|
54
65
|
|
55
66
|
def ret_val
|
@@ -57,13 +68,11 @@ module Mirror
|
|
57
68
|
end
|
58
69
|
|
59
70
|
def headers
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
}
|
66
|
-
end
|
71
|
+
{
|
72
|
+
"Accept" => "application/json",
|
73
|
+
"Content-type" => "application/json",
|
74
|
+
"Authorization" => "Bearer #{@creds[:token]}"
|
75
|
+
}
|
67
76
|
end
|
68
77
|
|
69
78
|
def handle_response
|
@@ -86,7 +95,7 @@ module Mirror
|
|
86
95
|
def handle_exception(error_desc, msg, ex, params={})
|
87
96
|
@last_exception = ex
|
88
97
|
@last_error = error_desc
|
89
|
-
msg += " with params #{params}" if params.keys.count > 0
|
98
|
+
msg += " with params #{params}" if params && params.keys.count > 0
|
90
99
|
msg += " due to #{ex}.\n" + ex.backtrace.join("\n")
|
91
100
|
@logger.error(msg) if @logger
|
92
101
|
|
data/lib/mirror-api/timeline.rb
CHANGED
@@ -1,18 +1,40 @@
|
|
1
|
+
require_relative "timeline_request"
|
2
|
+
require_relative "timeline_item_request"
|
3
|
+
|
1
4
|
module Mirror
|
2
5
|
module Api
|
3
|
-
class Timeline
|
6
|
+
class Timeline
|
7
|
+
|
8
|
+
def initialize(credentials)
|
9
|
+
@credentials = if credentials.is_a?(String)
|
10
|
+
{:token => credentials}
|
11
|
+
elsif credentials.is_a?(Hash)
|
12
|
+
credentials
|
13
|
+
end
|
14
|
+
|
15
|
+
raise "Invalid credentials #{credentials.inspect}" unless @credentials
|
16
|
+
end
|
17
|
+
|
18
|
+
def list(params={})
|
19
|
+
TimelineRequest.new(params, 200, @credentials).get
|
20
|
+
end
|
21
|
+
|
22
|
+
def create(params)
|
23
|
+
TimelineRequest.new(params, 201, @credentials).post
|
24
|
+
end
|
4
25
|
|
5
|
-
def
|
6
|
-
@
|
26
|
+
def get(id, params=nil)
|
27
|
+
TimelineItemRequest.new(id, params, 200, @credentials).get
|
7
28
|
end
|
8
29
|
|
9
|
-
def params
|
10
|
-
|
30
|
+
def update(id, params)
|
31
|
+
# This may become patch later
|
32
|
+
TimelineItemRequest.new(id, params, 200, @credentials).put
|
11
33
|
end
|
12
34
|
|
13
|
-
def
|
14
|
-
|
35
|
+
def delete(id)
|
36
|
+
TimelineItemRequest.new(id, nil, 200, @credentials).delete
|
15
37
|
end
|
16
38
|
end
|
17
39
|
end
|
18
|
-
end
|
40
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module Mirror
|
4
|
+
module Api
|
5
|
+
HOST = "https://www.googleapis.com"
|
6
|
+
|
7
|
+
class TimelineItemRequest < Mirror::Api::Base
|
8
|
+
|
9
|
+
def initialize(id, params, expected_response, creds, raise_errors=false, host=Mirror::Api::HOST, logger=nil)
|
10
|
+
@id = id
|
11
|
+
@params = params
|
12
|
+
@expected_response = expected_response
|
13
|
+
super(creds, raise_errors)
|
14
|
+
end
|
15
|
+
|
16
|
+
def invoke_url
|
17
|
+
@invoke_url ||="#{self.host}/mirror/v1/timeline/#{@id}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def params
|
21
|
+
@params ||={}
|
22
|
+
end
|
23
|
+
|
24
|
+
def ret_val
|
25
|
+
Hashie::Mash.new(@data)
|
26
|
+
end
|
27
|
+
|
28
|
+
def expected_response
|
29
|
+
@expected_response
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module Mirror
|
4
|
+
module Api
|
5
|
+
HOST = "https://www.googleapis.com"
|
6
|
+
|
7
|
+
class TimelineRequest < Mirror::Api::Base
|
8
|
+
|
9
|
+
def initialize(params, expected_response, creds, raise_errors=false, host=Mirror::Api::HOST, logger=nil)
|
10
|
+
@params = params
|
11
|
+
@expected_response = expected_response
|
12
|
+
super(creds, raise_errors)
|
13
|
+
end
|
14
|
+
|
15
|
+
def invoke_url
|
16
|
+
@invoke_url ||="#{self.host}/mirror/v1/timeline"
|
17
|
+
end
|
18
|
+
|
19
|
+
def params
|
20
|
+
@params ||={}
|
21
|
+
end
|
22
|
+
|
23
|
+
def ret_val
|
24
|
+
Hashie::Mash.new(@data)
|
25
|
+
end
|
26
|
+
|
27
|
+
def expected_response
|
28
|
+
@expected_response
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/mirror-api/version.rb
CHANGED
data/mirror-api.gemspec
CHANGED
@@ -6,11 +6,11 @@ require 'mirror-api/version'
|
|
6
6
|
Gem::Specification.new do |gem|
|
7
7
|
gem.name = "mirror-api"
|
8
8
|
gem.version = Mirror::Api::VERSION
|
9
|
-
gem.authors = ["Monica Wilkinson"]
|
10
|
-
gem.email = ["
|
9
|
+
gem.authors = ["Monica Wilkinson", "Drew Baumann"]
|
10
|
+
gem.email = ["monica@crushpath.com"]
|
11
11
|
gem.description = %q{Wrapper for Google Glass Mirror API v1}
|
12
12
|
gem.summary = %q{https://developers.google.com/glass/v1/reference/}
|
13
|
-
gem.homepage = ""
|
13
|
+
gem.homepage = "https://github.com/ciberch/mirror-api"
|
14
14
|
|
15
15
|
gem.files = `git ls-files`.split($/)
|
16
16
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
@@ -18,4 +18,9 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.require_paths = ["lib"]
|
19
19
|
|
20
20
|
gem.add_dependency "rest-client"
|
21
|
+
gem.add_runtime_dependency "hashie"
|
22
|
+
gem.add_runtime_dependency "json"
|
23
|
+
|
24
|
+
gem.add_development_dependency "rspec"
|
25
|
+
gem.add_development_dependency "webmock"
|
21
26
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
{
|
2
|
+
"kind": "glass#timelineItem",
|
3
|
+
"id": "1234567890",
|
4
|
+
"selfLink": "https://www.googleapis.com/mirror/v1/timeline/1234567890",
|
5
|
+
"created": "2012-09-25T23:28:43.192Z",
|
6
|
+
"updated": "2012-09-25T23:28:43.192Z",
|
7
|
+
"etag": "\"G5BI0RWvj-0jWdBrdWrPZV7xPKw/t25selcGS3uDEVT6FB09hAG-QQ\"",
|
8
|
+
"text": "Hello world"
|
9
|
+
}
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require "rspec"
|
2
|
+
require 'webmock/rspec'
|
3
|
+
require 'webmock'
|
4
|
+
|
5
|
+
require_relative "../lib/mirror-api/timeline.rb"
|
6
|
+
|
7
|
+
def fixture_path
|
8
|
+
File.expand_path("../fixtures", __FILE__)
|
9
|
+
end
|
10
|
+
|
11
|
+
def fixture(file, read=false)
|
12
|
+
file = File.new(fixture_path + '/' + file)
|
13
|
+
return File.read(file) if read
|
14
|
+
file
|
15
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require_relative "spec_helper"
|
2
|
+
|
3
|
+
describe Mirror::Api::Timeline do
|
4
|
+
before do
|
5
|
+
@token = "my-token"
|
6
|
+
@api = Mirror::Api::Timeline.new(@token)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "create" do
|
10
|
+
describe "inserting" do
|
11
|
+
|
12
|
+
context "with valid params" do
|
13
|
+
before do
|
14
|
+
@msg = "Hello world"
|
15
|
+
|
16
|
+
stub_request(:post, "https://www.googleapis.com/mirror/v1/timeline").
|
17
|
+
with(body: {text: @msg},
|
18
|
+
headers: json_post_request_headers).
|
19
|
+
to_return(status: 201,
|
20
|
+
body: fixture("timeline_item.json", true),
|
21
|
+
headers: JSON.parse(fixture("timeline_item_response_headers.json", true)))
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should insert plain text items" do
|
25
|
+
item = @api.create({text: @msg})
|
26
|
+
item.should_not be_nil
|
27
|
+
item.created.should == "2012-09-25T23:28:43.192Z" # see fixture
|
28
|
+
item.text.should == @msg
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "with invalid params" do
|
33
|
+
before do
|
34
|
+
@msg = "Hello world"
|
35
|
+
|
36
|
+
# TODO: Verify error code is 422
|
37
|
+
stub_request(:post, "https://www.googleapis.com/mirror/v1/timeline").
|
38
|
+
with(body: {random: "123"},
|
39
|
+
headers: json_post_request_headers).
|
40
|
+
to_return(status: 422, body: {}.to_json,
|
41
|
+
headers: {})
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should not insert the item" do
|
45
|
+
|
46
|
+
item = @api.create({random: "123"})
|
47
|
+
item.should be_nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def json_post_request_headers
|
53
|
+
{
|
54
|
+
'Accept'=>'application/json',
|
55
|
+
'Accept-Encoding'=>'gzip, deflate',
|
56
|
+
'Authorization'=>"Bearer #{@token}",
|
57
|
+
'Content-Length'=>/\d+/,
|
58
|
+
'Content-Type'=>'application/x-www-form-urlencoded',
|
59
|
+
'User-Agent'=>'Ruby'
|
60
|
+
}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
metadata
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mirror-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Monica Wilkinson
|
9
|
+
- Drew Baumann
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
@@ -27,14 +28,80 @@ dependencies:
|
|
27
28
|
- - ! '>='
|
28
29
|
- !ruby/object:Gem::Version
|
29
30
|
version: '0'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: hashie
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
type: :runtime
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: json
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: rspec
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: webmock
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
type: :development
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
30
95
|
description: Wrapper for Google Glass Mirror API v1
|
31
96
|
email:
|
32
|
-
-
|
97
|
+
- monica@crushpath.com
|
33
98
|
executables: []
|
34
99
|
extensions: []
|
35
100
|
extra_rdoc_files: []
|
36
101
|
files:
|
37
102
|
- .gitignore
|
103
|
+
- .rspec
|
104
|
+
- .travis.yml
|
38
105
|
- Gemfile
|
39
106
|
- LICENSE.txt
|
40
107
|
- README.md
|
@@ -43,9 +110,15 @@ files:
|
|
43
110
|
- lib/mirror-api.rb
|
44
111
|
- lib/mirror-api/base.rb
|
45
112
|
- lib/mirror-api/timeline.rb
|
113
|
+
- lib/mirror-api/timeline_item_request.rb
|
114
|
+
- lib/mirror-api/timeline_request.rb
|
46
115
|
- lib/mirror-api/version.rb
|
47
116
|
- mirror-api.gemspec
|
48
|
-
|
117
|
+
- spec/fixtures/timeline_item.json
|
118
|
+
- spec/fixtures/timeline_item_response_headers.json
|
119
|
+
- spec/spec_helper.rb
|
120
|
+
- spec/timeline_spec.rb
|
121
|
+
homepage: https://github.com/ciberch/mirror-api
|
49
122
|
licenses: []
|
50
123
|
post_install_message:
|
51
124
|
rdoc_options: []
|
@@ -69,4 +142,8 @@ rubygems_version: 1.8.24
|
|
69
142
|
signing_key:
|
70
143
|
specification_version: 3
|
71
144
|
summary: https://developers.google.com/glass/v1/reference/
|
72
|
-
test_files:
|
145
|
+
test_files:
|
146
|
+
- spec/fixtures/timeline_item.json
|
147
|
+
- spec/fixtures/timeline_item_response_headers.json
|
148
|
+
- spec/spec_helper.rb
|
149
|
+
- spec/timeline_spec.rb
|