jirafe 0.1.0

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.
Files changed (148) hide show
  1. data/.autotest +5 -0
  2. data/.gitignore +23 -0
  3. data/.rbenv-version +1 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +11 -0
  6. data/Gemfile +8 -0
  7. data/LICENSE +13 -0
  8. data/README.md +104 -0
  9. data/Rakefile +27 -0
  10. data/fixtures/responses/application_get_with_cloud_token.yml +40 -0
  11. data/fixtures/responses/application_get_with_invalid_token.yml +41 -0
  12. data/fixtures/responses/application_get_with_master_token.yml +784 -0
  13. data/fixtures/responses/application_get_with_reporting_token.yml +38 -0
  14. data/fixtures/responses/application_post_with_app_token.yml +38 -0
  15. data/fixtures/responses/application_post_with_cloud_token.yml +76 -0
  16. data/fixtures/responses/application_post_with_invalid_token.yml +79 -0
  17. data/fixtures/responses/application_post_with_master_token.yml +784 -0
  18. data/fixtures/responses/application_post_with_master_token_blank_name.yml +79 -0
  19. data/fixtures/responses/application_post_with_master_token_dupe_name.yml +76 -0
  20. data/fixtures/responses/application_post_with_master_token_no_name.yml +79 -0
  21. data/fixtures/responses/application_post_with_reporting_token.yml +76 -0
  22. data/fixtures/responses/application_put_with_cloud_token.yml +68 -0
  23. data/fixtures/responses/application_put_with_invalid_token.yml +145 -0
  24. data/fixtures/responses/application_put_with_master_token.yml +68 -0
  25. data/fixtures/responses/application_put_with_reporting_token.yml +68 -0
  26. data/fixtures/responses/application_sites_get_with_master_token.yml +38 -0
  27. data/fixtures/responses/callback_event_post_event.yml +2000 -0
  28. data/fixtures/responses/callback_event_post_event_fetch_token.yml +1473 -0
  29. data/fixtures/responses/jirafe_resource_get_status_url.yml +38 -0
  30. data/fixtures/responses/jirafe_resource_get_status_url_with_query_param.yml +38 -0
  31. data/fixtures/responses/site_abandon_rate_get_with_master_token.yml +49 -0
  32. data/fixtures/responses/site_abandoned_average_ordervalue_get_with_master_token.yml +49 -0
  33. data/fixtures/responses/site_abandoned_carts_get_with_master_token.yml +49 -0
  34. data/fixtures/responses/site_abandoned_revenue_get_with_master_token.yml +49 -0
  35. data/fixtures/responses/site_average_order_value_get_with_master_token.yml +49 -0
  36. data/fixtures/responses/site_bounces_rate_get_with_master_token.yml +49 -0
  37. data/fixtures/responses/site_cart_segmentation_get_with_master_token.yml +38 -0
  38. data/fixtures/responses/site_conversion_rate_get_with_master_token.yml +49 -0
  39. data/fixtures/responses/site_conversions_get_with_master_token.yml +49 -0
  40. data/fixtures/responses/site_customers_get_with_master_token.yml +49 -0
  41. data/fixtures/responses/site_dashboard_get_with_master_token.yml +60 -0
  42. data/fixtures/responses/site_get_with_master_token.yml +73 -0
  43. data/fixtures/responses/site_keywords_get_with_master_token.yml +38 -0
  44. data/fixtures/responses/site_orders_status_get_with_master_token.yml +38 -0
  45. data/fixtures/responses/site_origins_get_with_master_token.yml +38 -0
  46. data/fixtures/responses/site_period_data_get_with_master_token.yml +38 -0
  47. data/fixtures/responses/site_post_with_app_token.yml +727 -0
  48. data/fixtures/responses/site_post_with_master_token.yml +1569 -0
  49. data/fixtures/responses/site_products_get_with_master_token.yml +38 -0
  50. data/fixtures/responses/site_referers_get_with_master_token.yml +38 -0
  51. data/fixtures/responses/site_revenues_average_get_with_master_token.yml +49 -0
  52. data/fixtures/responses/site_revenues_get_with_master_token.yml +49 -0
  53. data/fixtures/responses/site_segments_carts_get_with_admin_token.yml +108 -0
  54. data/fixtures/responses/site_segments_sales_get_with_admin_token.yml +143 -0
  55. data/fixtures/responses/site_total_carts_get_with_master_token.yml +49 -0
  56. data/fixtures/responses/site_translations__get_with_master_token.yml +155 -0
  57. data/fixtures/responses/site_translations_de_get_with_master_token.yml +156 -0
  58. data/fixtures/responses/site_translations_es_get_with_master_token.yml +155 -0
  59. data/fixtures/responses/site_translations_fr_get_with_master_token.yml +178 -0
  60. data/fixtures/responses/site_translations_german_get_with_master_token.yml +156 -0
  61. data/fixtures/responses/site_translations_get_with_master_token.yml +865 -0
  62. data/fixtures/responses/site_translations_xx_get_with_master_token.yml +155 -0
  63. data/fixtures/responses/site_visits_get_with_master_token.yml +49 -0
  64. data/fixtures/responses/status_get.yml +38 -0
  65. data/fixtures/responses/status_get_500.yml +31 -0
  66. data/fixtures/responses/test.yml +7364 -0
  67. data/fixtures/responses/version_get.yml +38 -0
  68. data/jirafe.gemspec +29 -0
  69. data/lib/jirafe.rb +64 -0
  70. data/lib/jirafe/callback/event.rb +57 -0
  71. data/lib/jirafe/callback/events/order.rb +48 -0
  72. data/lib/jirafe/callback/events/refund.rb +32 -0
  73. data/lib/jirafe/callback/jirafe_callback.rb +50 -0
  74. data/lib/jirafe/configuration.rb +47 -0
  75. data/lib/jirafe/error.rb +57 -0
  76. data/lib/jirafe/resource/application.rb +18 -0
  77. data/lib/jirafe/resource/jirafe_resource.rb +188 -0
  78. data/lib/jirafe/resource/site.rb +21 -0
  79. data/lib/jirafe/resource/sites/abandon_rate.rb +16 -0
  80. data/lib/jirafe/resource/sites/abandoned_average_order_value.rb +17 -0
  81. data/lib/jirafe/resource/sites/abandoned_carts.rb +16 -0
  82. data/lib/jirafe/resource/sites/abandoned_revenue.rb +16 -0
  83. data/lib/jirafe/resource/sites/average_order_value.rb +16 -0
  84. data/lib/jirafe/resource/sites/bounces_rate.rb +16 -0
  85. data/lib/jirafe/resource/sites/cart_segmentation.rb +11 -0
  86. data/lib/jirafe/resource/sites/conversion_rate.rb +16 -0
  87. data/lib/jirafe/resource/sites/conversions.rb +17 -0
  88. data/lib/jirafe/resource/sites/customers.rb +16 -0
  89. data/lib/jirafe/resource/sites/dashboard.rb +27 -0
  90. data/lib/jirafe/resource/sites/keywords.rb +11 -0
  91. data/lib/jirafe/resource/sites/orders_status.rb +15 -0
  92. data/lib/jirafe/resource/sites/origins.rb +11 -0
  93. data/lib/jirafe/resource/sites/period_data.rb +16 -0
  94. data/lib/jirafe/resource/sites/products.rb +12 -0
  95. data/lib/jirafe/resource/sites/referers.rb +12 -0
  96. data/lib/jirafe/resource/sites/revenues.rb +16 -0
  97. data/lib/jirafe/resource/sites/revenues_average.rb +16 -0
  98. data/lib/jirafe/resource/sites/segments_carts.rb +14 -0
  99. data/lib/jirafe/resource/sites/segments_sales.rb +14 -0
  100. data/lib/jirafe/resource/sites/total_carts.rb +16 -0
  101. data/lib/jirafe/resource/sites/translations.rb +18 -0
  102. data/lib/jirafe/resource/sites/visitors_interest.rb +14 -0
  103. data/lib/jirafe/resource/sites/visits.rb +16 -0
  104. data/lib/jirafe/resource/status.rb +19 -0
  105. data/lib/jirafe/resource/sync_service.rb +1 -0
  106. data/lib/jirafe/resource/time_series.rb +29 -0
  107. data/lib/jirafe/resource/user.rb +32 -0
  108. data/lib/jirafe/resource/version.rb +9 -0
  109. data/spec/jirafe/callback/event_spec.rb +85 -0
  110. data/spec/jirafe/configuration_spec.rb +150 -0
  111. data/spec/jirafe/jirafe_spec.rb +23 -0
  112. data/spec/jirafe/resource/application_spec.rb +220 -0
  113. data/spec/jirafe/resource/jirafe_resource_spec.rb +188 -0
  114. data/spec/jirafe/resource/site_spec.rb +61 -0
  115. data/spec/jirafe/resource/sites/abandon_rate_spec.rb +11 -0
  116. data/spec/jirafe/resource/sites/abandoned_average_order_value_spec.rb +11 -0
  117. data/spec/jirafe/resource/sites/abandoned_carts_spec.rb +11 -0
  118. data/spec/jirafe/resource/sites/abandoned_revenue_spec.rb +11 -0
  119. data/spec/jirafe/resource/sites/average_order_value_spec.rb +11 -0
  120. data/spec/jirafe/resource/sites/bounces_rate_spec.rb +11 -0
  121. data/spec/jirafe/resource/sites/cart_segmentation_spec.rb +11 -0
  122. data/spec/jirafe/resource/sites/conversion_rate_spec.rb +11 -0
  123. data/spec/jirafe/resource/sites/conversions_spec.rb +11 -0
  124. data/spec/jirafe/resource/sites/customers_spec.rb +11 -0
  125. data/spec/jirafe/resource/sites/dashboard_spec.rb +29 -0
  126. data/spec/jirafe/resource/sites/keywords_spec.rb +11 -0
  127. data/spec/jirafe/resource/sites/orders_status_spec.rb +34 -0
  128. data/spec/jirafe/resource/sites/origins_spec.rb +11 -0
  129. data/spec/jirafe/resource/sites/period_data_spec.rb +22 -0
  130. data/spec/jirafe/resource/sites/products_spec.rb +11 -0
  131. data/spec/jirafe/resource/sites/referers_spec.rb +11 -0
  132. data/spec/jirafe/resource/sites/revenues_average_spec.rb +11 -0
  133. data/spec/jirafe/resource/sites/revenues_spec.rb +11 -0
  134. data/spec/jirafe/resource/sites/segments_carts_spec.rb +29 -0
  135. data/spec/jirafe/resource/sites/segments_sales_spec.rb +29 -0
  136. data/spec/jirafe/resource/sites/total_carts_spec.rb +11 -0
  137. data/spec/jirafe/resource/sites/translations_spec.rb +76 -0
  138. data/spec/jirafe/resource/sites/visitors_interest_spec.rb +8 -0
  139. data/spec/jirafe/resource/sites/visits_spec.rb +11 -0
  140. data/spec/jirafe/resource/status_spec.rb +31 -0
  141. data/spec/jirafe/resource/version_spec.rb +15 -0
  142. data/spec/spec_helper.rb +58 -0
  143. data/spec/support/callback_server.rb +11 -0
  144. data/spec/support/response_helper.rb +31 -0
  145. data/spec/support/shared_examples/empty_resource.rb +17 -0
  146. data/spec/support/shared_examples/time_series.rb +31 -0
  147. data/spec/test_configuration.rb +15 -0
  148. metadata +360 -0
@@ -0,0 +1,38 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://api.jirafe.dev/v1/version?token=user_master_token
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: OK
14
+ headers:
15
+ Server:
16
+ - nginx/1.2.2
17
+ Content-Type:
18
+ - application/json
19
+ Transfer-Encoding:
20
+ - chunked
21
+ Connection:
22
+ - keep-alive
23
+ Keep-Alive:
24
+ - timeout=10
25
+ X-Powered-By:
26
+ - PHP/5.3.15
27
+ Cache-Control:
28
+ - no-cache
29
+ Date:
30
+ - Wed, 05 Sep 2012 19:49:54 GMT
31
+ X-Debug-Token:
32
+ - 5047ace2df0e1
33
+ body:
34
+ encoding: US-ASCII
35
+ string: ! '{"jirafe":"0.3.0","api":"1.1"}'
36
+ http_version:
37
+ recorded_at: Wed, 05 Sep 2012 19:49:54 GMT
38
+ recorded_with: VCR 2.2.4
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "jirafe"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "jirafe"
7
+ s.version = Jirafe::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Jirafe, Inc."]
10
+ s.email = ["support@jirafe.com"]
11
+ s.homepage = "https://github.com/jirafe/jirafe-ruby-client"
12
+ s.summary = %q{Client for Jirafe analytics web service}
13
+ s.description = %q{Client for Jirafe analytics web service}
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+
20
+ s.add_dependency("httparty", ">= 0.8.3")
21
+
22
+ s.add_development_dependency("webmock")
23
+ s.add_development_dependency("vcr")
24
+ s.add_development_dependency("yard")
25
+ s.add_development_dependency("rspec", "2.11.0")
26
+ s.add_development_dependency("autotest")
27
+ s.add_development_dependency("travis-lint")
28
+ s.add_development_dependency("net-http-server")
29
+ end
@@ -0,0 +1,64 @@
1
+ require "httparty"
2
+ require "logger"
3
+
4
+ module Jirafe
5
+ VERSION = "0.1.0"
6
+ autoload :Configuration, "jirafe/configuration.rb"
7
+ autoload :Error, "jirafe/error.rb"
8
+ module Resource
9
+ autoload :JirafeResource, "jirafe/resource/jirafe_resource.rb"
10
+ autoload :Version, "jirafe/resource/version.rb"
11
+ autoload :Status, "jirafe/resource/status.rb"
12
+ autoload :Application, "jirafe/resource/application.rb"
13
+ autoload :TimeSeries, "jirafe/resource/time_series.rb"
14
+ autoload :Site, "jirafe/resource/site.rb"
15
+ module Sites
16
+ autoload :AbandonRate, "jirafe/resource/sites/abandon_rate.rb"
17
+ autoload :AbandonedAverageOrderValue, "jirafe/resource/sites/abandoned_average_order_value.rb"
18
+ autoload :AbandonedCarts, "jirafe/resource/sites/abandoned_carts.rb"
19
+ autoload :AbandonedRevenue, "jirafe/resource/sites/abandoned_revenue.rb"
20
+ autoload :AverageOrderValue, "jirafe/resource/sites/average_order_value.rb"
21
+ autoload :BouncesRate, "jirafe/resource/sites/bounces_rate.rb"
22
+ autoload :CartSegmentation, "jirafe/resource/sites/cart_segmentation.rb"
23
+ autoload :ConversionRate, "jirafe/resource/sites/conversion_rate.rb"
24
+ autoload :Conversions, "jirafe/resource/sites/conversions.rb"
25
+ autoload :Customers, "jirafe/resource/sites/customers.rb"
26
+ autoload :Dashboard, "jirafe/resource/sites/dashboard.rb"
27
+ autoload :Keywords, "jirafe/resource/sites/keywords.rb"
28
+ autoload :OrdersStatus, "jirafe/resource/sites/orders_status.rb"
29
+ autoload :Origins, "jirafe/resource/sites/origins.rb"
30
+ autoload :PeriodData, "jirafe/resource/sites/period_data.rb"
31
+ autoload :Products, "jirafe/resource/sites/products.rb"
32
+ autoload :Referers, "jirafe/resource/sites/referers.rb"
33
+ autoload :Revenues, "jirafe/resource/sites/revenues.rb"
34
+ autoload :RevenuesAverage, "jirafe/resource/sites/revenues_average.rb"
35
+ autoload :SegmentsCarts, "jirafe/resource/sites/segments_carts.rb"
36
+ autoload :SegmentsSales, "jirafe/resource/sites/segments_sales.rb"
37
+ autoload :TotalCarts, "jirafe/resource/sites/total_carts.rb"
38
+ autoload :Translations, "jirafe/resource/sites/translations.rb"
39
+ autoload :VisitorsInterest, "jirafe/resource/sites/visitors_interest.rb"
40
+ autoload :Visits, "jirafe/resource/sites/visits.rb"
41
+ end
42
+ end
43
+ module Callback
44
+ autoload :JirafeCallback, "jirafe/callback/jirafe_callback.rb"
45
+ autoload :Event, "jirafe/callback/event.rb"
46
+ module Events
47
+ autoload :Order, "jirafe/callback/events/order.rb"
48
+ autoload :Refund, "jirafe/callback/events/refund.rb"
49
+ end
50
+ end
51
+
52
+ def self.configure
53
+ yield Configuration.instance if block_given?
54
+ logger.info "Initialized Jirafe Client to api: #{config.url} / callbacks: #{config.callback_url}"
55
+ end
56
+
57
+ def self.config
58
+ Configuration.instance
59
+ end
60
+
61
+ def self.logger
62
+ config.logger
63
+ end
64
+ end
@@ -0,0 +1,57 @@
1
+ require "json"
2
+
3
+ module Jirafe
4
+ module Callback
5
+ class Event < JirafeCallback
6
+ attr_accessor :version, :action, :data
7
+
8
+ GLOBAL_ACTION = {
9
+ :noop => "noop"
10
+ }
11
+
12
+ class << self
13
+ def events_url
14
+ "/events"
15
+ end
16
+
17
+ def send(site_id, token, events)
18
+ raise Jirafe::Error::MissingSiteId if site_id.nil?
19
+ response = post(events_url, {:body => {
20
+ "siteId" => site_id,
21
+ "token" => token,
22
+ "timestamp" => Time.now.to_i,
23
+ "events" => events.to_json
24
+ }})
25
+ check_response_for_exception(response)
26
+ true
27
+ end
28
+ end
29
+
30
+ def action_map
31
+ {}
32
+ end
33
+
34
+ def action
35
+ action_map[@action] || GLOBAL_ACTION[:noop]
36
+ end
37
+
38
+ def data
39
+ {}
40
+ end
41
+
42
+ def to_json(*args)
43
+ {
44
+ "v" => version,
45
+ "a" => action,
46
+ "d" => data
47
+ }.to_json(*args)
48
+ end
49
+
50
+ def initialize(attributes = {})
51
+ attributes.each do |attr, value|
52
+ self.send("#{attr}=", value) if self.respond_to?("#{attr}=")
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,48 @@
1
+ module Jirafe
2
+ module Callback
3
+ module Events
4
+ class Order < Jirafe::Callback::Event
5
+ attr_accessor :identifier, :status, :customer, :visitor_identifier, :created_at,
6
+ :grand_total, :sub_total, :tax_amount, :shipping_amount, :discount_amount, :items
7
+
8
+ def status_map
9
+ {
10
+ :new => "new",
11
+ :payment_pending => "pendingPayment",
12
+ :processing => "processing",
13
+ :complete => "complete",
14
+ :closed => "closed",
15
+ :canceled => "canceled",
16
+ :held => "held",
17
+ :payment_review => "paymentReview",
18
+ :unknown => "unknown"
19
+ }
20
+ end
21
+
22
+ def action_map
23
+ {
24
+ :create => "orderCreate",
25
+ :update => "orderUpdate",
26
+ :import => "orderImport"
27
+ }
28
+ end
29
+
30
+ def data
31
+ {
32
+ "orderId" => identifier,
33
+ "status" => status_map[status],
34
+ "customerHash" => customer,
35
+ "vistorId" => visitor_identifier,
36
+ "time" => created_at || Time.now.to_i,
37
+ "grandTotal" => grand_total,
38
+ "subTotal" => sub_total,
39
+ "taxAmount" => tax_amount,
40
+ "shippingAmount" => shipping_amount,
41
+ "discountAmount" => discount_amount,
42
+ "items" => items
43
+ }
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,32 @@
1
+ module Jirafe
2
+ module Callback
3
+ module Events
4
+ class Refund < Jirafe::Callback::Event
5
+ attr_accessor :identifier, :order_identifier, :created_at,
6
+ :grand_total, :sub_total, :tax_amount, :shipping_amount,
7
+ :discount_amount, :items
8
+
9
+ def action_map
10
+ {
11
+ :create => "refundCreate",
12
+ :import => "refundImport",
13
+ }
14
+ end
15
+
16
+ def data
17
+ {
18
+ "refundId" => identifier,
19
+ "orderId" => order_identifier,
20
+ "time" => created_at || Time.now.to_i,
21
+ "grandTotal" => grand_total,
22
+ "subTotal" => sub_total,
23
+ "taxAmount" => tax_amount
24
+ "shippingAmount" => shipping_amount,
25
+ "discountAmount" => discount_amount,
26
+ "items" => items
27
+ }
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,50 @@
1
+ module Jirafe
2
+ module Callback
3
+ class JirafeCallback
4
+ include HTTParty
5
+ base_uri Jirafe.config.callback_url
6
+ format :html
7
+ debug_output Jirafe.config.logger if ENV["DEBUG_JIRAFE"]
8
+
9
+ class << self
10
+ def logger
11
+ Jirafe.config.logger
12
+ end
13
+
14
+ def establish_callback_url
15
+ "/cmb"
16
+ end
17
+
18
+ def establish(site_id)
19
+ raise Jirafe::Error::MissingSiteId if site_id.nil?
20
+ response = post(establish_callback_url, {:body => {"siteId" => site_id }})
21
+ check_response_for_exception(response)
22
+ true
23
+ end
24
+
25
+ private
26
+
27
+ def check_response_for_exception(response)
28
+ return if (200..399).include?(response.code) # Allow any 2xx or 3xx
29
+ exception = case response.code.to_i
30
+ when 400 # NOTE: Being thrown for what should be 422's
31
+ Jirafe::Error::BadRequest
32
+ when 401
33
+ Jirafe::Error::Unauthorized
34
+ when 403
35
+ Jirafe::Error::Forbidden
36
+ when 404
37
+ Jirafe::Error::ResourceNotFound
38
+ when 405
39
+ Jirafe::Error::NotAllowed
40
+ when 500
41
+ Jirafe::Error::ServerError
42
+ else
43
+ Jirafe::Error::UnknownError
44
+ end
45
+ raise exception.new(response)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,47 @@
1
+ require 'singleton'
2
+
3
+ module Jirafe
4
+ class Configuration
5
+ include Singleton
6
+ DEFAULT_URL = "https://api.jirafe.com/v1"
7
+ DEFAULT_CALLBACK_URL = "https://data.jirafe.com"
8
+ TEST_URL = "https://test-api.jirafe.com/v1"
9
+ TEST_CALLBACK_URL = "https://test-data.jirafe.com"
10
+ DEFAULT_CONTENT_TYPE = "application/json"
11
+ attr_accessor :token, :url, :callback_url, :logger, :test, :content_type
12
+
13
+ def initialize
14
+ @url = DEFAULT_URL
15
+ @callback_url = DEFAULT_CALLBACK_URL
16
+ @content_type = DEFAULT_CONTENT_TYPE
17
+ @token = nil
18
+ @test = false
19
+ end
20
+
21
+ def test=(value)
22
+ if value
23
+ self.url = TEST_URL if url == DEFAULT_URL
24
+ self.callback_url = TEST_CALLBACK_URL if callback_url == DEFAULT_CALLBACK_URL
25
+ end
26
+ @test = value == true
27
+ end
28
+
29
+ def token
30
+ raise Error::MissingToken if @token.nil?
31
+ @token
32
+ end
33
+
34
+ def logger
35
+ @logger ||= (defined?(Rails) ? Rails.logger : Logger.new(STDOUT))
36
+ end
37
+ def reset!
38
+ self.url = DEFAULT_URL
39
+ self.callback_url = DEFAULT_CALLBACK_URL
40
+ self.content_type = DEFAULT_CONTENT_TYPE
41
+ self.token = nil
42
+ self.test = false
43
+ self.logger = nil
44
+ end
45
+ end
46
+ end
47
+
@@ -0,0 +1,57 @@
1
+ module Jirafe
2
+ module Error
3
+ class JirafeError < StandardError
4
+ end
5
+ class ResourceError < JirafeError
6
+ attr_reader :message
7
+ attr_reader :http_status
8
+ attr_reader :http_body
9
+ attr_reader :json_body
10
+
11
+ def initialize(response)
12
+ @message = JSON.parse(response.body)["error"]["message"] rescue response.body
13
+ @http_status = response.code
14
+ @http_body = response.body
15
+ @json_body = JSON.parse(response.body) rescue {}
16
+ end
17
+
18
+ def to_s
19
+ status_string = @http_status.nil? ? "" : "(Status #{@http_status}) "
20
+ "#{status_string}#{@message}"
21
+ end
22
+ end
23
+
24
+ class MissingToken < JirafeError
25
+ end
26
+
27
+ class MissingSiteId < JirafeError
28
+ end
29
+
30
+ class MissingResourcePath < JirafeError
31
+ end
32
+
33
+ class NotImplemented < JirafeError
34
+ end
35
+
36
+ class UnknownError < ResourceError
37
+ end
38
+
39
+ class BadRequest < ResourceError
40
+ end
41
+
42
+ class ResourceNotFound < ResourceError
43
+ end
44
+
45
+ class Forbidden < ResourceError
46
+ end
47
+
48
+ class Unauthorized < ResourceError
49
+ end
50
+
51
+ class NotAllowed < ResourceError
52
+ end
53
+
54
+ class ServerError < ResourceError
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,18 @@
1
+ module Jirafe
2
+ module Resource
3
+ class Application < JirafeResource
4
+ path "applications"
5
+ attributes({
6
+ :app_id => [:identifier],
7
+ :name => [:create, :update],
8
+ :url => [:create, :update],
9
+ :token => [],
10
+ })
11
+
12
+ def sites
13
+ Site.list(identifier)
14
+ end
15
+
16
+ end
17
+ end
18
+ end