zerobounce 0.0.6 → 0.2.2

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
- SHA1:
3
- metadata.gz: 5ef1325579afd30cbb3769cfbfe204c057fa7f12
4
- data.tar.gz: 425716b0fc5f8af222625c4b9761745363d6fac8
2
+ SHA256:
3
+ metadata.gz: 9317c9c0d5ce41ca5c3d27d9d71706383b9687d65b58eed217a786e1c4d1ab9a
4
+ data.tar.gz: 9924d6348aec8c24c470384569f183bc107746ac16d67c699b455c68e70b4b3c
5
5
  SHA512:
6
- metadata.gz: 9cdf22f0b5d461eb37247ba3ab8facdbd73edea58381a54d3f9f85e5bc960dcab76f88549f9452b1d69af23c43e8847ece85e9ec405d8538a8ce7602e71367b5
7
- data.tar.gz: 0674c6bdd1e4b52ccd492315c59faf5006c7c1a29534082c6300ee064c292c3aeffc4b12ad248f471c955cc9ea281c610de2e767a43a9cc8e9d976586cb68cd4
6
+ metadata.gz: 6fa9a4f46f860bb9352e71ed50017cf6df96426a52d44b1f2c3ebdfa9f467a74b353bcbcd6ced03e19264034d141272f438763f2e8c0f098c901cf7cafed5532
7
+ data.tar.gz: eb17307f8b3bd194abfac75e20fa18c56856d3c421f4a98e294ba98114dcf80edf652d849b6cb56a39238f0a08ba02ac6866d4619286ab16ee157ac3bc41d4d2
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: Bug report
3
+ about: Create a report to help us improve
4
+ title: ''
5
+ labels: bug
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Describe the bug**
11
+ A clear and concise description of what the bug is.
12
+
13
+ **To Reproduce**
14
+ Steps to reproduce the behavior:
15
+ 1. Go to '...'
16
+ 2. Click on '....'
17
+ 3. Scroll down to '....'
18
+ 4. See error
19
+
20
+ **Expected behavior**
21
+ A clear and concise description of what you expected to happen.
22
+
23
+ **Screenshots**
24
+ If applicable, add screenshots to help explain your problem.
25
+
26
+ **Additional context**
27
+ Add any other context about the problem here.
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea for this project
4
+ title: ''
5
+ labels: enhancement
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Is your feature request related to a problem? Please describe.**
11
+ A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
+
13
+ **Describe the solution you'd like**
14
+ A clear and concise description of what you want to happen.
15
+
16
+ **Describe alternatives you've considered**
17
+ A clear and concise description of any alternative solutions or features you've considered.
18
+
19
+ **Additional context**
20
+ Add any other context or screenshots about the feature request here.
@@ -0,0 +1,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: weekly
7
+ time: "10:00"
8
+ open-pull-requests-limit: 10
9
+ reviewers:
10
+ - afrase
@@ -0,0 +1,22 @@
1
+ <!--- Provide a general summary of your changes in the Title above -->
2
+
3
+ ## Description
4
+ <!--- Describe your changes in detail -->
5
+
6
+ ## Related Issue
7
+ <!--- This project only accepts pull requests related to open issues -->
8
+ <!--- If suggesting a new feature or change, please discuss it in an issue first -->
9
+ <!--- If fixing a bug, there should be an issue describing it with steps to reproduce -->
10
+ <!--- Please link to the issue here: -->
11
+
12
+ ## Motivation and Context
13
+ <!--- Why is this change required? What problem does it solve? -->
14
+
15
+ ## Checklist:
16
+ <!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
17
+ <!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
18
+ - [ ] My code follows the code style of this project.
19
+ - [ ] My change requires a change to the documentation.
20
+ - [ ] I have updated the documentation accordingly.
21
+ - [ ] I have added tests to cover my changes.
22
+ - [ ] All new and existing tests passed.
@@ -0,0 +1,44 @@
1
+ name: Ruby Gem
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - v*
7
+
8
+ jobs:
9
+ build:
10
+ name: Build + Publish
11
+ runs-on: ubuntu-latest
12
+ permissions:
13
+ contents: read
14
+ packages: write
15
+
16
+ steps:
17
+ - uses: actions/checkout@v2
18
+ - name: Set up Ruby 2.6
19
+ uses: actions/setup-ruby@v1
20
+ with:
21
+ ruby-version: 2.6.x
22
+
23
+ - name: Publish to GPR
24
+ run: |
25
+ mkdir -p $HOME/.gem
26
+ touch $HOME/.gem/credentials
27
+ chmod 0600 $HOME/.gem/credentials
28
+ printf -- "---\n:github: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
29
+ gem build *.gemspec
30
+ gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
31
+ env:
32
+ GEM_HOST_API_KEY: "Bearer ${{secrets.GITHUB_TOKEN}}"
33
+ OWNER: ${{ github.repository_owner }}
34
+
35
+ - name: Publish to RubyGems
36
+ run: |
37
+ mkdir -p $HOME/.gem
38
+ touch $HOME/.gem/credentials
39
+ chmod 0600 $HOME/.gem/credentials
40
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
41
+ gem build *.gemspec
42
+ gem push *.gem
43
+ env:
44
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
@@ -0,0 +1,34 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+ name: Ruby
8
+
9
+ on:
10
+ push:
11
+ branches:
12
+ - master
13
+ - main
14
+ pull_request:
15
+ branches:
16
+ - master
17
+ - main
18
+
19
+ jobs:
20
+ test:
21
+ runs-on: ubuntu-latest
22
+ strategy:
23
+ matrix:
24
+ ruby-version: [ '2.5', '2.6', '2.7', '3.0' ]
25
+
26
+ steps:
27
+ - uses: actions/checkout@v2
28
+ - name: Set up Ruby
29
+ uses: ruby/setup-ruby@v1
30
+ with:
31
+ ruby-version: ${{ matrix.ruby-version }}
32
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
33
+ - name: Run tests
34
+ run: bundle exec rake
data/.gitignore CHANGED
@@ -14,3 +14,4 @@ Gemfile.lock
14
14
 
15
15
  # rspec failure tracking
16
16
  .rspec_status
17
+ .env
data/.rubocop.yml CHANGED
@@ -1,7 +1,8 @@
1
1
  require: rubocop-rspec
2
2
 
3
3
  AllCops:
4
- TargetRubyVersion: 2.4
4
+ TargetRubyVersion: 2.5
5
+ NewCops: enable
5
6
 
6
7
  Exclude:
7
8
  - 'bin/*'
@@ -16,7 +17,7 @@ Style/Documentation:
16
17
  Metrics/AbcSize:
17
18
  Max: 18
18
19
 
19
- Metrics/LineLength:
20
+ Layout/LineLength:
20
21
  Max: 120
21
22
  Exclude:
22
23
  - 'spec/**/*'
@@ -36,3 +37,6 @@ Style/SymbolArray:
36
37
 
37
38
  RSpec/NestedGroups:
38
39
  Max: 5
40
+
41
+ Style/AccessorGrouping:
42
+ EnforcedStyle: separated
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.4.3
1
+ ruby-2.7.3
data/CHANGELOG.md ADDED
@@ -0,0 +1,18 @@
1
+ # 0.2.0
2
+
3
+ * Update faraday and faraday_middleware dependency requirements.
4
+ * Update rubocop dev dependencies and fixed failures.
5
+ * Updated minimum ruby version to 2.5.
6
+
7
+ # 0.1.2
8
+
9
+ * Removed the double quote from the body check since it appears a space is added after the colon.
10
+ * Added changelog file.
11
+
12
+ # 0.1.1
13
+
14
+ * Removed safe accessor usage to work with older versions of Ruby.
15
+
16
+ # 0.1.0
17
+
18
+ * Added support for V2 of Zerobounce API.
data/CONTRIBUTING.md ADDED
@@ -0,0 +1 @@
1
+ TODO fill this out
data/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # Zerobounce
2
- [![Maintainability](https://api.codeclimate.com/v1/badges/35879ed0fe903e15175e/maintainability)](https://codeclimate.com/github/afrase/zerobounce/maintainability)
3
- [![Test Coverage](https://api.codeclimate.com/v1/badges/35879ed0fe903e15175e/test_coverage)](https://codeclimate.com/github/afrase/zerobounce/test_coverage)
4
- [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fafrase%2Fzerobounce.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fafrase%2Fzerobounce?ref=badge_shield)
2
+ [![Ruby](https://github.com/afrase/zerobounce/actions/workflows/ruby.yml/badge.svg)](https://github.com/afrase/zerobounce/actions/workflows/ruby.yml)
5
3
  [![Gem Version](https://badge.fury.io/rb/zerobounce.svg)](https://badge.fury.io/rb/zerobounce)
6
4
 
7
5
  A ruby client for Zerobounce.net API.
data/bin/console CHANGED
@@ -2,9 +2,6 @@
2
2
 
3
3
  require 'bundler/setup'
4
4
  require 'zerobounce'
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
5
  require 'pry'
6
+
10
7
  Pry.start
data/bin/setup CHANGED
@@ -4,5 +4,3 @@ IFS=$'\n\t'
4
4
  set -vx
5
5
 
6
6
  bundle install
7
-
8
- # Do any other automated setup that you need to do here
data/lib/zerobounce.rb CHANGED
@@ -43,11 +43,7 @@ module Zerobounce
43
43
  # @option params [Proc] :middleware Use different middleware for this request.
44
44
  # @return [Zerobounce::Response]
45
45
  def validate(params)
46
- if params.key?(:ipaddress) || params.key?(:ip_address)
47
- Request.new(params).validate_with_ip(params)
48
- else
49
- Request.new(params).validate(params)
50
- end
46
+ Request.new(params).validate(params)
51
47
  end
52
48
 
53
49
  # Get the number of remaining credits on the account.
@@ -24,6 +24,9 @@ module Zerobounce
24
24
  # @note If you modify the default make sure to add middleware to parse
25
25
  # the response as json and symbolize the keys.
26
26
  #
27
+ # @attr [String] api_version
28
+ # The version of the API to use.
29
+ #
27
30
  # @attr [Array<Symbol>] valid_statues
28
31
  # The statuses that are considered valid by {Response#valid?}.
29
32
  class Configuration
@@ -31,16 +34,19 @@ module Zerobounce
31
34
  attr_accessor :headers
32
35
  attr_accessor :apikey
33
36
  attr_accessor :middleware
37
+ attr_accessor :api_version
34
38
  attr_accessor :valid_statuses
35
39
 
36
40
  def initialize
37
41
  self.host = 'https://api.zerobounce.net'
38
42
  self.apikey = ENV['ZEROBOUNCE_API_KEY']
43
+ self.api_version = 'v2'
39
44
  self.valid_statuses = %i[valid catch_all]
40
45
  self.headers = { user_agent: "ZerobounceRubyGem/#{Zerobounce::VERSION}" }
41
46
 
42
47
  self.middleware = proc do |builder|
43
48
  builder.response(:json, content_type: /\bjson$/, parser_options: { symbolize_names: true })
49
+ builder.response(:logger) { |l| l.filter(/(api_?key=)(\w+)/, '\1[REMOVED]') } if ENV['ZEROBOUNCE_API_DEBUG']
44
50
  builder.use(Zerobounce::Middleware::RaiseError)
45
51
  builder.adapter(Faraday.default_adapter)
46
52
  end
@@ -7,28 +7,26 @@ module Zerobounce
7
7
  #
8
8
  # @author Aaron Frase
9
9
  class Error < StandardError
10
+ attr_reader :env
11
+
10
12
  def initialize(env={})
11
13
  @env = env
12
- end
13
-
14
- # Message for the error.
15
- #
16
- # @return [String]
17
- def message
18
- @env[:body]
14
+ super(env[:body])
19
15
  end
20
16
 
21
17
  class << self
22
18
  # Parse the response for errors.
23
19
  #
24
20
  # @param [Hash] env
25
- # @return [Error]
21
+ # @return [Error, nil]
26
22
  def from_response(env)
27
23
  case env[:status]
28
24
  when 500
29
- parse_500(env)
25
+ parse500(env)
30
26
  when 200
31
- parse_200(env)
27
+ parse200(env)
28
+ else
29
+ UnknownError.new(env)
32
30
  end
33
31
  end
34
32
 
@@ -36,8 +34,8 @@ module Zerobounce
36
34
 
37
35
  # @param [Hash] env
38
36
  # @return [Error]
39
- def parse_500(env)
40
- if env[:body]&.start_with?('Missing parameter')
37
+ def parse500(env)
38
+ if env[:body].to_s.start_with?('Missing parameter')
41
39
  MissingParameter.new(env)
42
40
  else
43
41
  InternalServerError.new(env)
@@ -46,10 +44,10 @@ module Zerobounce
46
44
 
47
45
  # @param [Hash] env
48
46
  # @return [Error, nil]
49
- def parse_200(env)
47
+ def parse200(env)
50
48
  # The body hasn't been parsed yet and to avoid potentially parsing the body twice
51
49
  # we just use String#start_with?
52
- ApiError.new(env) if env[:body]&.start_with?('{"error":"')
50
+ ApiError.new(env) if env[:body].to_s.start_with?('{"error":')
53
51
  end
54
52
  end
55
53
  end
@@ -66,6 +64,12 @@ module Zerobounce
66
64
  class MissingParameter < Error
67
65
  end
68
66
 
67
+ # When the status code isn't in the defined codes to parse.
68
+ #
69
+ # @author Aaron Frase
70
+ class UnknownError < Error
71
+ end
72
+
69
73
  # General API error, the response code was 200 but an error still occurred.
70
74
  #
71
75
  # @author Aaron Frase
@@ -14,7 +14,7 @@ module Zerobounce
14
14
  # @param [Hash] env
15
15
  # @raise [Error]
16
16
  def on_complete(env)
17
- if (error = Zerobounce::Error.from_response(env)) # rubocop:disable GuardClause
17
+ if (error = Zerobounce::Error.from_response(env)) # rubocop:disable Style/GuardClause
18
18
  raise error
19
19
  end
20
20
  end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'faraday'
4
+ require 'zerobounce/request/v1_request'
5
+ require 'zerobounce/request/v2_request'
4
6
 
5
7
  module Zerobounce
6
8
  # Sends the HTTP request.
@@ -16,46 +18,30 @@ module Zerobounce
16
18
  # @attr_reader [Proc] middleware
17
19
  # Faraday middleware used for the request.
18
20
  class Request
19
- # The normal email validation endpoint.
20
- VALIDATE_PATH = '/v1/validate'
21
- # The validation endpoint for email and IP validation.
22
- VALIDATE_WITH_IP_PATH = '/v1/validatewithip'
23
- # The path to get number number of credits remaining on the account.
24
- GET_CREDITS_PATH = '/v1/getcredits'
25
-
26
21
  attr_reader :host
27
22
  attr_reader :headers
28
23
  attr_reader :middleware
24
+ attr_reader :api_version
29
25
 
26
+ # Set instance variables and extends the correct Zerobounce::Request
27
+ #
30
28
  # @param [Hash] params
31
29
  # @option params [String] :middleware default: {Configuration#middleware} {include:#middleware}
32
30
  # @option params [String] :headers default: {Configuration#headers} {include:#headers}
33
31
  # @option params [String] :host default: {Configuration#host} {include:#host}
32
+ # @option params [String] :api_version default: {Configuration#api_version} {include:#api_version}
34
33
  def initialize(params={})
35
34
  @middleware = params[:middleware] || Zerobounce.config.middleware
36
35
  @headers = params[:headers] || Zerobounce.config.headers
37
36
  @host = params[:host] || Zerobounce.config.host
38
- end
39
-
40
- # Validate the email address.
41
- #
42
- # @param [Hash] params
43
- # @option params [String] :email
44
- # @option params [String] :apikey
45
- # @return [Zerobounce::Response]
46
- def validate(params)
47
- Response.new(get(VALIDATE_PATH, params), self)
48
- end
37
+ @api_version = params[:api_version] || Zerobounce.config.api_version
49
38
 
50
- # Validate the email address and get geoip info for the IP.
51
- #
52
- # @param [Hash] params
53
- # @option params [String] :email
54
- # @option params [String] :ip_address
55
- # @option params [String] :apikey
56
- # @return [Zerobounce::Response]
57
- def validate_with_ip(params)
58
- Response.new(get(VALIDATE_WITH_IP_PATH, params), self)
39
+ case api_version
40
+ when 'v2'
41
+ extend(V2Request)
42
+ else
43
+ extend(V1Request)
44
+ end
59
45
  end
60
46
 
61
47
  # Get the number of remaining credits on the account.
@@ -64,7 +50,7 @@ module Zerobounce
64
50
  # @option params [String] :apikey
65
51
  # @return [Integer] A value of -1 can mean the API is invalid.
66
52
  def credits(params={})
67
- get(GET_CREDITS_PATH, params).body[:Credits]&.to_i
53
+ get('getcredits', params).body[:Credits].to_i
68
54
  end
69
55
 
70
56
  private
@@ -80,15 +66,7 @@ module Zerobounce
80
66
 
81
67
  # @return [Faraday::Connection]
82
68
  def conn
83
- @conn ||= Faraday.new(host, headers: headers, &middleware)
84
- end
85
-
86
- # @param [Hash] params
87
- # @return [Hash]
88
- def get_params(params)
89
- valid_params = %i[apikey ipaddress email]
90
- params[:ipaddress] = params.delete(:ip_address) if params.key?(:ip_address) # normalize ipaddress key
91
- { apikey: Zerobounce.config.apikey }.merge(params.select { |k, _| valid_params.include?(k) })
69
+ @conn ||= Faraday.new("#{host}/#{api_version}", headers: headers, &middleware)
92
70
  end
93
71
  end
94
72
  end