apisync 0.1.6 → 0.2.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.
- checksums.yaml +4 -4
- data/README.md +27 -1
- data/lib/apisync.rb +29 -2
- data/lib/apisync/http_client.rb +51 -10
- data/lib/apisync/version.rb +1 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 6d0eba4134c51dcf6e3a7c1727db5fbad9dcbab6
         | 
| 4 | 
            +
              data.tar.gz: 531ee71f557836f25dc58db9671e327bf6a476ad
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: b6d04b2709ef4f99351fefce81e93f54bc25d6fa8703483d3cbaf50734b6badb475d0708bc0315941f143f047d1e6f12f4be127c1d964170cce6b58b13939c87
         | 
| 7 | 
            +
              data.tar.gz: 68a6179d0c0b8684355c1d6a44bcd241f5709a4990458f6a728ac390f857be39a84003eeef62512e597044865bb8bc1419aeb49a305b6fa83cdc88e6fcbc30dd
         | 
    
        data/README.md
    CHANGED
    
    | @@ -39,7 +39,7 @@ client.inventory_items.save({ | |
| 39 39 | 
             
            For details on the attributes, see the
         | 
| 40 40 | 
             
            [API Reference documentation](https://docs.apisync.io/api/).
         | 
| 41 41 |  | 
| 42 | 
            -
            You can also define  | 
| 42 | 
            +
            You can also define the API key globally:
         | 
| 43 43 |  | 
| 44 44 | 
             
            ```ruby
         | 
| 45 45 | 
             
            Apisync.api_key = "my-key"
         | 
| @@ -48,6 +48,32 @@ Apisync.api_key = "my-key" | |
| 48 48 | 
             
            client = Apisync.new
         | 
| 49 49 | 
             
            ```
         | 
| 50 50 |  | 
| 51 | 
            +
            #### Verbose
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            If you want to output to `$stdout`, set `verbose: true`:
         | 
| 54 | 
            +
             | 
| 55 | 
            +
            ```rb
         | 
| 56 | 
            +
            # Define in the instance
         | 
| 57 | 
            +
            client = Apisync.new(api_key: 'api-key', verbose: true)
         | 
| 58 | 
            +
             | 
| 59 | 
            +
            # or define it globally
         | 
| 60 | 
            +
            Apisync.verbose = true
         | 
| 61 | 
            +
            ```
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            That is useful on Rails console in development mode, so you know what requests
         | 
| 64 | 
            +
            are being made
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            **Logger**
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            You can inject a logger as well:
         | 
| 69 | 
            +
             | 
| 70 | 
            +
            ```rb
         | 
| 71 | 
            +
            Apisync.logger = Logger.new($stdout)
         | 
| 72 | 
            +
             | 
| 73 | 
            +
            # or
         | 
| 74 | 
            +
            Apisync.logger = Rails.logger
         | 
| 75 | 
            +
            ```
         | 
| 76 | 
            +
             | 
| 51 77 | 
             
            ### Responses
         | 
| 52 78 |  | 
| 53 79 | 
             
            All HTTP calls return an
         | 
    
        data/lib/apisync.rb
    CHANGED
    
    | @@ -1,5 +1,7 @@ | |
| 1 1 | 
             
            require "bundler/setup"
         | 
| 2 2 | 
             
            require "httparty"
         | 
| 3 | 
            +
            require "securerandom"
         | 
| 4 | 
            +
            require "logger"
         | 
| 3 5 |  | 
| 4 6 | 
             
            require "apisync/version"
         | 
| 5 7 | 
             
            require "apisync/exceptions"
         | 
| @@ -12,9 +14,19 @@ class Apisync | |
| 12 14 | 
             
              @@api_key = nil
         | 
| 13 15 | 
             
              @@host = nil
         | 
| 14 16 |  | 
| 15 | 
            -
               | 
| 17 | 
            +
              # Verbose will do $stdout.puts. That's useful on a Rails console in
         | 
| 18 | 
            +
              # development, where logger output is ommited.
         | 
| 19 | 
            +
              @@verbose = false
         | 
| 20 | 
            +
              @@logger = ::Logger.new(IO::NULL)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              attr_accessor :verbose
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              def initialize(api_key: nil, verbose: nil, logger: nil)
         | 
| 16 25 | 
             
                @api_key = api_key || @@api_key
         | 
| 17 26 | 
             
                @host = @@host
         | 
| 27 | 
            +
                @verbose = verbose || @@verbose
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                @logger = logger || @@logger
         | 
| 18 30 |  | 
| 19 31 | 
             
                raise ArgumentError, "missing keyword: api_key" if @api_key.nil?
         | 
| 20 32 | 
             
              end
         | 
| @@ -22,8 +34,11 @@ class Apisync | |
| 22 34 | 
             
              def method_missing(name, args = {}, &block)
         | 
| 23 35 | 
             
                # overrides the instance api_key as `authorization`
         | 
| 24 36 | 
             
                options = {
         | 
| 25 | 
            -
                  host: @host
         | 
| 37 | 
            +
                  host: @host,
         | 
| 38 | 
            +
                  verbose: @verbose,
         | 
| 39 | 
            +
                  logger: @logger
         | 
| 26 40 | 
             
                }.merge(args).merge(api_key: @api_key)
         | 
| 41 | 
            +
             | 
| 27 42 | 
             
                Apisync::Resource.new(name, options)
         | 
| 28 43 | 
             
              end
         | 
| 29 44 |  | 
| @@ -34,4 +49,16 @@ class Apisync | |
| 34 49 | 
             
              def self.api_key=(value)
         | 
| 35 50 | 
             
                @@api_key = value
         | 
| 36 51 | 
             
              end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              def self.verbose=(value)
         | 
| 54 | 
            +
                @@verbose = value
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              def self.logger=(value)
         | 
| 58 | 
            +
                @@logger = value
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
              def self.verbose?
         | 
| 62 | 
            +
                !!@@verbose
         | 
| 63 | 
            +
              end
         | 
| 37 64 | 
             
            end
         | 
    
        data/lib/apisync/http_client.rb
    CHANGED
    
    | @@ -10,38 +10,63 @@ class Apisync | |
| 10 10 | 
             
                def initialize(resource_name:, options: {})
         | 
| 11 11 | 
             
                  @resource_name = resource_name
         | 
| 12 12 | 
             
                  @options = options
         | 
| 13 | 
            +
                  @logger = options[:logger]
         | 
| 13 14 | 
             
                end
         | 
| 14 15 |  | 
| 15 16 | 
             
                def post(data:, headers: {})
         | 
| 17 | 
            +
                  request_body = {data: payload_from_data(data)}
         | 
| 18 | 
            +
                  url = request_url
         | 
| 19 | 
            +
                  header = request_header.merge(headers)
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  output_verbose_request(url, request_body, header)
         | 
| 22 | 
            +
             | 
| 16 23 | 
             
                  wrap_response(HTTParty.post(
         | 
| 17 | 
            -
                     | 
| 18 | 
            -
                    body:  | 
| 19 | 
            -
                    headers: header | 
| 24 | 
            +
                    request_url,
         | 
| 25 | 
            +
                    body: request_body.to_json,
         | 
| 26 | 
            +
                    headers: header
         | 
| 20 27 | 
             
                  ))
         | 
| 21 28 | 
             
                end
         | 
| 22 29 |  | 
| 23 30 | 
             
                def put(id:, data:, headers: {})
         | 
| 24 31 | 
             
                  raise Apisync::UrlAndPayloadIdMismatch unless id == data[:id]
         | 
| 25 32 |  | 
| 33 | 
            +
                  request_body = {data: payload_from_data(data)}
         | 
| 34 | 
            +
                  url = request_url(id: id)
         | 
| 35 | 
            +
                  header = request_header.merge(headers)
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  output_verbose_request(url, request_body, header)
         | 
| 38 | 
            +
             | 
| 26 39 | 
             
                  wrap_response(HTTParty.put(
         | 
| 27 | 
            -
                    url | 
| 28 | 
            -
                    body:  | 
| 29 | 
            -
                    headers: header | 
| 40 | 
            +
                    url,
         | 
| 41 | 
            +
                    body: request_body.to_json,
         | 
| 42 | 
            +
                    headers: header
         | 
| 30 43 | 
             
                  ))
         | 
| 31 44 | 
             
                end
         | 
| 32 45 |  | 
| 33 46 | 
             
                def get(id: nil, filters: nil, headers: {})
         | 
| 34 47 | 
             
                  raise Apisync::InvalidFilter if !filters.nil? && !filters.is_a?(Hash)
         | 
| 35 48 |  | 
| 49 | 
            +
                  url = request_url(id: id, filters: filters)
         | 
| 50 | 
            +
                  output_verbose_request(url)
         | 
| 51 | 
            +
             | 
| 36 52 | 
             
                  wrap_response(HTTParty.get(
         | 
| 37 | 
            -
                    url | 
| 38 | 
            -
                    headers:  | 
| 53 | 
            +
                    url,
         | 
| 54 | 
            +
                    headers: request_header.merge(headers)
         | 
| 39 55 | 
             
                  ))
         | 
| 40 56 | 
             
                end
         | 
| 41 57 |  | 
| 42 58 | 
             
                private
         | 
| 43 59 |  | 
| 44 | 
            -
                def  | 
| 60 | 
            +
                def verbose?
         | 
| 61 | 
            +
                  @options.fetch(:verbose, false)
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                def output_verbose_request(url, body = nil, headers = nil)
         | 
| 65 | 
            +
                  log("[APISync] Request URL: #{url}")
         | 
| 66 | 
            +
                  log("[APISync] Payload: #{body.to_json}")if body
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                def request_url(id: nil, filters: nil)
         | 
| 45 70 | 
             
                  Apisync::Http::Url.new(
         | 
| 46 71 | 
             
                    resource_name: @resource_name,
         | 
| 47 72 | 
             
                    id: id,
         | 
| @@ -50,8 +75,9 @@ class Apisync | |
| 50 75 | 
             
                  ).to_s
         | 
| 51 76 | 
             
                end
         | 
| 52 77 |  | 
| 53 | 
            -
                def  | 
| 78 | 
            +
                def request_header
         | 
| 54 79 | 
             
                  final = HEADER
         | 
| 80 | 
            +
                  final = final.merge("X-Request-Id" => ::SecureRandom.uuid)
         | 
| 55 81 | 
             
                  if @options[:api_key]
         | 
| 56 82 | 
             
                    final = final.merge("Authorization" => "ApiToken #{@options[:api_key]}")
         | 
| 57 83 | 
             
                  end
         | 
| @@ -73,10 +99,25 @@ class Apisync | |
| 73 99 |  | 
| 74 100 | 
             
                def wrap_response(response)
         | 
| 75 101 | 
             
                  if response.code.to_i == 429
         | 
| 102 | 
            +
                    if verbose?
         | 
| 103 | 
            +
                      log "[APISync] Response: 429 Too many requests at once, slow down."
         | 
| 104 | 
            +
                    end
         | 
| 76 105 | 
             
                    raise Apisync::TooManyRequests
         | 
| 77 106 | 
             
                  else
         | 
| 107 | 
            +
                    if verbose?
         | 
| 108 | 
            +
                      msg = "[APISync] Response: #{response.code}"
         | 
| 109 | 
            +
                      if response.body != ""
         | 
| 110 | 
            +
                        msg << " #{response.body}"
         | 
| 111 | 
            +
                      end
         | 
| 112 | 
            +
                      log msg
         | 
| 113 | 
            +
                    end
         | 
| 78 114 | 
             
                    response
         | 
| 79 115 | 
             
                  end
         | 
| 80 116 | 
             
                end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                def log(msg)
         | 
| 119 | 
            +
                  $stdout.puts(msg) if verbose?
         | 
| 120 | 
            +
                  @logger.info(msg)
         | 
| 121 | 
            +
                end
         | 
| 81 122 | 
             
              end
         | 
| 82 123 | 
             
            end
         | 
    
        data/lib/apisync/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: apisync
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Alexandre de Oliveira
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2018-09-21 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: httparty
         |