help-scout-docs 0.1

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 (51) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/Gemfile +3 -0
  4. data/Gemfile.lock +56 -0
  5. data/README.rdoc +62 -0
  6. data/help_scout_docs.gemspec +33 -0
  7. data/lib/help_scout_docs.rb +14 -0
  8. data/lib/help_scout_docs/client.rb +95 -0
  9. data/lib/help_scout_docs/configurable.rb +78 -0
  10. data/lib/help_scout_docs/default.rb +55 -0
  11. data/lib/help_scout_docs/error.rb +5 -0
  12. data/lib/help_scout_docs/error/authentication_error.rb +6 -0
  13. data/lib/help_scout_docs/error/configuration_error.rb +6 -0
  14. data/lib/help_scout_docs/error/errors.rb +6 -0
  15. data/lib/help_scout_docs/error/options_error.rb +6 -0
  16. data/lib/help_scout_docs/error/parser_error.rb +6 -0
  17. data/lib/help_scout_docs/error/resource_not_found_error.rb +6 -0
  18. data/lib/help_scout_docs/method.rb +54 -0
  19. data/lib/help_scout_docs/methods/article.rb +45 -0
  20. data/lib/help_scout_docs/methods/category.rb +16 -0
  21. data/lib/help_scout_docs/methods/collection.rb +15 -0
  22. data/lib/help_scout_docs/methods/methods.rb +6 -0
  23. data/lib/help_scout_docs/methods/site.rb +15 -0
  24. data/lib/help_scout_docs/response/parse_json.rb +33 -0
  25. data/lib/help_scout_docs/result.rb +31 -0
  26. data/lib/help_scout_docs/version.rb +3 -0
  27. data/spec/cassettes/HelpScoutDocs_Article/_get/should_return_the_article.yml +46 -0
  28. data/spec/cassettes/HelpScoutDocs_Article/_get/when_using_an_id/should_return_the_article.yml +46 -0
  29. data/spec/cassettes/HelpScoutDocs_Article/_list_by_category/should_return_the_list_of_articles_by_category.yml +46 -0
  30. data/spec/cassettes/HelpScoutDocs_Article/_list_by_collection/should_return_the_list_of_articles_by_collection.yml +47 -0
  31. data/spec/cassettes/HelpScoutDocs_Article/_related/should_return_related_articles.yml +46 -0
  32. data/spec/cassettes/HelpScoutDocs_Article/_revisions/should_return_article_revisions.yml +46 -0
  33. data/spec/cassettes/HelpScoutDocs_Category/_get/should_return_the_category.yml +46 -0
  34. data/spec/cassettes/HelpScoutDocs_Category/_list/should_return_the_list_of_categories.yml +46 -0
  35. data/spec/cassettes/HelpScoutDocs_Client/_get/for_a_missing_request/should_raise_an_exception.yml +46 -0
  36. data/spec/cassettes/HelpScoutDocs_Client/_get/should_return_back_a_result.yml +65 -0
  37. data/spec/cassettes/HelpScoutDocs_Client/_get/with_invalid_authentication_params/should_raise_an_exception.yml +38 -0
  38. data/spec/cassettes/HelpScoutDocs_Client/_get/with_valid_params/should_call_the_requested_method.yml +65 -0
  39. data/spec/cassettes/HelpScoutDocs_Collection/_get/should_return_the_collection.yml +46 -0
  40. data/spec/cassettes/HelpScoutDocs_Collection/_list/should_return_the_list_of_collections.yml +48 -0
  41. data/spec/cassettes/HelpScoutDocs_Site/_get/should_return_the_site.yml +46 -0
  42. data/spec/cassettes/HelpScoutDocs_Site/_list/should_return_the_list_of_sites.yml +65 -0
  43. data/spec/client_spec.rb +78 -0
  44. data/spec/method_spec.rb +26 -0
  45. data/spec/methods/article_spec.rb +71 -0
  46. data/spec/methods/category_spec.rb +24 -0
  47. data/spec/methods/collection_spec.rb +23 -0
  48. data/spec/methods/site_spec.rb +23 -0
  49. data/spec/result_spec.rb +21 -0
  50. data/spec/spec_helper.rb +18 -0
  51. metadata +245 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3951d0d359947e296adf2c26f393bfc614b836f8
4
+ data.tar.gz: f2fe077c8dbc7c6f7cca29ed1cf265de88687723
5
+ SHA512:
6
+ metadata.gz: 7c5582f84ff736fc114dfef007290c6d42baaa4d422759cb8eecaccb82ccbc1f8514925fae19bc482943e51d8b5983505001ae86fd7ae07a5fc10da9dc1721a1
7
+ data.tar.gz: d093a2b0ddeb3ec679f3791e988c7e5e40144dc182ffe6842539492480b9339b33e1105d92270e7ad1f870077976c753bf99c360a04afa1eb5489331185f04f2
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --drb
2
+ --colour
3
+ -f d
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,56 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ help-scout-docs (0.1)
5
+ faraday_middleware (~> 0.9)
6
+ json (~> 1.8)
7
+ log4r (~> 1.1)
8
+ net-http-persistent (~> 2.9)
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ addressable (2.3.6)
14
+ crack (0.4.2)
15
+ safe_yaml (~> 1.0.0)
16
+ diff-lcs (1.2.5)
17
+ faraday (0.9.0)
18
+ multipart-post (>= 1.2, < 3)
19
+ faraday_middleware (0.9.1)
20
+ faraday (>= 0.7.4, < 0.10)
21
+ json (1.8.1)
22
+ json_spec (1.1.2)
23
+ multi_json (~> 1.0)
24
+ rspec (>= 2.0, < 4.0)
25
+ log4r (1.1.10)
26
+ multi_json (1.10.1)
27
+ multipart-post (2.0.0)
28
+ net-http-persistent (2.9.4)
29
+ rspec (3.0.0)
30
+ rspec-core (~> 3.0.0)
31
+ rspec-expectations (~> 3.0.0)
32
+ rspec-mocks (~> 3.0.0)
33
+ rspec-core (3.0.4)
34
+ rspec-support (~> 3.0.0)
35
+ rspec-expectations (3.0.4)
36
+ diff-lcs (>= 1.2.0, < 2.0)
37
+ rspec-support (~> 3.0.0)
38
+ rspec-mocks (3.0.4)
39
+ rspec-support (~> 3.0.0)
40
+ rspec-support (3.0.4)
41
+ safe_yaml (1.0.3)
42
+ vcr (2.9.2)
43
+ webmock (1.18.0)
44
+ addressable (>= 2.3.6)
45
+ crack (>= 0.3.2)
46
+
47
+ PLATFORMS
48
+ ruby
49
+
50
+ DEPENDENCIES
51
+ help-scout-docs!
52
+ json_spec (~> 1.1)
53
+ multi_json (~> 1.8)
54
+ rspec (~> 3.0)
55
+ vcr (~> 2.9)
56
+ webmock (~> 1.15)
@@ -0,0 +1,62 @@
1
+ = Help Scout Docs
2
+
3
+ This limited (read-only) Help Scout Docs API integration provides functionality for extracting existing documentation content
4
+
5
+ See: http://developer.helpscout.net/docs-api/
6
+
7
+ == Interfacing with the API directly
8
+
9
+ === Configuration
10
+
11
+ In your initializer:
12
+
13
+ HelpScoutDocs.configure do |config|
14
+ config.api_key = "api-key"
15
+ end
16
+
17
+ Or set ENV['HELP_SCOUT_DOCS_API_KEY']
18
+
19
+ ==== Create client
20
+
21
+ client = HelpScoutDocs::Client.new({api_key: "api-key"})
22
+
23
+ ==== Articles
24
+
25
+ Supported methods: get, list (by_category, by_collection), related, revisions, get_revision
26
+
27
+ HelpScoutDocs::Article.new.get(1)
28
+ => HelpScoutDoc::Result #response=>{article: {id: 1, number: "6239e556e4b0cf4cd3254852"} ...}
29
+
30
+ ==== Categories
31
+
32
+ Supported methods: list, get
33
+
34
+ HelpScoutDocs::Category.new.list(1)
35
+ HelpScoutDocs::Category.new.get(1)
36
+
37
+ ==== Collections
38
+
39
+ Supported methods: list, get
40
+
41
+ HelpScoutDocs::Collection.new.list
42
+ HelpScoutDocs::Collection.new.get(1)
43
+
44
+ ==== Sites
45
+
46
+ Supported methods: list, get
47
+
48
+ HelpScoutDocs::Collection.new.list
49
+ HelpScoutDocs::Collection.new.get(1)
50
+
51
+ === Passing parameters
52
+
53
+ Additional parameters are supported for each request (as well as ids in place of numbers), for example:
54
+
55
+ HelpScoutDocs::Collection.new.list("123", { siteId: 1, page: 2 })
56
+
57
+
58
+ == TODO
59
+
60
+ * Add objects for returned types (Asset, Article, Category, Collection, Site) and collections
61
+ * Add write methods (create, update etc.)
62
+ * Handle all error response codes
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "help_scout_docs/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "help-scout-docs"
7
+ s.version = HelpScoutDocs::VERSION
8
+ s.license = "MIT"
9
+ s.authors = ["Mark Edmondson"]
10
+ s.email = ["mark@guestfolio.com"]
11
+ s.homepage = %q{https://github.com/Guestfolio/help-scout-docs}
12
+ s.summary = %q{Integration with Help Scout Docs API}
13
+ s.description = %q{This limited (read-only) Help Scout Docs API integration provides functionality for extracting existing documentation content}
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.has_rdoc = true
21
+
22
+ s.add_development_dependency "multi_json", "~> 1.8"
23
+
24
+ s.add_development_dependency "rspec", "~> 3.0"
25
+ s.add_development_dependency "webmock", "~> 1.15"
26
+ s.add_development_dependency "vcr", "~> 2.9"
27
+ s.add_development_dependency "json_spec", "~> 1.1"
28
+
29
+ s.add_runtime_dependency "log4r", "~> 1.1"
30
+ s.add_runtime_dependency "faraday_middleware", "~> 0.9"
31
+ s.add_runtime_dependency "json", "~> 1.8"
32
+ s.add_runtime_dependency "net-http-persistent", "~> 2.9"
33
+ end
@@ -0,0 +1,14 @@
1
+ require 'log4r'
2
+ require 'help_scout_docs/configurable'
3
+ require 'help_scout_docs/error/errors'
4
+ require 'help_scout_docs/client'
5
+ require 'help_scout_docs/methods/methods'
6
+ require 'help_scout_docs/result'
7
+
8
+ module HelpScoutDocs
9
+ class << self
10
+ include HelpScoutDocs::Configurable
11
+ end
12
+ end
13
+
14
+ HelpScoutDocs.setup
@@ -0,0 +1,95 @@
1
+ require 'faraday'
2
+ require 'json'
3
+
4
+ module HelpScoutDocs
5
+ class Client
6
+ attr_reader :format, :logger
7
+
8
+ # Initializes a new Client object
9
+ #
10
+ # @param options [Hash]
11
+ # @return [HelpScoutDocs::Client]
12
+ #
13
+ def initialize(options={})
14
+ @logger = options.delete(:logger) || self.class.logger
15
+ HelpScoutDocs::Configurable.keys.each do |key|
16
+ instance_variable_set(:"@#{key}", options[key] || HelpScoutDocs.instance_variable_get(:"@#{key}"))
17
+ end
18
+ end
19
+
20
+ # Perform an HTTP GET request
21
+ #
22
+ # @param action [Array]
23
+ #
24
+ def get(path=nil, params={})
25
+ @path ||= path
26
+ request(:get, params)
27
+ end
28
+
29
+ # Perform an HTTP POST request
30
+ #
31
+ # @param action [Array]
32
+ #
33
+ def post(path=nil, params={})
34
+ @path ||= path
35
+ request(:post, params)
36
+ end
37
+
38
+ private
39
+
40
+ def self.logger
41
+ Log4r::Logger.new("help_scout_docs::client")
42
+ end
43
+
44
+ # @return [Boolean]
45
+ #
46
+ def path
47
+ @path || raise(ArgumentError, "Required path missing")
48
+ end
49
+
50
+ # @return [Boolean]
51
+ #
52
+ def authentication_params?
53
+ authentication_params.values.all?
54
+ end
55
+
56
+ # Add hash of authentication params
57
+ # @return [Hash]
58
+ #
59
+ def authentication_params
60
+ {
61
+ api_key: @api_key,
62
+ api_password: @api_password
63
+ }
64
+ end
65
+
66
+ # Setup the Faraday::Request headers
67
+ #
68
+ def headers
69
+ {
70
+ ACCEPT: "application/json",
71
+ ACCEPT_CHARSET: "utf-8"
72
+ }
73
+ end
74
+
75
+ def request(method, params={})
76
+ response = connection.send(method.to_sym, path, params, headers)
77
+ Result.new(response.body) #.force_encoding('utf-8')
78
+ rescue JSON::ParserError => e
79
+ @logger.error "Unable to parse Help Scout Docs API response: #{e.message}"
80
+ @logger.debug response
81
+ raise HelpScoutDocs::Error::ParserError.new e.message
82
+ end
83
+
84
+ # Returns a Faraday::Connection object
85
+ #
86
+ # @return [Faraday::Connection]
87
+ #
88
+ def connection
89
+ raise ArgumentError, "Required authentication params missing" unless authentication_params?
90
+ @connection ||= Faraday.new(@endpoint, builder: @middleware).tap do |c|
91
+ c.basic_auth(authentication_params[:api_key], authentication_params[:api_password])
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,78 @@
1
+ require 'forwardable'
2
+ require 'help_scout_docs/default'
3
+
4
+ module HelpScoutDocs
5
+ module Configurable
6
+ extend Forwardable
7
+ attr_accessor :api_key, :api_password, :endpoint, :middleware
8
+ def_delegator :options, :hash
9
+
10
+ class << self
11
+
12
+ def keys
13
+ @keys ||= [
14
+ :api_key,
15
+ :api_password,
16
+ :endpoint,
17
+ :middleware
18
+ ]
19
+ end
20
+
21
+ end
22
+
23
+ # Convenience method to allow configuration options to be set in a block
24
+ #
25
+ def configure
26
+ yield self
27
+ validate_credential_type!
28
+ self
29
+ end
30
+
31
+ def reset!
32
+ HelpScoutDocs::Configurable.keys.each do |key|
33
+ instance_variable_set(:"@#{key}", HelpScoutDocs::Default.options[key])
34
+ end
35
+ self
36
+ end
37
+ alias setup reset!
38
+
39
+ # @return [Boolean]
40
+ #
41
+ def credentials?
42
+ credentials.values.all?
43
+ end
44
+
45
+ private
46
+
47
+ # @return [Hash]
48
+ #
49
+ def credentials
50
+ {
51
+ api_key: @api_key,
52
+ api_password: @api_password
53
+ }
54
+ end
55
+
56
+ # @return [Hash]
57
+ #
58
+ def options
59
+ Hash[HelpScoutDocs::Configurable.keys.map{|key| [key, instance_variable_get(:"@#{key}")]}]
60
+ end
61
+
62
+ # Ensures that all credentials set during configuration are of a
63
+ # valid type. Valid types are String and Symbol.
64
+ #
65
+ # @raise [HelpScoutDocs::Error::ConfigurationError] Error is raised when
66
+ # supplied twitter credentials are not a String or Symbol.
67
+ def validate_credential_type!
68
+ credentials.each do |credential, value|
69
+ next if value.nil?
70
+
71
+ unless value.is_a?(String) || value.is_a?(Symbol)
72
+ raise(Error::ConfigurationError, "Invalid #{credential} specified: #{value} must be a string or symbol.")
73
+ end
74
+ end
75
+ end
76
+
77
+ end
78
+ end
@@ -0,0 +1,55 @@
1
+ require 'faraday'
2
+ require 'faraday/request/multipart'
3
+ require 'help_scout_docs/configurable'
4
+ require 'help_scout_docs/response/parse_json'
5
+ require 'help_scout_docs/version'
6
+
7
+ module HelpScoutDocs
8
+ module Default
9
+ # Faraday.default_adapter = :net_http_persistent
10
+
11
+ ENDPOINT = 'https://docsapi.helpscout.net/v1/'
12
+ MIDDLEWARE = Faraday::Builder.new do |builder|
13
+ # Encode request params as "www-form-urlencoded"
14
+ builder.use Faraday::Request::UrlEncoded
15
+ # Parse JSON response bodies
16
+ builder.use HelpScoutDocs::Response::ParseJson#, content_type: /\bjson$/
17
+ # Use Faraday logger
18
+ builder.use Faraday::Response::Logger if ENV['DEBUG']
19
+ # Set Faraday's HTTP adapter
20
+ builder.adapter Faraday.default_adapter
21
+ end
22
+
23
+ class << self
24
+
25
+ # @return [Hash]
26
+ def options
27
+ Hash[HelpScoutDocs::Configurable.keys.map{|key| [key, send(key)]}]
28
+ end
29
+
30
+ # @return [String]
31
+ def api_key
32
+ ENV['HELP_SCOUT_DOCS_API_KEY']
33
+ end
34
+
35
+ # @return [String]
36
+ def api_password
37
+ ENV['HELP_SCOUT_DOCS_API_PASSWORD'] || "X"
38
+ end
39
+
40
+ # @return [String]
41
+ def endpoint
42
+ ENDPOINT
43
+ end
44
+
45
+ # @note Faraday's middleware stack implementation is comparable to that of Rack middleware. The order of middleware is important: the first middleware on the list wraps all others, while the last middleware is the innermost one.
46
+ # @see https://github.com/technoweenie/faraday#advanced-middleware-usage
47
+ # @see http://mislav.uniqpath.com/2011/07/faraday-advanced-http/
48
+ # @return [Faraday::Builder]
49
+ def middleware
50
+ MIDDLEWARE
51
+ end
52
+
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,5 @@
1
+ module HelpScoutDocs
2
+ # Custom error class for rescuing errors
3
+ class Error < StandardError
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ module HelpScoutDocs
2
+ class Error
3
+ class AuthenticationError < Error
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module HelpScoutDocs
2
+ class Error
3
+ class ConfigurationError < Error
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ require 'help_scout_docs/error'
2
+ require 'help_scout_docs/error/authentication_error'
3
+ require 'help_scout_docs/error/configuration_error'
4
+ require 'help_scout_docs/error/options_error'
5
+ require 'help_scout_docs/error/parser_error'
6
+ require 'help_scout_docs/error/resource_not_found_error'