namira 0.2.1 → 1.0.0.rc1

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: 63085cd6f572280dd638cd117d3f16fc558f70d0
4
- data.tar.gz: 96afbf7ede7bde36cbe6590cf7d4af507d8538f3
3
+ metadata.gz: f8a61a21ca4adf902c8b0b7a19e858264003c439
4
+ data.tar.gz: 2f2fcb31c8680d3435ff527c437cefcbe8c8ddf4
5
5
  SHA512:
6
- metadata.gz: 4414f7af836dbfad1635f816cc9817c20c64c1e58695c78d0331118f7570e7c8f50075c52285cdc34dfb7d4cc8edef17f6b523c273a15f6cff2fb816fabd720d
7
- data.tar.gz: 171bcdc82d4e783e162ce00920732a8bcc74e4217b0a6d947e6d7ddcecfe31a155ee0cb38cdb1af381e195d3be36cf8f4d1d7c5679070a1aa427fe98449bf94b
6
+ metadata.gz: 71a2b284cf3121bf7b92ed4ac1ec4620cff69190823935cdf1b869b1236f1de58fdb43f59bf46138fd67f20ecede24626d0f953c5c710a0b583f9559f29d346c
7
+ data.tar.gz: 5c84411bc338cd23d6d715cab691c3dc48ee668234b47bdd3386b18ee31e90ee71453b27ed2b8e96f04afcfd7d40b459db5accc3daf17dda6253e07ff51250d5
@@ -0,0 +1,37 @@
1
+ version: 2
2
+ jobs:
3
+ build:
4
+ environment:
5
+ CC_TEST_REPORTER_ID: 1c8715d8f4fb6cb280a974b7a537ea5e10dd93e92e1267db5e9dadb3b32cf178
6
+ docker:
7
+ - image: circleci/ruby:2.4.2
8
+ working_directory: ~/repo
9
+ steps:
10
+ - checkout
11
+ - run:
12
+ name: Setup Code Climate test-reporter
13
+ command: |
14
+ curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
15
+ chmod +x ./cc-test-reporter
16
+ - restore_cache:
17
+ keys:
18
+ - v1-gems-{{ checksum "namira.gemspec" }}
19
+ - v1-gems-
20
+ - run:
21
+ name: install gems
22
+ command: |
23
+ bundle install --jobs=4 --retry=3 --path vendor/bundle
24
+ - save_cache:
25
+ key: v1-gems-{{ checksum "namira.gemspec" }}
26
+ paths:
27
+ - ./vendor/bundle
28
+ - run:
29
+ name: Run Specs
30
+ command: bundle exec rspec spec/**/*.rb
31
+ - run:
32
+ name: Report Coverage
33
+ command: |
34
+ ./cc-test-reporter format-coverage -t simplecov $CIRCLE_ARTIFACTS/coverage/.resultset.json
35
+ ./cc-test-reporter upload-coverage
36
+ - store_artifacts:
37
+ path: coverage/coverage.json
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
- --format documentation
1
+ --format progress
2
2
  --color
data/.rubocop.yml CHANGED
@@ -2,7 +2,7 @@ AllCops:
2
2
  TargetRubyVersion: 2.2
3
3
  Exclude:
4
4
  - Rakefile
5
- - bin/**/*
5
+ - spec/**/*
6
6
 
7
7
  Metrics/AbcSize:
8
8
  Max: 30
@@ -25,24 +25,18 @@ DotPosition:
25
25
  StringLiterals:
26
26
  EnforcedStyle: single_quotes
27
27
 
28
- Style/AlignParameters:
28
+ Layout/AlignParameters:
29
29
  EnforcedStyle: with_fixed_indentation
30
30
 
31
- Style/MultilineOperationIndentation:
31
+ Layout/MultilineOperationIndentation:
32
32
  EnforcedStyle: indented
33
33
 
34
- Style/MultilineMethodCallIndentation:
34
+ Layout/MultilineMethodCallIndentation:
35
35
  EnforcedStyle: indented
36
36
 
37
- Style/ExtraSpacing:
38
- Enabled: false
39
-
40
37
  Style/AndOr:
41
38
  EnforcedStyle: conditionals
42
39
 
43
- Style/Documentation:
44
- Enabled: false
45
-
46
40
  Style/ClassAndModuleChildren:
47
41
  Enabled: false
48
42
 
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ # 1.0.0.rc1 (master)
2
+
3
+ Namira 1.0
data/README.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Namira
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/namira.svg)](https://badge.fury.io/rb/namira)
4
+ [![CircleCI](https://circleci.com/gh/skylarsch/namira/tree/master.svg?style=svg)](https://circleci.com/gh/skylarsch/namira/tree/master)
5
+ [![Maintainability](https://api.codeclimate.com/v1/badges/888de458aae02d3c7cfc/maintainability)](https://codeclimate.com/github/skylarsch/namira/maintainability)
6
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/888de458aae02d3c7cfc/test_coverage)](https://codeclimate.com/github/skylarsch/namira/test_coverage)
7
+
8
+ A Ruby HTTP client.
9
+
3
10
  ## Installation
4
11
 
5
12
  Add this line to your application's Gemfile:
@@ -16,6 +23,10 @@ Or install it yourself as:
16
23
 
17
24
  $ gem install namira
18
25
 
26
+ ## Documentation
27
+
28
+ Run `bundle exec yard`
29
+
19
30
  ## Usage
20
31
 
21
32
  ### GET
data/Rakefile CHANGED
@@ -1,6 +1,12 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'yard'
3
4
 
4
5
  RSpec::Core::RakeTask.new(:spec)
5
6
 
6
- task :default => :spec
7
+ task default: :spec
8
+
9
+ YARD::Rake::YardocTask.new do |t|
10
+ t.files = ['lib/**/*.rb'] # optional
11
+ t.stats_options = ['--list-undoc'] # optional
12
+ end
data/bin/console CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "namira"
5
- require "pry"
3
+ require 'bundler/setup'
4
+ require 'namira'
5
+ require 'pry'
6
6
 
7
7
  Namira.configure do |config|
8
8
  config.user_agent = 'test'
@@ -1,5 +1,9 @@
1
1
  module Namira
2
+ ##
3
+ # Authentication
2
4
  module Auth
5
+ ##
6
+ # The base authentication class
3
7
  class Base
4
8
  attr_accessor :sign_redirects
5
9
 
@@ -11,11 +15,22 @@ module Namira
11
15
  end
12
16
  end
13
17
 
18
+ ##
19
+ # @private
20
+ #
21
+ # Signs a request.
22
+ #
23
+ # @param backend [HTTP] The request being signed
24
+ # @param redirect_count [Integer] The number of redirects this request has encountered
14
25
  def sign_request(backend, redirect_count)
15
26
  return if redirect_count > 0 && !sign_redirects?
16
27
  sign(backend)
17
28
  end
18
29
 
30
+ ##
31
+ # Perform the signing of the request
32
+ #
33
+ # @param backend [HTTP] The instance of the backend request to sign.
19
34
  def sign(_backend)
20
35
  raise NotImplementedError, 'Auth should override the `sign` method'
21
36
  end
@@ -1,13 +1,22 @@
1
1
  module Namira
2
2
  module Auth
3
+ ##
4
+ # Signs a HTTP request with HTTP basic authentication
3
5
  class HTTPBasic < Base
4
6
  attr_reader :user, :pass
5
7
 
8
+ ##
9
+ # Create a new instance
10
+ #
11
+ # @param user [String] The username
12
+ # @param pass [String] The password
6
13
  def initialize(user:, pass:)
7
14
  @user = user
8
15
  @pass = pass
9
16
  end
10
17
 
18
+ ##
19
+ # Signs the request
11
20
  def sign(request)
12
21
  request.basic_auth(user: user, pass: pass)
13
22
  end
@@ -1,66 +1,137 @@
1
1
  module Namira
2
+ ##
3
+ # The backend is responsible for sending the requests.
4
+ #
5
+ # Namira uses HTTP Gem as its default backend. You can create your own backend and override `.send_request` to
6
+ # use a different network stack.
7
+ #
8
+ # Namira.config do |c|
9
+ # c.backend = CustomBackend
10
+ # end
11
+ #
12
+ # A fully compatable backend should handle redirects, respecting the max_redirect parameter as well as
13
+ # throwing a Errors::HTTPError for anything but a redirect & 2xx status code.
2
14
  class Backend
3
- #
15
+ ##
4
16
  # This allows anyone to substitute in their own networking stack.
5
17
  #
6
18
  # Any class that implements this method and resturns a `Namira::Response` object can be a fully qualified backend.
7
19
  #
8
- # The required params are
9
- #
10
- # uri: The URI to fetch
11
- # method: The HTTP method to use, expressed as a Symbol i.e. `:get`
12
- # headers: The full HTTP headers to send from the request expressed as a Hash
13
- # max_redirect: The maximum number of redirects to follow. Passed from the Request
14
- # timeout: The number of seconds before a timeout should occure
15
- # auth: The Namira::Auth::Base subclass instance or nil to sign the request with
16
- #
17
- # This class is 100% capable of fufilling all Namira's needs.
18
- # But this is an option if you really need to provide a custom networking backend
20
+ # @param uri [String] The URI to fetch
21
+ # @param method [Symbol] The HTTP method to use, expressed as a Symbol i.e. `:get`
22
+ # @param headers [Hash] The full HTTP headers to send from the request expressed as a Hash
23
+ # @param max_redirect [Integer] The maximum number of redirects to follow. Passed from the Request
24
+ # @param timeout [Integer] The number of seconds before a timeout should occure
25
+ # @param auth [Namira::Auth::Base] The `Namira::Auth::Base` subclass instance or nil to sign the request with
19
26
  #
27
+ # @return [Namira::Response] The HTTP response
20
28
  def self.send_request(uri:, method:, headers:, max_redirect:, timeout:, body:, auth:)
21
- Backend.new.send_request(uri, method, headers, max_redirect, timeout, body, auth)
29
+ Backend.new(
30
+ uri: uri,
31
+ method: method,
32
+ headers: headers,
33
+ max_redirect: max_redirect,
34
+ timeout: timeout,
35
+ body: body,
36
+ auth: auth
37
+ ).execute
38
+ end
39
+
40
+ ##
41
+ # The default max redirects to consider the request a "no follow"
42
+ NO_FOLLOW_REDIRECT_COUNT = -1
43
+
44
+ ##
45
+ # @private
46
+ def initialize(opts = {})
47
+ opts.each do |key, value|
48
+ instance_variable_set("@#{key}", value)
49
+ end
50
+ @redirect_count = 0
51
+ end
52
+
53
+ ##
54
+ # @private
55
+ #
56
+ # Perform the request
57
+ def execute(location = nil)
58
+ ensure_redirect_count!(location)
59
+ prepare_request
60
+ sign_request_if_needed
61
+ send_request(location || @uri)
62
+ handle_response
22
63
  end
23
64
 
24
- def send_request(uri, method, headers, max_redirect, timeout, body, auth)
25
- @redirect_count ||= 0
26
- raise Errors::TooManyRedirects, "Max number of redirects #{@redirect_count} for #{uri}" if @redirect_count > max_redirect
65
+ private
27
66
 
28
- log_request(method, uri)
67
+ def ensure_redirect_count!(location)
68
+ return if @redirect_count.zero?
69
+ return if @redirect_count <= @max_redirect
70
+ raise Errors::RedirectError.new(
71
+ "Max number of redirects #{@redirect_count} for #{@uri}",
72
+ location,
73
+ @redirect_count
74
+ )
75
+ end
29
76
 
30
- http = HTTP.timeout(
77
+ def prepare_request
78
+ @http = HTTP.timeout(
31
79
  :per_operation,
32
- write: timeout,
33
- connect: timeout,
34
- read: timeout
35
- ).headers(headers)
80
+ write: @timeout,
81
+ connect: @timeout,
82
+ read: @timeout
83
+ ).headers(@headers)
84
+ end
85
+
86
+ def log_request(method, uri)
87
+ return unless Namira.configure.log_requests
88
+ if defined?(::Rails)
89
+ Rails.logger.debug "#{method.to_s.upcase} - #{uri}"
90
+ else
91
+ STDOUT.puts "#{method.to_s.upcase} - #{uri}"
92
+ end
93
+ end
36
94
 
37
- http = auth.sign_request(http, @redirect_count) unless auth.nil?
95
+ def send_request(location)
96
+ log_request(@method, location)
97
+ @response = @http.send(@method, location, body: @body)
98
+ rescue HTTP::TimeoutError => e
99
+ raise Namira::Errors::TimeoutError.new(e.message)
100
+ rescue Addressable::URI::InvalidURIError => e
101
+ raise Namira::Errors::InvalidURIError.new(e.message)
102
+ end
38
103
 
39
- response = http.send(method, uri, body: body)
104
+ def sign_request_if_needed
105
+ @http = @auth.sign_request(@http, @redirect_count) unless @auth.nil?
106
+ end
40
107
 
41
- case response.status
108
+ def handle_response
109
+ case @response.status
42
110
  when 200..299
43
- Namira::Response.new(response)
111
+ create_response
44
112
  when 301, 302
45
- @redirect_count += 1
46
- location = response.headers['Location']
47
- raise Errors::RedirectError, 'Request redirected but no location was supplied' if location.nil?
48
- send_request(location, method, headers, max_redirect, timeout, body, auth)
113
+ handle_redirect
49
114
  else
50
- raise Errors::HTTPError.new("http_error/#{response.status}", response.status, Namira::Response.new(response))
115
+ create_error_response
51
116
  end
117
+ end
52
118
 
53
- rescue HTTP::TimeoutError => e
54
- raise Namira::Errors::Timeout.new(e.message)
119
+ def create_response
120
+ Namira::Response.new(@response)
55
121
  end
56
122
 
57
- private
123
+ def create_error_response
124
+ raise Errors::HTTPError.new("http_error/#{@response.status}", @response.status, create_response)
125
+ end
58
126
 
59
- def log_request(method, uri)
60
- if defined?(::Rails)
61
- Rails.logger.debug "#{method.to_s.upcase} - #{uri}"
127
+ def handle_redirect
128
+ if @max_redirect == NO_FOLLOW_REDIRECT_COUNT
129
+ create_error_response
62
130
  else
63
- puts "#{method.to_s.upcase} - #{uri}"
131
+ @redirect_count += 1
132
+ location = @response.headers['Location']
133
+ raise Errors::RedirectError.new('Request redirected but no location was supplied', nil, @redirect_count) if location.nil?
134
+ execute(location)
64
135
  end
65
136
  end
66
137
  end
data/lib/namira/config.rb CHANGED
@@ -1,25 +1,65 @@
1
+ require 'ostruct'
2
+
3
+ ##
1
4
  module Namira
2
- class Config
3
- attr_accessor :max_redirect, :timeout, :backend, :user_agent
5
+ ##
6
+ # Namira configuration
7
+ #
8
+ # Namira.configure do |config|
9
+ # config.user_agent = "MyCoolApp"
10
+ # end
11
+ #
12
+ # @!attribute [rw] max_redirect
13
+ # The maximum number of redirects to follow before throwing a {Namira::Errors::RedirectError}
14
+ # @return [Integer] Defaults: 3
15
+ #
16
+ # @!attribute [rw] timeout
17
+ # The max length of time (in seconds) Namira will wait before canceling the request and
18
+ # throwing a {Namira::Errors::TimeoutError}
19
+ # @return [Float] Defaults: 5.0
20
+ #
21
+ # @!attribute [rw] backend
22
+ # The backend Namira will use to send the request.
23
+ # @return [Namira::Backend] This returns a Class and not an instance. Defaults: {Namira::Backend}
24
+ #
25
+ # @!attribute [rw] user_agent
26
+ # The string to send for the "User-Agent" header. The value set here will be overriden if a user agent is
27
+ # specified on the request itself.
28
+ # @return [String] Defaults: Namira/1.0
29
+ #
30
+ # @!attribute [r] headers
31
+ # Default headers to send with each request
32
+ # @return [OpenStruct]
33
+ #
34
+ # @!attribute [rw] log_requests
35
+ # Log requests using puts or Rails.logger.debug if it's defined
36
+ # @return (Bool) Defaults: true
37
+ class Config < OpenStruct
38
+ ##
39
+ # The
40
+ # attr_accessor :max_redirect
41
+ # attr_accessor :timeout
42
+ # attr_accessor :backend
43
+ # attr_accessor :user_agent
4
44
 
5
45
  DEFAULT_SETTINGS = {
6
46
  max_redirect: 3,
7
47
  timeout: 5.0,
8
48
  backend: nil,
9
- user_agent: "Namira/#{Namira::VERSION}"
49
+ user_agent: "Namira/#{Namira::VERSION}",
50
+ headers: OpenStruct.new,
51
+ log_requests: true
10
52
  }.freeze
11
53
 
12
- def initialize
13
- DEFAULT_SETTINGS.each do |k, v|
14
- send("#{k}=", v)
15
- end
16
- end
54
+ private_constant :DEFAULT_SETTINGS
17
55
 
18
- def headers
19
- @headers ||= OpenStruct.new
56
+ def initialize
57
+ super(DEFAULT_SETTINGS)
20
58
  end
21
59
  end
22
60
 
61
+ ##
62
+ # The shared configuration
23
63
  def self.configure
24
64
  @config ||= Config.new
25
65
  yield(@config) if block_given?
@@ -0,0 +1,10 @@
1
+ module Namira
2
+ module Errors
3
+ ##
4
+ # The base Namira error.
5
+ #
6
+ # All errors thrown from Namira will be an instance of this class.
7
+ class BaseError < StandardError
8
+ end
9
+ end
10
+ end
@@ -1,8 +1,24 @@
1
1
  module Namira
2
2
  module Errors
3
- class HTTPError < Base
4
- attr_reader :status, :response
3
+ ##
4
+ # HTTP Error
5
+ #
6
+ # Any non 2xx status code will raise this error.
7
+ class HTTPError < BaseError
8
+ ##
9
+ # @return [Integer] The HTTP status that caused the error
10
+ attr_reader :status
5
11
 
12
+ ##
13
+ # @return [Namira::Response] The HTTP response
14
+ attr_reader :response
15
+
16
+ ##
17
+ # Returns a new instance of HTTPError
18
+ #
19
+ # @param msg [String] The error message. e.g. "http_error/500"
20
+ # @param status [Integer] The HTTP status that caused the error
21
+ # @param response [Namira::Response] The HTTP response
6
22
  def initialize(msg, status, response)
7
23
  @status = status
8
24
  @response = response
@@ -0,0 +1,11 @@
1
+ module Namira
2
+ module Errors
3
+ ##
4
+ # An InvalidURIError
5
+ #
6
+ # @!attribute [r] message
7
+ # @return [String] Will contain information about the error.
8
+ class InvalidURIError < BaseError
9
+ end
10
+ end
11
+ end
@@ -1,6 +1,28 @@
1
1
  module Namira
2
2
  module Errors
3
- class RedirectError < Base
3
+ ##
4
+ # A RedirectError
5
+ #
6
+ # @!attribute [r] message
7
+ # @return [String] Will contain information about the error.
8
+ class RedirectError < BaseError
9
+ ##
10
+ # The location the redirect is pointing to
11
+ # @return [String]
12
+ attr_reader :location
13
+
14
+ ##
15
+ # The number of redirects that occured
16
+ # @return [Integer]
17
+ attr_reader :count
18
+
19
+ ##
20
+ # Creates a new instance
21
+ def initialize(msg, location, count)
22
+ super(msg)
23
+ @location = location
24
+ @count = count
25
+ end
4
26
  end
5
27
  end
6
28
  end
@@ -0,0 +1,11 @@
1
+ module Namira
2
+ module Errors
3
+ ##
4
+ # A TimeoutError
5
+ #
6
+ # @!attribute [r] message
7
+ # @return [String] Will contain information about the error.
8
+ class TimeoutError < BaseError
9
+ end
10
+ end
11
+ end
data/lib/namira/errors.rb CHANGED
@@ -1,5 +1,12 @@
1
- require_relative 'errors/base'
1
+ require_relative 'errors/base_error'
2
2
  require_relative 'errors/http_error'
3
- require_relative 'errors/too_many_redirects'
3
+ require_relative 'errors/invalid_uri_error'
4
4
  require_relative 'errors/redirect_error'
5
- require_relative 'errors/timeout'
5
+ require_relative 'errors/timeout_error'
6
+
7
+ module Namira
8
+ ##
9
+ # Namira Errors
10
+ module Errors
11
+ end
12
+ end
@@ -1,7 +1,22 @@
1
+ require 'ostruct'
2
+
1
3
  module Namira
4
+ ##
5
+ # Builds a query
6
+ #
7
+ # query = Namira::QueryBuilder.new
8
+ # query.name = 'Test Person'
9
+ # query.to_s
10
+ # => "name=Test%20Person"
2
11
  class QueryBuilder < OpenStruct
12
+ ##
13
+ # Returns the query as a valid query string
14
+ #
15
+ # @return [String]
3
16
  def to_s
4
- to_h.map { |k, v| "#{k}=#{v}" }.join('&')
17
+ uri = Addressable::URI.new
18
+ uri.query_values = to_h
19
+ uri.query
5
20
  end
6
21
  end
7
22
  end
@@ -1,27 +1,52 @@
1
1
  require 'http'
2
2
 
3
3
  module Namira
4
+ ##
5
+ # The request class is used to create and send HTTP requests.
6
+ #
7
+ # response = Namira::Request.new(uri: 'https://httpbin.org/headers').response
4
8
  class Request
5
9
  attr_reader :uri, :http_method
6
10
 
11
+ ##
12
+ # Create a new request
13
+ #
14
+ # @param uri [String] The request URL
15
+ # @param http_method [Symbol] The HTTP method for the request. (Default `:get`)
16
+ # @param headers [Hash] Additional headers to send with the request. (Default: `{}`)
17
+ # @param body [String, #to_s] The body to send. (Default: nil)
18
+ # @param auth [Namira::Auth::Base] The auth instance used to sign requests.
19
+ # @param config [Hash] {Namira::Config} overrides
7
20
  def initialize(uri:, http_method: :get, headers: {}, body: nil, auth: nil, config: {})
8
21
  @uri = uri
9
22
  @http_method = http_method
10
- @headers = headers || {}
23
+ @headers = Hash(headers)
11
24
  @body = body
12
25
  @auth = auth
13
26
  @timeout = config[:timeout] || Namira.configure.timeout
14
27
  @max_redirect = config[:max_redirect] || Namira.configure.max_redirect
15
28
  @backend = config[:backend] || Namira.configure.backend || Namira::Backend
16
29
  @user_agent = config[:user_agent] || Namira.configure.user_agent
30
+ @max_redirect = Backend::NO_FOLLOW_REDIRECT_COUNT if config[:follow_redirect] == false
17
31
  end
18
32
 
33
+ ##
34
+ # Sends the request.
35
+ #
36
+ # Every time this method is called a network request will be sent.
19
37
  def send_request
20
- @response ||= _send_request(uri)
38
+ @response = _send_request(uri)
21
39
  end
22
40
 
41
+ ##
42
+ # The {Namira::Response} for the request.
43
+ #
44
+ # If the request hasn't been sent yet calling this will get the request.
45
+ #
46
+ # @return {Namira::Response}
23
47
  def response
24
- send_request
48
+ send_request if @response.nil?
49
+ @response
25
50
  end
26
51
 
27
52
  private
@@ -29,8 +54,8 @@ module Namira
29
54
  def build_headers
30
55
  {}.tap do |headers|
31
56
  headers['User-Agent'] = @user_agent
32
- Namira.configure.headers.each do |k, v|
33
- key = k.split('_').map(&:capitalize).join('-')
57
+ Namira.configure.headers.to_h.each do |k, v|
58
+ key = k.to_s.split('_').map(&:capitalize).join('-')
34
59
  headers[key] = v
35
60
  end
36
61
  @headers.each do |k, v|
@@ -1,13 +1,33 @@
1
1
  module Namira
2
+ ##
3
+ # HTTP response
2
4
  class Response
5
+ ##
6
+ # Create a new {Namira::Response}
3
7
  def initialize(backing)
4
8
  @backing = backing
5
9
  end
6
10
 
11
+ ##
12
+ # @return [Hash, Array] Parse the response body as JSON
7
13
  def from_json
8
14
  @json ||= JSON.parse(@backing.body)
9
15
  end
10
16
 
17
+ ##
18
+ # @return [String] Returns the response as a string
19
+ def to_s
20
+ @backing.to_s
21
+ end
22
+
23
+ ##
24
+ # @return [Bool] If the response status 2xx
25
+ def ok?
26
+ (200...300).cover?(@backing.status)
27
+ end
28
+
29
+ ##
30
+ # Proxies methods to the backing object
11
31
  def method_missing(name, *args)
12
32
  if @backing.respond_to?(name)
13
33
  @backing.send(name, *args)
@@ -16,10 +36,6 @@ module Namira
16
36
  end
17
37
  end
18
38
 
19
- def to_s
20
- @backing.to_s
21
- end
22
-
23
39
  def respond_to_missing?(method_name, include_private = false)
24
40
  @backing.respond_to?(method_name) || super
25
41
  end
@@ -1,3 +1,5 @@
1
1
  module Namira
2
- VERSION = '0.2.1'.freeze
2
+ ##
3
+ # The current version of Namira
4
+ VERSION = '1.0.0.rc1'.freeze
3
5
  end
data/lib/namira.rb CHANGED
@@ -5,7 +5,9 @@ require 'namira/errors'
5
5
  require 'namira/config'
6
6
  require 'namira/query_builder'
7
7
  require 'namira/backend'
8
- require 'namira/extensions/hash_key_path'
9
8
  require 'namira/auth'
10
9
 
11
- Hash.include(Namira::Extensions::HashKeyPath)
10
+ ##
11
+ # A Ruby HTTP client
12
+ module Namira
13
+ end
data/namira.gemspec CHANGED
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  lib = File.expand_path('../lib', __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'namira/version'
@@ -7,29 +6,25 @@ Gem::Specification.new do |spec|
7
6
  spec.name = 'namira'
8
7
  spec.version = Namira::VERSION
9
8
  spec.authors = ['Skylar Schipper']
10
- spec.email = ['ss@schipp.co']
9
+ spec.email = ['me@skylarsch.com']
11
10
 
12
11
  spec.summary = 'A simple wrapper around HTTP'
13
12
  spec.description = 'This is a simple wrapper around HTTP'
14
13
  spec.homepage = 'https://github.com/skylarsch/namira'
15
14
  spec.license = 'MIT'
16
15
 
17
- # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
18
- # delete this section to allow pushing this gem to any host.
19
- if spec.respond_to?(:metadata)
20
- spec.metadata['allowed_push_host'] = 'https://rubygems.org'
21
- else
22
- raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
23
- end
24
-
25
16
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
17
  spec.bindir = 'exe'
27
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
19
  spec.require_paths = ['lib']
29
20
 
30
- spec.add_development_dependency 'bundler', '~> 1.15'
31
- spec.add_development_dependency 'rake', '~> 10.0'
32
- spec.add_development_dependency 'rspec', '~> 3.0'
33
- spec.add_development_dependency 'pry'
34
21
  spec.add_dependency 'http', '>= 2.0.0', '< 4.0'
22
+
23
+ spec.add_development_dependency 'bundler', '~> 1.15'
24
+ spec.add_development_dependency 'pry', '~> 0.11.3'
25
+ spec.add_development_dependency 'rake', '~> 10.0'
26
+ spec.add_development_dependency 'rspec', '~> 3.2'
27
+ spec.add_development_dependency 'simplecov', '~> 0.15'
28
+ spec.add_development_dependency 'webmock', '~> 3.3.0'
29
+ spec.add_development_dependency 'yard', '~> 0.9'
35
30
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: namira
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 1.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Skylar Schipper
@@ -10,6 +10,26 @@ bindir: exe
10
10
  cert_chain: []
11
11
  date: 2018-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: http
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '4.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 2.0.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '4.0'
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: bundler
15
35
  requirement: !ruby/object:Gem::Requirement
@@ -24,6 +44,20 @@ dependencies:
24
44
  - - "~>"
25
45
  - !ruby/object:Gem::Version
26
46
  version: '1.15'
47
+ - !ruby/object:Gem::Dependency
48
+ name: pry
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 0.11.3
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 0.11.3
27
61
  - !ruby/object:Gem::Dependency
28
62
  name: rake
29
63
  requirement: !ruby/object:Gem::Requirement
@@ -44,59 +78,69 @@ dependencies:
44
78
  requirements:
45
79
  - - "~>"
46
80
  - !ruby/object:Gem::Version
47
- version: '3.0'
81
+ version: '3.2'
48
82
  type: :development
49
83
  prerelease: false
50
84
  version_requirements: !ruby/object:Gem::Requirement
51
85
  requirements:
52
86
  - - "~>"
53
87
  - !ruby/object:Gem::Version
54
- version: '3.0'
88
+ version: '3.2'
55
89
  - !ruby/object:Gem::Dependency
56
- name: pry
90
+ name: simplecov
57
91
  requirement: !ruby/object:Gem::Requirement
58
92
  requirements:
59
- - - ">="
93
+ - - "~>"
60
94
  - !ruby/object:Gem::Version
61
- version: '0'
95
+ version: '0.15'
62
96
  type: :development
63
97
  prerelease: false
64
98
  version_requirements: !ruby/object:Gem::Requirement
65
99
  requirements:
66
- - - ">="
100
+ - - "~>"
67
101
  - !ruby/object:Gem::Version
68
- version: '0'
102
+ version: '0.15'
69
103
  - !ruby/object:Gem::Dependency
70
- name: http
104
+ name: webmock
71
105
  requirement: !ruby/object:Gem::Requirement
72
106
  requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: 2.0.0
76
- - - "<"
107
+ - - "~>"
77
108
  - !ruby/object:Gem::Version
78
- version: '4.0'
79
- type: :runtime
109
+ version: 3.3.0
110
+ type: :development
80
111
  prerelease: false
81
112
  version_requirements: !ruby/object:Gem::Requirement
82
113
  requirements:
83
- - - ">="
114
+ - - "~>"
84
115
  - !ruby/object:Gem::Version
85
- version: 2.0.0
86
- - - "<"
116
+ version: 3.3.0
117
+ - !ruby/object:Gem::Dependency
118
+ name: yard
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
87
122
  - !ruby/object:Gem::Version
88
- version: '4.0'
123
+ version: '0.9'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '0.9'
89
131
  description: This is a simple wrapper around HTTP
90
132
  email:
91
- - ss@schipp.co
133
+ - me@skylarsch.com
92
134
  executables: []
93
135
  extensions: []
94
136
  extra_rdoc_files: []
95
137
  files:
138
+ - ".circleci/config.yml"
96
139
  - ".gitignore"
97
140
  - ".rspec"
98
141
  - ".rubocop.yml"
99
142
  - ".travis.yml"
143
+ - CHANGELOG.md
100
144
  - Gemfile
101
145
  - LICENSE.txt
102
146
  - README.md
@@ -110,12 +154,11 @@ files:
110
154
  - lib/namira/backend.rb
111
155
  - lib/namira/config.rb
112
156
  - lib/namira/errors.rb
113
- - lib/namira/errors/base.rb
157
+ - lib/namira/errors/base_error.rb
114
158
  - lib/namira/errors/http_error.rb
159
+ - lib/namira/errors/invalid_uri_error.rb
115
160
  - lib/namira/errors/redirect_error.rb
116
- - lib/namira/errors/timeout.rb
117
- - lib/namira/errors/too_many_redirects.rb
118
- - lib/namira/extensions/hash_key_path.rb
161
+ - lib/namira/errors/timeout_error.rb
119
162
  - lib/namira/query_builder.rb
120
163
  - lib/namira/request.rb
121
164
  - lib/namira/response.rb
@@ -124,8 +167,7 @@ files:
124
167
  homepage: https://github.com/skylarsch/namira
125
168
  licenses:
126
169
  - MIT
127
- metadata:
128
- allowed_push_host: https://rubygems.org
170
+ metadata: {}
129
171
  post_install_message:
130
172
  rdoc_options: []
131
173
  require_paths:
@@ -137,9 +179,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
137
179
  version: '0'
138
180
  required_rubygems_version: !ruby/object:Gem::Requirement
139
181
  requirements:
140
- - - ">="
182
+ - - ">"
141
183
  - !ruby/object:Gem::Version
142
- version: '0'
184
+ version: 1.3.1
143
185
  requirements: []
144
186
  rubyforge_project:
145
187
  rubygems_version: 2.6.13
@@ -1,6 +0,0 @@
1
- module Namira
2
- module Errors
3
- class Base < StandardError
4
- end
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- module Namira
2
- module Errors
3
- class Timeout < Base
4
- end
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- module Namira
2
- module Errors
3
- class TooManyRedirects < Base
4
- end
5
- end
6
- end
@@ -1,21 +0,0 @@
1
- module Namira
2
- module Extensions
3
- module HashKeyPath
4
- def value_for_key_path(path)
5
- components = path.split('.')
6
- value = self
7
- components.each do |key|
8
- break if value.nil?
9
-
10
- value = case value
11
- when Hash
12
- value[key] || value[key.to_sym]
13
- when Array
14
- value[key.to_i]
15
- end
16
- end
17
- value
18
- end
19
- end
20
- end
21
- end