locomotivecms_coal 1.0.0.pre.alpha.1 → 1.0.0.pre.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/.gitignore +1 -0
  4. data/Gemfile +2 -0
  5. data/Gemfile.lock +23 -12
  6. data/README.md +167 -10
  7. data/lib/locomotive/coal/client.rb +70 -20
  8. data/lib/locomotive/coal/client_v2.rb +31 -0
  9. data/lib/locomotive/coal/error.rb +46 -5
  10. data/lib/locomotive/coal/resources/base.rb +57 -0
  11. data/lib/locomotive/coal/resources/concerns/request.rb +101 -0
  12. data/lib/locomotive/coal/resources/content_assets.rb +9 -0
  13. data/lib/locomotive/coal/resources/content_entries.rb +17 -11
  14. data/lib/locomotive/coal/resources/{contents.rb → content_types.rb} +4 -5
  15. data/lib/locomotive/coal/resources/engine_version.rb +15 -0
  16. data/lib/locomotive/coal/resources/my_account.rb +14 -2
  17. data/lib/locomotive/coal/resources/pages.rb +25 -0
  18. data/lib/locomotive/coal/resources/sites.rb +5 -17
  19. data/lib/locomotive/coal/resources/snippets.rb +9 -0
  20. data/lib/locomotive/coal/resources/theme_assets.rb +13 -0
  21. data/lib/locomotive/coal/resources/token.rb +2 -2
  22. data/lib/locomotive/coal/resources/translations.rb +9 -0
  23. data/lib/locomotive/coal/upload_io.rb +11 -0
  24. data/lib/locomotive/coal/version.rb +1 -1
  25. data/lib/locomotive/coal.rb +11 -3
  26. data/locomotivecms_coal.gemspec +4 -4
  27. data/spec/fixtures/assets/locomotive.png +0 -0
  28. data/spec/fixtures/assets/rails.png +0 -0
  29. data/spec/fixtures/coal_cassettes/client.yml +333 -69
  30. data/spec/fixtures/coal_cassettes/content_assets.yml +595 -0
  31. data/spec/fixtures/coal_cassettes/content_entries.yml +1134 -223
  32. data/spec/fixtures/coal_cassettes/content_types.yml +616 -0
  33. data/spec/fixtures/coal_cassettes/my_account.yml +167 -47
  34. data/spec/fixtures/coal_cassettes/pages.yml +281 -0
  35. data/spec/fixtures/coal_cassettes/sites.yml +93 -117
  36. data/spec/fixtures/coal_cassettes/snippets.yml +227 -0
  37. data/spec/fixtures/coal_cassettes/theme_assets.yml +406 -0
  38. data/spec/fixtures/coal_cassettes/token.yml +37 -55
  39. data/spec/fixtures/coal_cassettes/translations.yml +227 -0
  40. data/spec/fixtures/coal_cassettes/version.yml +89 -0
  41. data/spec/integration/client_spec.rb +37 -3
  42. data/spec/integration/resources/content_assets_spec.rb +42 -0
  43. data/spec/integration/resources/content_entries_spec.rb +45 -18
  44. data/spec/integration/resources/content_types_spec.rb +44 -0
  45. data/spec/integration/resources/engine_version_spec.rb +17 -0
  46. data/spec/integration/resources/my_account_spec.rb +22 -5
  47. data/spec/integration/resources/pages_spec.rb +43 -0
  48. data/spec/integration/resources/sites_spec.rb +9 -9
  49. data/spec/integration/resources/snippets_spec.rb +38 -0
  50. data/spec/integration/resources/theme_assets_spec.rb +43 -0
  51. data/spec/integration/resources/token_spec.rb +7 -7
  52. data/spec/integration/resources/translations_spec.rb +38 -0
  53. data/spec/spec_helper.rb +2 -13
  54. data/spec/support/api_settings.rb +7 -3
  55. data/spec/support/assets.rb +4 -0
  56. data/spec/support/vcr.rb +10 -0
  57. data/spec/unit/error_spec.rb +28 -0
  58. metadata +71 -13
  59. data/lib/locomotive/coal/request.rb +0 -63
  60. data/spec/fixtures/coal_cassettes/contents.yml +0 -120
  61. data/spec/integration/resources/contents_spec.rb +0 -22
@@ -0,0 +1,101 @@
1
+ module Locomotive::Coal::Resources
2
+ module Concerns
3
+
4
+ module Request
5
+
6
+ def get(endpoint, parameters = {}, raw = false)
7
+ do_request :get, endpoint, parameters, raw
8
+ end
9
+
10
+ def post(endpoint, parameters = {}, raw = false)
11
+ do_request :post, endpoint, parameters, raw
12
+ end
13
+
14
+ def put(endpoint, parameters = {}, raw = false)
15
+ do_request :put, endpoint, parameters, raw
16
+ end
17
+
18
+ def delete(endpoint, parameters = {}, raw = false)
19
+ do_request :delete, endpoint, parameters, raw
20
+ end
21
+
22
+ def do_request(action, endpoint, parameters = {}, raw = false)
23
+ response = begin
24
+ _do_request(action, "#{uri.path}/#{endpoint}.json", parameters)
25
+ rescue ::Timeout::Error, ::Errno::ETIMEDOUT, Faraday::Error::TimeoutError => e
26
+ raise Locomotive::Coal::TimeoutError.new(e)
27
+ rescue Locomotive::Coal::Error
28
+ raise
29
+ rescue Exception => e
30
+ raise Locomotive::Coal::BadRequestError.new(e)
31
+ end
32
+
33
+ if response.success?
34
+ raw ? response : response.body
35
+ else
36
+ raise Locomotive::Coal::Error.from_response(response)
37
+ end
38
+ end
39
+
40
+ def without_authentication(&block)
41
+ @without_token = true
42
+ yield.tap do
43
+ @without_token = false
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def _do_request(action, endpoint, parameters)
50
+ # compatibility with v2.5.x
51
+ parameters = parameters.merge(auth_token: credentials[:token]) if _token
52
+
53
+ _connection.send(action, endpoint) do |request|
54
+ request.headers = _request_headers(parameters)
55
+
56
+ if %i(create update).include?(action)
57
+ request.params = parameters
58
+ else
59
+ request.body = parameters
60
+ end
61
+ end
62
+ end
63
+
64
+ def _request_headers(parameters)
65
+ { 'Accept' => 'application/json' }.tap do |headers|
66
+ if _token
67
+ headers['X-Locomotive-Account-Email'] = credentials[:email]
68
+ headers['X-Locomotive-Account-Token'] = credentials[:token]
69
+ headers['X-Locomotive-Site-Handle'] = credentials[:handle] if credentials[:handle].present?
70
+ end
71
+
72
+ headers['X-Locomotive-Locale'] = parameters.delete(:_locale).to_s if parameters.try(:has_key?, :_locale)
73
+ end
74
+ end
75
+
76
+ def _connection
77
+ @_connection ||= Faraday.new(url: "#{uri.scheme}://#{uri.host}:#{uri.port}") do |faraday|
78
+ faraday.request :multipart
79
+ faraday.request :url_encoded # form-encode POST params
80
+ faraday.basic_auth uri.userinfo.values if uri.userinfo
81
+
82
+ faraday.use FaradayMiddleware::ParseJson, content_type: /\bjson$/
83
+
84
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
85
+ end
86
+ end
87
+
88
+ def _token
89
+ return if !!@without_token
90
+
91
+ if credentials[:token].respond_to?(:call)
92
+ credentials[:token] = credentials[:token].call
93
+ end
94
+
95
+ credentials[:token]
96
+ end
97
+
98
+ end
99
+
100
+ end
101
+ end
@@ -0,0 +1,9 @@
1
+ module Locomotive::Coal
2
+ module Resources
3
+
4
+ class ContentAssets < Base
5
+
6
+ end
7
+
8
+ end
9
+ end
@@ -2,13 +2,20 @@ module Locomotive::Coal
2
2
 
3
3
  module Resources
4
4
 
5
- class ContentEntries < Struct.new(:uri, :token, :content_type)
5
+ class ContentEntries < Base
6
6
 
7
- include Locomotive::Coal::Request
7
+ attr_accessor :content_type
8
8
 
9
- def all(query = {}, options = {})
10
- parameters = { where: query.to_json }.merge(options)
11
- response = get(endpoint, parameters, true)
9
+ def initialize(uri, credentials, content_type)
10
+ @content_type = content_type
11
+ super(uri, credentials)
12
+ end
13
+
14
+ def index(query = nil, options = nil, locale = nil)
15
+ parameters = { where: (query || {}).to_json }.merge(options || {})
16
+ parameters[:_locale] = locale if locale
17
+
18
+ response = get(resources_name, parameters, true)
12
19
 
13
20
  list = response.body.map { |attributes| Resource.new(attributes) }
14
21
 
@@ -18,15 +25,14 @@ module Locomotive::Coal
18
25
  response.headers[:x_total_entries].to_i)
19
26
  end
20
27
 
21
- def update(id, attributes)
22
- data = put(endpoint + "/#{id}", { content_entry: attributes })
23
- Resource.new(data)
24
- end
28
+ alias :all :index
29
+
30
+ alias :update :update_with_locale
25
31
 
26
32
  private
27
33
 
28
- def endpoint(name = 'entries')
29
- "content_types/#{content_type.slug}/#{name}"
34
+ def resources_name
35
+ "content_types/#{content_type.slug}/entries"
30
36
  end
31
37
 
32
38
  end
@@ -1,19 +1,18 @@
1
1
  module Locomotive::Coal
2
2
  module Resources
3
3
 
4
- class Contents < Struct.new(:uri, :token)
5
-
6
- include Locomotive::Coal::Request
4
+ class ContentTypes < Base
7
5
 
8
6
  def by_slug(slug)
9
7
  get('content_types').each do |attributes|
10
- return Resource.new(attributes) if attributes['slug'] == slug.to_s
8
+ return Resource.new(attributes) if attributes['slug'].to_s == slug.to_s
11
9
  end
10
+ nil
12
11
  end
13
12
 
14
13
  def method_missing(meth, *args)
15
14
  if content_type = by_slug(meth)
16
- Locomotive::Coal::Resources::ContentEntries.new(uri, token, content_type)
15
+ Locomotive::Coal::Resources::ContentEntries.new(uri, credentials, content_type)
17
16
  else
18
17
  super
19
18
  end
@@ -0,0 +1,15 @@
1
+ module Locomotive::Coal
2
+ module Resources
3
+
4
+ class EngineVersion < Base
5
+
6
+ include Concerns::Request
7
+
8
+ def version
9
+ get('version', credentials)['engine']
10
+ end
11
+
12
+ end
13
+
14
+ end
15
+ end
@@ -1,14 +1,26 @@
1
1
  module Locomotive::Coal
2
2
  module Resources
3
3
 
4
- class MyAccount < Struct.new(:uri, :token)
4
+ class MyAccount < Struct.new(:uri, :credentials)
5
5
 
6
- include Locomotive::Coal::Request
6
+ include Concerns::Request
7
7
 
8
8
  def get
9
9
  Resource.new(super('my_account'))
10
10
  end
11
11
 
12
+ def create(attributes = {})
13
+ without_authentication do
14
+ data = post('my_account', account: attributes)
15
+ Resource.new(data)
16
+ end
17
+ end
18
+
19
+ def update(attributes = {})
20
+ data = put('my_account', account: attributes)
21
+ Resource.new(data)
22
+ end
23
+
12
24
  end
13
25
 
14
26
  end
@@ -0,0 +1,25 @@
1
+ module Locomotive::Coal
2
+ module Resources
3
+
4
+ class Pages < Base
5
+
6
+ def index(locale)
7
+ get(resources_name, _locale: locale).map do |attributes|
8
+ Resource.new(attributes)
9
+ end
10
+ end
11
+
12
+ alias :all :index
13
+
14
+ def fullpaths(locale)
15
+ get("#{resources_name}/fullpaths", _locale: locale).map do |attributes|
16
+ Resource.new(attributes)
17
+ end
18
+ end
19
+
20
+ alias :update :update_with_locale
21
+
22
+ end
23
+
24
+ end
25
+ end
@@ -1,28 +1,16 @@
1
1
  module Locomotive::Coal
2
2
  module Resources
3
3
 
4
- class Sites < Struct.new(:uri, :token)
5
-
6
- include Locomotive::Coal::Request
7
-
8
- def all
9
- get('sites').map do |attributes|
10
- Resource.new(attributes)
11
- end
12
- end
13
-
14
- def create(attributes = {})
15
- data = post('sites', { site: attributes })
16
- Resource.new(data)
17
- end
4
+ class Sites < Base
18
5
 
6
+ # Only v2.x
19
7
  def by_subdomain(subdomain)
20
8
  all.find { |site| site.subdomain == subdomain.to_s }
21
9
  end
22
10
 
23
- def destroy(id)
24
- data = delete('sites', id)
25
- Resource.new(data)
11
+ # Only >= v3
12
+ def by_handle(handle)
13
+ all.find { |site| site.handle == handle.to_s }
26
14
  end
27
15
 
28
16
  end
@@ -0,0 +1,9 @@
1
+ module Locomotive::Coal
2
+ module Resources
3
+
4
+ class Snippets < Base
5
+
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module Locomotive::Coal
2
+ module Resources
3
+
4
+ class ThemeAssets < Base
5
+
6
+ def checksums
7
+ get('theme_assets/checksums')
8
+ end
9
+
10
+ end
11
+
12
+ end
13
+ end
@@ -3,10 +3,10 @@ module Locomotive::Coal
3
3
 
4
4
  class Token < Struct.new(:uri, :credentials)
5
5
 
6
- include Locomotive::Coal::Request
6
+ include Concerns::Request
7
7
 
8
8
  def get
9
- post('tokens', self.credentials)['token']
9
+ post('tokens', credentials)['token']
10
10
  end
11
11
 
12
12
  end
@@ -0,0 +1,9 @@
1
+ module Locomotive::Coal
2
+ module Resources
3
+
4
+ class Translations < Base
5
+
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ module Locomotive::Coal
2
+
3
+ class UploadIO < ::Faraday::UploadIO
4
+
5
+ def initialize(filename_or_io, content_type = nil, filename = nil)
6
+ super(filename_or_io, content_type || 'application/octet-stream', filename)
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -3,6 +3,6 @@
3
3
  # 1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0
4
4
  module Locomotive
5
5
  module Coal
6
- VERSION = '1.0.0-alpha.1'
6
+ VERSION = '1.0.0-alpha.2'
7
7
  end
8
8
  end
@@ -2,7 +2,8 @@ require 'active_support'
2
2
  require 'active_support/concern'
3
3
  require 'active_support/deprecation'
4
4
  require 'active_support/core_ext'
5
- require 'unirest'
5
+ require 'faraday'
6
+ require 'faraday_middleware'
6
7
 
7
8
  module Locomotive
8
9
  module Coal
@@ -10,12 +11,19 @@ module Locomotive
10
11
  end
11
12
 
12
13
  require_relative 'coal/error'
13
- require_relative 'coal/request'
14
+ require_relative 'coal/upload_io'
14
15
  require_relative 'coal/paginated_resources'
15
16
  require_relative 'coal/resource'
17
+ require_relative 'coal/resources/base'
16
18
  require_relative 'coal/resources/token'
17
19
  require_relative 'coal/resources/my_account'
18
20
  require_relative 'coal/resources/sites'
19
- require_relative 'coal/resources/contents'
21
+ require_relative 'coal/resources/pages'
22
+ require_relative 'coal/resources/snippets'
23
+ require_relative 'coal/resources/content_assets'
24
+ require_relative 'coal/resources/theme_assets'
25
+ require_relative 'coal/resources/translations'
26
+ require_relative 'coal/resources/content_types'
20
27
  require_relative 'coal/resources/content_entries'
28
+ require_relative 'coal/resources/engine_version'
21
29
  require_relative 'coal/client'
@@ -5,9 +5,8 @@ Gem::Specification.new do |spec|
5
5
  spec.version = Locomotive::Coal::VERSION
6
6
  spec.authors = ['Didier Lafforgue']
7
7
  spec.email = ['did@locomotivecms.com']
8
- spec.description = %q{The LocomotiveCMS coal is the API ruby client for LocomotiveCMS}
9
- spec.summary = %q{The LocomotiveCMS coal is the API ruby client for LocomotiveCMS}
10
- spec.homepage = 'http://www.locomotivecms.com'
8
+ spec.description = %q{The LocomotiveCMS Coal is the API ruby client for the LocomotiveCMS platform}
9
+ spec.summary = %q{The LocomotiveCMS Coal is the API ruby client for the LocomotiveCMS platform}
11
10
  spec.homepage = 'https://github.com/locomotivecms/coal'
12
11
  spec.license = 'MIT'
13
12
 
@@ -19,7 +18,8 @@ Gem::Specification.new do |spec|
19
18
  spec.add_development_dependency 'bundler', '~> 1.9.1'
20
19
  spec.add_development_dependency 'rake', '~> 10.4.2'
21
20
 
22
- spec.add_dependency 'unirest', '~> 1.1.2'
21
+ spec.add_dependency 'faraday', '~> 0.9.1'
22
+ spec.add_dependency 'faraday_middleware', '~> 0.9.1'
23
23
  spec.add_dependency 'activesupport', '~> 4.2.1'
24
24
 
25
25
  spec.required_ruby_version = '>= 2.0'
Binary file
Binary file