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 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