voog_api 0.0.7 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4e20e5667103808724ed2df2060430cb06585194
4
- data.tar.gz: 87276171f2c2ad169c6241aac2a53e9d3e35a00c
3
+ metadata.gz: f7f44b299ce7547c3f02afb6ef7c359dc1bb227f
4
+ data.tar.gz: a11ac4014716a5123f0402e32dc7dbd43b468a47
5
5
  SHA512:
6
- metadata.gz: 85efc4a527b459c8787b6639dafc1552ea640ed3af02fc2e4568f28b729d0607e4e4ba3ab4e1877251853f3ff6af40354abb31b5e817d18cf37499a14d9fde6a
7
- data.tar.gz: d0cf82aad10c84fcf89cd169a01e78263242adb8588771faaef74f3be4e449b9a78d96fd6895b317016a58964e109bf7af251c9b1b02f8de5ee2a69f6ab1f325
6
+ metadata.gz: c2a7313731a067a53d33b31c39c5d0940dc53d6a150781562850ac46a2e08a937d2c2324e5fe048e46f51dfc1b4410753ecebc5167da3400463686b018d9f0fb
7
+ data.tar.gz: 31553dcd752fad8a075132e403a50e6df4552b4ca8f2ddc3547ce33688e569b81c67baaf4a9f9a6241507a8972ae00f55d8774e9c6b4b06bfca6fa205edc7624
data/README.markdown CHANGED
@@ -1,5 +1,7 @@
1
1
  # voog.rb
2
2
 
3
+ [ ![Codeship Status for Edicy/voog.rb](https://www.codeship.io/projects/785ef4c0-0388-0132-4cf0-0e105ab6f59d/status)](https://www.codeship.io/projects/30460)
4
+
3
5
  Ruby toolkit for the [Voog](http://www.voog.com) API.
4
6
 
5
7
  Learn more at the [Voog developer central](http://www.voog.com/developers/api) and by reading the [Voog API documentation](http://www.voog.com/developers/api).
@@ -33,7 +35,7 @@ To generate your personal **API token** for your site, go to `Account` -> `My pr
33
35
  All requests to the Voog API are done through the `Voog::Client` class, which takes two parameters: site host and API token.
34
36
 
35
37
  ```ruby
36
- client = Voog::Client.new('example.com', 'afcf30182aecfc8155d390d7d4552d14')
38
+ client = Voog::Client.new('example.com', 'afcf30182aecfc8155d390d7d4552d14', protocol: :http, auto_paginate: true, raise_on_error: false)
37
39
  ```
38
40
 
39
41
  Making an API request is as simple as calling a single method on the client:
@@ -53,3 +55,10 @@ puts layout.title
53
55
  puts layout[:title]
54
56
  # => "Front page"
55
57
  ```
58
+
59
+ ### Optional parameters for client
60
+
61
+ * `protocol` - endpoint protocol (`http` or `https` default is `http`).
62
+ * `auto_paginate` - enable auto pagination for list requests. Defaults to `false`.
63
+ * `per_page` - set default `per_page` value for list requests. Defaults to `nil` (API default is `50`).
64
+ * `raise_on_error` - interrupts program with error (`Faraday::Error`) when request response code is between `400` and `600` (default is `false`).
data/Rakefile CHANGED
@@ -1 +1,7 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task default: :spec
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List articles
6
6
  def articles(params = {})
7
- get 'articles', {query: params}
7
+ paginate 'articles', {query: params}
8
8
  end
9
9
 
10
10
  # Get a single article
@@ -34,14 +34,14 @@ module Voog
34
34
 
35
35
  # Update/create a key in article data field
36
36
  #
37
- # @params id [String] key in data field
37
+ # @param id [String] key in data field
38
38
  def update_article_data(article_id, id, data)
39
39
  put "articles/#{article_id}/data/#{id}", {value: data}
40
40
  end
41
41
 
42
42
  # Delete a key from article data field
43
43
  #
44
- # @params id [String] key in data field
44
+ # @param id [String] key in data field
45
45
  def delete_article_data(article_id, id)
46
46
  delete "articles/#{article_id}/data/#{id}"
47
47
  end
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List assets
6
6
  def assets(params = {})
7
- get 'assets', {query: params}
7
+ paginate 'assets', {query: params}
8
8
  end
9
9
 
10
10
  # Get a single asset
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List article comments
6
6
  def comments(article_id, params = {})
7
- get "articles/#{article_id}/comments", {query: params}
7
+ paginate "articles/#{article_id}/comments", {query: params}
8
8
  end
9
9
 
10
10
  # Get a single comment for article
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List content partials contents
6
6
  def content_partials(params = {})
7
- get 'content_partials', {query: params}
7
+ paginate 'content_partials', {query: params}
8
8
  end
9
9
 
10
10
  # Get a single content partial content
@@ -11,7 +11,7 @@ module Voog
11
11
 
12
12
  # List contents
13
13
  def contents(parent_name, parent_id, params = {})
14
- get "#{parent_name}/#{parent_id}/contents", {query: params}
14
+ paginate "#{parent_name}/#{parent_id}/contents", {query: params}
15
15
  end
16
16
 
17
17
  # Get a single content
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List element_definitions
6
6
  def element_definitions(params = {})
7
- get 'element_definitions', {query: params}
7
+ paginate 'element_definitions', {query: params}
8
8
  end
9
9
 
10
10
  # Get a single element_definition
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List elements
6
6
  def elements(params = {})
7
- get 'elements', {query: params}
7
+ paginate 'elements', {query: params}
8
8
  end
9
9
 
10
10
  # Get a single element
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List forms
6
6
  def forms(params = {})
7
- get 'forms', {query: params}
7
+ paginate 'forms', {query: params}
8
8
  end
9
9
 
10
10
  # Get a single form
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List languages
6
6
  def languages(params = {})
7
- get 'languages', {query: params}
7
+ paginate 'languages', {query: params}
8
8
  end
9
9
 
10
10
  # Get a single language
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List layouts assets
6
6
  def layout_assets(params = {})
7
- get 'layout_assets', {query: params}
7
+ paginate 'layout_assets', {query: params}
8
8
  end
9
9
 
10
10
  # Get a single layout asset
@@ -15,6 +15,7 @@ module Voog
15
15
  # Create a layout asset
16
16
  def create_layout_asset(data)
17
17
  if data && data.key?(:file)
18
+ data = data.dup
18
19
  data[:file] = Faraday::UploadIO.new(data[:file], data[:content_type])
19
20
  options = {multipart: true}
20
21
  end
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List layouts
6
6
  def layouts(params = {})
7
- get 'layouts', {query: params}
7
+ paginate 'layouts', {query: params}
8
8
  end
9
9
 
10
10
  # Get a single layout
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List media_sets
6
6
  def media_sets(params = {})
7
- get 'media_sets', {query: params}
7
+ paginate 'media_sets', {query: params}
8
8
  end
9
9
 
10
10
  # Get a single media_set
@@ -29,7 +29,7 @@ module Voog
29
29
 
30
30
  # Add assets to media_set
31
31
  def media_set_add_assets(media_set_id, data)
32
- put "media_sets/#{media_set_id}/add_assets", data
32
+ post "media_sets/#{media_set_id}/add_assets", data
33
33
  end
34
34
  end
35
35
  end
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List nodes
6
6
  def nodes(params = {})
7
- get 'nodes', {query: params}
7
+ paginate 'nodes', {query: params}
8
8
  end
9
9
 
10
10
  # Get a single node
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List pages
6
6
  def pages(params = {})
7
- get 'pages', {query: params}
7
+ paginate 'pages', {query: params}
8
8
  end
9
9
 
10
10
  # Get a single page
@@ -34,14 +34,14 @@ module Voog
34
34
 
35
35
  # Update/create a key in page data field
36
36
  #
37
- # @params id [String] key in data field
37
+ # @param id [String] key in data field
38
38
  def update_page_data(page_id, id, data)
39
39
  put "pages/#{page_id}/data/#{id}", {value: data}
40
40
  end
41
41
 
42
42
  # Delete a key from page data field
43
43
  #
44
- # @params id [String] key in data field
44
+ # @param id [String] key in data field
45
45
  def delete_page_data(page_id, id)
46
46
  delete "pages/#{page_id}/data/#{id}"
47
47
  end
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List people
6
6
  def people(params = {})
7
- get 'people', {query: params}
7
+ paginate 'people', {query: params}
8
8
  end
9
9
 
10
10
  # Get a single person
@@ -19,14 +19,14 @@ module Voog
19
19
 
20
20
  # Update/create a key in site data field
21
21
  #
22
- # @params id [String] key in data field
22
+ # @param id [String] key in data field
23
23
  def update_site_data(id, data)
24
24
  put "site/data/#{id}", {value: data}
25
25
  end
26
26
 
27
27
  # Delete a key from site data field
28
28
  #
29
- # @params id [String] key in data field
29
+ # @param id [String] key in data field
30
30
  def delete_site_data(id)
31
31
  delete "site/data/#{id}"
32
32
  end
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List tags
6
6
  def tags(params = {})
7
- get 'tags', {query: params}
7
+ paginate 'tags', {query: params}
8
8
  end
9
9
 
10
10
  # Get a single tag
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List text contents
6
6
  def texts(params = {})
7
- get 'texts', {query: params}
7
+ paginate 'texts', {query: params}
8
8
  end
9
9
 
10
10
  # Get a single text content
@@ -4,7 +4,7 @@ module Voog
4
4
 
5
5
  # List form tickets
6
6
  def tickets(form_id, params = {})
7
- get "forms/#{form_id}/tickets", {query: params}
7
+ paginate "forms/#{form_id}/tickets", {query: params}
8
8
  end
9
9
 
10
10
  # Get a single ticket for form
@@ -1,6 +1,8 @@
1
1
  require 'json'
2
2
  require 'sawyer'
3
3
 
4
+ require 'voog_api/error'
5
+
4
6
  require 'voog_api/api/articles'
5
7
  require 'voog_api/api/assets'
6
8
  require 'voog_api/api/comments'
@@ -24,7 +26,9 @@ require 'voog_api/api/tickets'
24
26
  module Voog
25
27
 
26
28
  class Client
27
-
29
+
30
+ MAX_PER_PAGE = 250
31
+
28
32
  include Voog::API::Articles
29
33
  include Voog::API::Assets
30
34
  include Voog::API::Comments
@@ -45,12 +49,25 @@ module Voog
45
49
  include Voog::API::Texts
46
50
  include Voog::API::Tickets
47
51
 
48
- attr_reader :api_token, :host
52
+ attr_reader :api_token, :host, :auto_paginate, :per_page
49
53
 
54
+ # Initialize Voog API client.
55
+ #
56
+ # @param host [String] a Voog site host.
57
+ # @param api_token [String] a Voog site API token.
58
+ # @option options [String] :protocol endpoint protocol ("http" or "https"). Defaults to "http".
59
+ # @option options [String] :auto_paginate enable auto pagination for list requests. Defaults to "false".
60
+ # @option options [String] :per_page set default "per_page" value for list requests. Defaults to "nil".
61
+ # @option options [Boolean] :raise_on_error interrupts program with error ("Faraday::Error") when request response code is between "400" and "600" (default is "false").
62
+ # @example Initialize client
63
+ # client = Voog::Client.new('example.com', 'afcf30182aecfc8155d390d7d4552d14', protocol: :http, raise_on_error: false)
50
64
  def initialize(host = Voog.host, api_token = Voog.api_token, options = {})
51
65
  @host = host
52
66
  @api_token = api_token
53
67
  @options = options
68
+ @protocol = options[:protocol].to_s.downcase == 'https' ? 'https' : 'http'
69
+ @auto_paginate = options.fetch(:auto_paginate, Voog.auto_paginate)
70
+ @per_page = options.fetch(:per_page, Voog.per_page)
54
71
  @raise_on_error = options.fetch(:raise_on_error, true)
55
72
  end
56
73
 
@@ -79,7 +96,7 @@ module Voog
79
96
  end
80
97
 
81
98
  def api_endpoint
82
- "http://#{host}/admin/api"
99
+ "#{@protocol}://#{host}/admin/api"
83
100
  end
84
101
 
85
102
  def agent
@@ -92,13 +109,13 @@ module Voog
92
109
  end
93
110
 
94
111
  def multipart_agent
95
- Faraday.new do |faraday|
112
+ @multipart_agent ||= Faraday.new do |faraday|
96
113
  faraday.request :multipart
97
114
  faraday.response :raise_error if @raise_on_error
98
115
  faraday.adapter :net_http
99
116
 
100
- faraday.headers['X_API_TOKEN'] = @api_token
101
- faraday.headers['User-Agent'] = 'Voog.rb Ruby wrapper'
117
+ faraday.headers[:x_api_token] = @api_token
118
+ faraday.headers[:user_agent] = 'Voog.rb Ruby wrapper'
102
119
  end
103
120
  end
104
121
 
@@ -109,7 +126,32 @@ module Voog
109
126
  def parse_response(response)
110
127
  JSON.parse(response).inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
111
128
  end
112
-
129
+
130
+ # Fetch all elements for requested API resource when {#auto_paginate} is turned on.
131
+ def paginate(url, options = {}, &block)
132
+ opts = options.dup
133
+ if @auto_paginate || @per_page
134
+ opts[:query][:per_page] ||= @per_page || (@auto_paginate ? MAX_PER_PAGE : nil)
135
+ end
136
+
137
+ data = request(:get, url, nil, opts)
138
+
139
+ if @auto_paginate
140
+ i = 0
141
+ while @last_response.rels[:next]
142
+ puts "Request: #{i += 1}"
143
+ @last_response = @last_response.rels[:next].get(headers: opts[:headers])
144
+ if block_given?
145
+ yield(data, @last_response)
146
+ else
147
+ data.concat(@last_response.data) if @last_response.data.is_a?(Array)
148
+ end
149
+ end
150
+ end
151
+
152
+ data
153
+ end
154
+
113
155
  private
114
156
 
115
157
  def request(method, path, data, options = {})
@@ -117,7 +159,10 @@ module Voog
117
159
 
118
160
  @last_response = response = multipart ? \
119
161
  multipart_agent.post("#{api_endpoint}/#{path}", data) : \
120
- agent.call(method, URI.encode(path.to_s), data, options)
162
+ agent.call(method, URI.encode(path.to_s), data, options.dup)
163
+
164
+ raise Voog::MovedPermanently.new(response.headers['location']) if response.status == 301
165
+
121
166
  if multipart
122
167
  parse_response(response.body)
123
168
  else
@@ -0,0 +1,6 @@
1
+ module Voog
2
+
3
+ # Raised when Voog API returns a 301 HTTP status code
4
+ class MovedPermanently < StandardError; end
5
+
6
+ end
@@ -1,3 +1,3 @@
1
1
  module Voog
2
- VERSION = '0.0.7'
2
+ VERSION = '0.0.10'
3
3
  end
data/lib/voog_api.rb CHANGED
@@ -5,7 +5,7 @@ module Voog
5
5
 
6
6
  class << self
7
7
 
8
- attr_accessor :host, :api_token
8
+ attr_accessor :host, :api_token, :auto_paginate, :per_page
9
9
 
10
10
  def client(options = {})
11
11
  unless host.nil? && api_token.nil?
@@ -54,7 +54,7 @@ describe Voog::API::MediaSets do
54
54
  describe '#media_set_add_assets' do
55
55
 
56
56
  before do
57
- request_fixture(:put, 'media_sets/2/add_assets', request: {body: {asset_ids: [5, 8]}}, response: {body: '{"id": 2, "assets": [{"id": 1}, {"id": 5}, {"id": 8}]}'})
57
+ request_fixture(:post, 'media_sets/2/add_assets', request: {body: {asset_ids: [5, 8]}}, response: {body: '{"id": 2, "assets": [{"id": 1}, {"id": 5}, {"id": 8}]}'})
58
58
  end
59
59
 
60
60
  it 'responds with correct assets set' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: voog_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Priit Haamer
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-07-01 00:00:00.000000000 Z
13
+ date: 2016-02-09 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -133,6 +133,7 @@ files:
133
133
  - lib/voog_api/api/texts.rb
134
134
  - lib/voog_api/api/tickets.rb
135
135
  - lib/voog_api/client.rb
136
+ - lib/voog_api/error.rb
136
137
  - lib/voog_api/version.rb
137
138
  - spec/fixtures/articles/article.json
138
139
  - spec/fixtures/articles/articles.json
@@ -276,3 +277,4 @@ test_files:
276
277
  - spec/voog_api/api/texts_spec.rb
277
278
  - spec/voog_api/api/tickets_spec.rb
278
279
  - spec/voog_spec.rb
280
+ has_rdoc: