hookercookerman-amee 0.1.9 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -3,7 +3,6 @@ LICENSE.txt
3
3
  Manifest.txt
4
4
  README.rdoc
5
5
  Rakefile
6
- amee.gemspec.old
7
6
  features/config.feature
8
7
  features/data/data_category.feature
9
8
  features/data/data_item.feature
data/amee.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{amee}
5
- s.version = '0.1.9'
5
+ s.version = '0.2.0'
6
6
 
7
7
  s.homepage = 'http://github.com/hookercookerman/amee/tree/master'
8
8
  s.description = %q{Its a gem to interact with the amee api}
@@ -1,13 +1,18 @@
1
1
  Feature: Creating a Profile
2
2
  In order to keep a container for an object | user for calculating co2 emissions
3
3
  As a amee developer
4
- I want to be alble to create a profile
4
+ I want to be able to create a profile
5
5
 
6
6
 
7
7
  Scenario: Create a amee profile
8
8
  Given I have a valid amee session
9
9
  When I create an amee profile
10
10
  Then I should have a valid amee profile
11
+
12
+
13
+ Scenario: Create a amee profile with representation none
14
+ Given I have a valid amee session
15
+ When I create an amee profile with representation false
11
16
 
12
17
 
13
18
 
@@ -22,7 +22,7 @@ When(/^I create a profile item with data_item_uid: \"(\S+)\" the path: \"(.*)\"/
22
22
  FakeWeb.register_uri(:post, "http://stage.amee.com#{path}?kWhPerMonth=10&dataItemUid=66056991EE23&representation=full",
23
23
  :file => File.join(AMEE_FIXTURE_PATH, "/profiles/BB1BDB4FDD77/home/energy/quantity/response.json")
24
24
  )
25
- @models["profile_category"] = @amee_session.create_profile_item(path, uid, :fields => {:kWhPerMonth => "10"})
25
+ @models["profile_category"] = @amee_session.create_profile_item(path, uid, :representation => true, :query => {:kWhPerMonth => "10"})
26
26
  end
27
27
 
28
28
  When(/^I update the profile item with: distance=400$/) do
@@ -5,6 +5,13 @@ When(/^I create an amee profile$/) do
5
5
  @models["profile"] = @amee_session.create_profile
6
6
  end
7
7
 
8
+ When(/^I create an amee profile with representation false$/) do
9
+ FakeWeb.register_uri(:post, "http://stage.amee.com/profiles?profile=true",
10
+ :file => File.join(AMEE_FIXTURE_PATH, "profiles/profile.json")
11
+ )
12
+ @models["profile"] = @amee_session.create_profile
13
+ end
14
+
8
15
  Then(/^I should have a valid amee profile$/) do
9
16
  @models["profile"].name.should == "180D73DA5229"
10
17
  @models["profile"].uid.should == "180D73DA5229"
@@ -10,8 +10,10 @@ module Amee
10
10
  :data_items => {:class => Amee::DataApi::DataItem}
11
11
  item_populators :item_definition => {:class => Amee::DataApi::ItemDefinition}
12
12
 
13
- # essentially the parent category
14
- attr_accessor :data_category, :pager
13
+ # data_category; essentially the parent category
14
+ # raw_data_items; the raw hash of data_items found form the data_category
15
+ # this allows quick easy access to the data_item_values; if needed
16
+ attr_accessor :data_category, :pager, :raw_data_items
15
17
 
16
18
  # we can only drill with a data_category that has data_items
17
19
  #
data/lib/amee/parser.rb CHANGED
@@ -16,8 +16,10 @@ module Amee
16
16
  pager = {"pager" => data["children"].delete("pager")}
17
17
  categories = {"data_categories" => data["children"].delete("dataCategories")}
18
18
  data_items = {"data_items" => data["children"]["dataItems"].delete("rows")} if data["children"]["dataItems"]
19
+ raw_data_items = {"raw_data_items" => data_items}
19
20
  category.merge(categories).
20
21
  merge(data_items).
22
+ merge(raw_data_items).
21
23
  merge(pager).
22
24
  merge({"resource_path" => data["path"]})
23
25
  end
@@ -109,6 +111,18 @@ module Amee
109
111
  end
110
112
  end
111
113
 
114
+ class ProfileItemLocation < Parser
115
+ def self.process(data)
116
+ data.headers["location"].first
117
+ end
118
+ end
119
+
120
+ class HttpOk < Parser
121
+ def self.process(data)
122
+ true
123
+ end
124
+ end
125
+
112
126
 
113
127
  class Raw < Parser
114
128
  def self.process(data)
@@ -118,6 +132,9 @@ module Amee
118
132
 
119
133
  class Parser
120
134
  PARSERS = {
135
+ # @todo consitant naming
136
+ "ok" => HttpOk,
137
+ 'profile_item.location' => ProfileItemLocation,
121
138
  'data.category' => DataCategory,
122
139
  'data.item' => DataItem,
123
140
  "data.item_value" => DataItemValue,
@@ -15,7 +15,7 @@ module Amee
15
15
  end
16
16
 
17
17
  def create_profile_item(path_or_category, data_item_uid, params = {})
18
- path = full_path + (path_or_category.is_a?(String) ? "#{path_or_category}" : "#{path_or_category.full_path}")
18
+ path = full_path + (path_or_category.is_a?(String) ? "#{path_or_category}" : "#{path_or_category.resource_path}")
19
19
  session.create_profile_item(path, data_item_uid, params)
20
20
  end
21
21
 
@@ -27,8 +27,8 @@ module Amee
27
27
  session.get_profile_category((full_path + path), options)
28
28
  end
29
29
 
30
- def update_profile_item(path, fields)
31
- session.update_profile_item((full_path + path), :fields => fields)
30
+ def update_profile_item(path, query)
31
+ session.update_profile_item((full_path + path), :query => query)
32
32
  end
33
33
 
34
34
  def destroy
@@ -17,13 +17,13 @@ module Amee
17
17
  # @todo This currently will not work as profile data_item brings back a profile_category
18
18
  # How stupid is that!
19
19
  def self.create(session, path, data_item_uid, fields ={})
20
- hash = session.create_profile_item(path, data_item_uid, {:fields => fields, :hash_response => true})
20
+ hash = session.create_profile_item(path, data_item_uid, {:query => fields, :raw_response => true})
21
21
  self.from_hash(hash, session)
22
22
  end
23
23
 
24
24
  def update(fields = {})
25
25
  session.api_call(:put, "profile_item", self.full_path,
26
- :query => fields.merge({:representation => true})) do |response|
26
+ :query => fields) do |response|
27
27
  populate_from_hash!(response)
28
28
  self
29
29
  end
data/lib/amee/service.rb CHANGED
@@ -42,7 +42,7 @@ module Amee
42
42
  def perform_request(type, method, path, options)
43
43
  attach_headers(options)
44
44
  response = self.class.send(type, path, options)
45
- check_response(response.code)
45
+ check_response(response)
46
46
  Parser.parse(method, response)
47
47
  rescue Errno::ECONNREFUSED, SocketError
48
48
  raise Amee::Session::ServerNotFound, "Amee Server could not be found"
@@ -71,8 +71,8 @@ module Amee
71
71
  # @raise [Amee::UnAuthorized] if a auth_token could not be generated
72
72
  # @raise [Amee::SessionExpired] if a we get a 401
73
73
  # @raise [Amee::UnknownError] if we get something strange
74
- def check_response(code)
75
- case code
74
+ def check_response(response)
75
+ case response.code
76
76
  when 200, 201
77
77
  true
78
78
  when 403
@@ -82,7 +82,7 @@ module Amee
82
82
  when 404
83
83
  raise Amee::Session::NotFound.new("resource was not found")
84
84
  else
85
- raise Amee::Session::UnknownError.new("super strange type unknown error")
85
+ raise Amee::Session::UnknownError.new("super strange type unknown error: #{response.code} :body #{response.body}")
86
86
  end
87
87
  end
88
88
 
data/lib/amee/session.rb CHANGED
@@ -1,13 +1,14 @@
1
1
  module Amee
2
2
  class Session
3
3
 
4
- class Expired < StandardError; end
5
- class UnAuthorized < StandardError; end
6
- class NotAuthenticated < StandardError; end
7
- class PermissionDenied < StandardError; end
8
- class NotFound < StandardError; end
9
- class ServerNotFound < StandardError; end
10
- class UnknownError < StandardError; end
4
+ class AmeeError < StandardError ;end
5
+ class Expired < AmeeError; end
6
+ class UnAuthorized < AmeeError; end
7
+ class NotAuthenticated < AmeeError; end
8
+ class PermissionDenied < AmeeError; end
9
+ class NotFound < AmeeError; end
10
+ class ServerNotFound < AmeeError; end
11
+ class UnknownError < AmeeError; end
11
12
  attr_accessor :auth_token, :cache, :service
12
13
 
13
14
  def self.create(username = nil, password = nil)
@@ -147,20 +148,30 @@ module Amee
147
148
  end
148
149
  end
149
150
 
151
+ # @note representation FULL is not working on AMEE VERSION 2.0
152
+ # ticket has been raised
153
+ #
150
154
  # @return [Amee::ProfileApi::ProfileItem]
151
155
  def update_profile_item(path, options = {})
152
156
  @cache.clear
153
- api_call(:put, "profile_item", path, :query => {:representation => options[:representation] || true}.merge(options[:fields])) do |response|
157
+ api_call(:put, options[:representation] ? "profile_item" : "ok", path,
158
+ :body => {:representation => options[:representation] ? "full" : ""}.merge(options[:query])) do |response|
159
+ return response if (options[:raw_response] || !response.is_a?(Hash))
154
160
  Amee::ProfileApi::ProfileItem.from_hash(response, self)
155
161
  end
156
162
  end
157
163
 
164
+
165
+ # If you want a full representation; which is the profile category by the way
166
+ # then pass :representation => true in the options hash
167
+ #
158
168
  # @return [Amee::ProfileApi::ProfileCategory]
169
+ # @return [String] the location of the new resource if representation is passed in options
159
170
  def create_profile_item(path, uid, options = {})
160
171
  @cache.clear
161
- api_call(:post, "create.profile_item", path,
162
- :query => {:dataItemUid => uid, :representation => "full"}.merge(options[:fields])) do |response|
163
- return response if options[:hash_response]
172
+ api_call(:post, options[:representation] ? "create.profile_item" : "profile_item.location", path,
173
+ :query => {:dataItemUid => uid, :representation => options[:representation] ? "full" : ""}.merge(options[:query])) do |response|
174
+ return response if (options[:raw_response] || !response.is_a?(Hash))
164
175
  Amee::ProfileApi::ProfileCategory.from_hash(response, self) do |profile_category|
165
176
  profile_category.lazy_loaded = true
166
177
  end
@@ -233,8 +244,9 @@ module Amee
233
244
  end
234
245
 
235
246
  protected
247
+ require 'digest/md5'
236
248
  def cache_key(path, params = {})
237
- path + params.map { |key,value| "#{key}=#{value}" }.join('/')
249
+ Digest::MD5.hexdigest(path + params.map { |key,value| "#{key}=#{value}" }.join('/'))
238
250
  end
239
251
 
240
252
  end
data/lib/amee.rb CHANGED
@@ -36,5 +36,5 @@ require "amee/profile_api/profile_category"
36
36
  require "amee/profile_api/profile"
37
37
 
38
38
  module Amee
39
- VERSION = '0.1.9'
39
+ VERSION = '0.2.0'
40
40
  end
data/spec/service_spec.rb CHANGED
@@ -16,7 +16,7 @@ describe "Given FakeRequests Are Setup" do
16
16
 
17
17
  it "should send a request with headers of AuthToken And Accept" do
18
18
  Amee::Service.should_receive(:get).
19
- with("/path", {:headers => {"authToken" => "whatever token", "Accept" => Amee::Config[:accept]}}).
19
+ with("http://stage.amee.com/path", {:headers => {"authToken" => "whatever token", "Accept" => Amee::Config[:accept]}}).
20
20
  and_return(mock("response",:code => 200))
21
21
  @service.get("raw", "/path")
22
22
  end
data/spec/session_spec.rb CHANGED
@@ -38,7 +38,7 @@ describe "Given we have setup the fake requests" do
38
38
  end
39
39
 
40
40
  it "should try to use default cache expires_in if none given" do
41
- @amee_session.cache.should_receive(:store).with("/path", "result", {:expires_in=>86400})
41
+ @amee_session.cache.should_receive(:store).with(Digest::MD5.hexdigest("/path"), "result", {:expires_in=>86400})
42
42
  @amee_session.store_resource("/path", "result")
43
43
  end
44
44
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hookercookerman-amee
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Hooker