mirror-api 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 1.9.2
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Mirror::Api
2
2
 
3
- Mirror API client
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
- timeline_api = Mirror::Api::Timeline.new({:token => access_token})
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 = timeline_api.post({:text => "Hello Word", :menu_items => [{:action => "REPLY"}]})
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
@@ -1 +1,4 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+
4
+ require 'rake/testtask'
@@ -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.error("ERROR - Rejected #{request.inspect} to #{self.invoke_url} with params #{self.params}. Response is #{response.body}")
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 == 200
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
- if @creds and @creds['token']
61
- {
62
- "Accept" => "application/json",
63
- "Content-type" => "application/json",
64
- "Authorization" => "Bearer #{@creds['token']}"
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
 
@@ -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 < Mirror::Api::Base
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 invoke_url
6
- @invoke_url ||="#{self.host}/mirror/v1/timeline"
26
+ def get(id, params=nil)
27
+ TimelineItemRequest.new(id, params, 200, @credentials).get
7
28
  end
8
29
 
9
- def params
10
- @params
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 successful_response?
14
- @response and @response.code == 201
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
@@ -1,5 +1,5 @@
1
1
  module Mirror
2
2
  module Api
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
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 = ["ciberch@gmail.com"]
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
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "Date" : "Tue, 25 Sep 2012 23:30:11 GMT",
3
+ "Content-Type" : "application/json",
4
+ "Content-Length" : 303
5
+ }
@@ -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.1
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
- - ciberch@gmail.com
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
- homepage: ''
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