voog_api 0.0.7 → 0.0.10

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