namira 0.2.1 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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