coppertone 0.0.11 → 0.0.12

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
  SHA256:
3
- metadata.gz: a8802307a322cafa013376ddb5f67bfd134996b4f51b9753f04c4c024158c6f5
4
- data.tar.gz: 4a426ab5a166b4e896417bd004f2ea597d77074929f389f7f152698b65258c64
3
+ metadata.gz: 3752897202805df2380313ece71a3fda42830bc636b29f6c48c92a3d4b4e91d6
4
+ data.tar.gz: 76cf7084e4f25c8198c9f534a66eb9cbf6584df5b3004aa4d07317aabd89fd99
5
5
  SHA512:
6
- metadata.gz: 260ff1c6805f0f74cc9c8939b66b99ab903f83f548b22e3a05a8ed4fec45867549e4d8b01ea66b06fdf17096f1e08fb094c292070209684c5531ad9e481d37c4
7
- data.tar.gz: c4753800b5357e24aed9a964d00ea0f7ae5a91056407edd38b325a5b6dee1c0fdc33edfa5c79644b6dee00b4104cca2497d7933fd18e89eabc21216888281308
6
+ metadata.gz: 1d9b2a1e83a88e89c6226183ecf64db0cbe7206049dd34c922cbb707add141277c0b69edcffafb46100122a348fbecbe0a4ca339108882c389781514314ea324
7
+ data.tar.gz: 71c1abefd7b43713bc00933d9448d3746da5d52d15552ffa9a18918fbb4ec1afbd105a0b0738a412f42d7df05208ab01badedc8fa3d3ae52bb83546af2045981
data/.circleci/config.yml CHANGED
@@ -1,10 +1,7 @@
1
1
  version: 2
2
2
  aliases:
3
3
  - &current_ruby_image
4
- circleci/ruby:2.5.1
5
-
6
- - &previous_ruby_image
7
- circleci/ruby:2.4.4
4
+ circleci/ruby:2.7.2
8
5
 
9
6
  - &defaults
10
7
  working_directory: ~/repo
@@ -72,12 +69,6 @@ jobs:
72
69
  - *step_store_test_artifacts
73
70
  - *step_store_coverage_artifacts
74
71
 
75
- previous_ruby-job:
76
- working_directory: ~/repo
77
- docker:
78
- - image: *previous_ruby_image
79
- steps: *test_run_steps
80
-
81
72
  workflows:
82
73
  version: 2
83
74
  build-test_current-ruby:
@@ -86,6 +77,3 @@ workflows:
86
77
  - code-quality-job:
87
78
  requires:
88
79
  - current_ruby-job # let primary job fetch all dependencies first
89
- build-test_previous-ruby:
90
- jobs:
91
- - previous_ruby-job
@@ -0,0 +1,7 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ open-pull-requests-limit: 99
data/.rubocop.yml CHANGED
@@ -1,32 +1,61 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.5
2
+ NewCops: enable
3
+ TargetRubyVersion: 2.7
3
4
 
5
+ Layout/EmptyLinesAroundAttributeAccessor:
6
+ Enabled: true
7
+ Layout/LineLength:
8
+ Enabled: false
9
+ Layout/SpaceAroundMethodCallOperator:
10
+ Enabled: true
11
+ Lint/DeprecatedOpenSSLConstant:
12
+ Enabled: true
13
+ Lint/EmptyBlock:
14
+ Enabled: false
15
+ Lint/MixedRegexpCaptureTypes:
16
+ Enabled: true
17
+ Lint/RaiseException:
18
+ Enabled: true
19
+ Lint/StructNewOverride:
20
+ Enabled: true
21
+ Lint/UriEscapeUnescape:
22
+ Enabled: false
4
23
  Metrics/AbcSize:
5
24
  Exclude:
6
25
  - 'Rakefile'
7
26
  Metrics/BlockLength:
8
27
  Exclude:
9
28
  - 'spec/**/*'
10
- Metrics/LineLength:
11
- Enabled: false
12
29
  Metrics/MethodLength:
13
30
  Exclude:
14
31
  - 'Rakefile'
15
- Style/Documentation:
32
+ Naming/FileName:
33
+ Exclude:
34
+ - 'spec/open_spf/**/*'
35
+ Naming/MethodParameterName:
16
36
  Enabled: false
17
- Rails/HttpPositionalArguments:
37
+ Style/Documentation:
18
38
  Enabled: false
39
+ Style/ExponentialNotation:
40
+ Enabled: true
19
41
  Style/FrozenStringLiteralComment:
20
42
  Enabled: false
21
- Naming/FileName:
22
- Exclude:
23
- - 'spec/open_spf/**/*'
24
43
  Style/FormatStringToken:
25
44
  Enabled: false
45
+ Style/HashEachMethods:
46
+ Enabled: true
47
+ Style/HashTransformKeys:
48
+ Enabled: true
49
+ Style/HashTransformValues:
50
+ Enabled: true
51
+ Style/RedundantFetchBlock:
52
+ Enabled: true
53
+ Style/RedundantRegexpCharacterClass:
54
+ Enabled: true
55
+ Style/RedundantRegexpEscape:
56
+ Enabled: true
57
+ Style/SlicingWithRange:
58
+ Enabled: true
26
59
  Style/SymbolArray:
27
60
  Exclude:
28
61
  - 'spec/open_spf/**/*'
29
- Naming/UncommunicativeMethodParamName:
30
- Enabled: false
31
- Lint/UriEscapeUnescape:
32
- Enabled: false
data/Gemfile CHANGED
@@ -6,6 +6,8 @@ gemspec
6
6
  group :development, :test do
7
7
  gem 'brakeman', require: false
8
8
  gem 'rubocop', require: false
9
+ gem 'rubocop-rake', require: false
10
+ gem 'rubocop-rspec', require: false
9
11
  end
10
12
 
11
13
  group :test do
data/Rakefile CHANGED
@@ -23,15 +23,16 @@ desc 'Parse OpenSPF tests'
23
23
 
24
24
  def spec_file_name(doc, output_path)
25
25
  description = doc['description']
26
- file_name = description.gsub(/[^\w\s_-]+/, '')
27
- .gsub(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2')
28
- .gsub(/\s+/, '_') + '_spec.rb'
26
+ file_prefix = description.gsub(/[^\w\s_-]+/, '')
27
+ .gsub(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2')
28
+ .gsub(/\s+/, '_')
29
+ file_name = "#{file_prefix}_spec.rb"
29
30
  File.join(output_path, file_name)
30
31
  end
31
32
 
32
33
  INDENT_STRING = ' '.freeze
33
34
  def indented_string(num_indents = 1)
34
- Array.new(num_indents) { INDENT_STRING }.join('')
35
+ Array.new(num_indents) { INDENT_STRING }.join
35
36
  end
36
37
 
37
38
  def puts_prefixed_string(f, s, indent = 0)
@@ -89,7 +90,7 @@ def write_result(f, host, mailfrom, helo, indent)
89
90
  end
90
91
 
91
92
  def write_expects(f, results, explanation, indent)
92
- results_array = "[#{results.map { |r| ':' + r } .join(',')}]"
93
+ results_array = "[#{results.map { |r| ":#{r}" }.join(',')}]"
93
94
  code_expect = "expect(#{results_array}).to include(result.code)"
94
95
  puts_prefixed_string(f, code_expect, indent)
95
96
  return unless explanation
data/coppertone.gemspec CHANGED
@@ -15,6 +15,7 @@ Gem::Specification.new do |spec|
15
15
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
16
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
17
  spec.require_paths = ['lib']
18
+ spec.required_ruby_version = '>= 2.7'
18
19
 
19
20
  spec.add_runtime_dependency 'activesupport', '>= 3.0'
20
21
  spec.add_runtime_dependency 'addressable'
@@ -22,6 +23,6 @@ Gem::Specification.new do |spec|
22
23
  spec.add_runtime_dependency 'i18n'
23
24
  spec.add_development_dependency 'bundler'
24
25
  spec.add_development_dependency 'flay'
25
- spec.add_development_dependency 'rake', '~> 12.3'
26
+ spec.add_development_dependency 'rake', '~> 13.0'
26
27
  spec.add_development_dependency 'rspec', '>= 3.0'
27
28
  end
@@ -7,6 +7,7 @@ module Coppertone
7
7
  # SPF specification (see section 4.6.1).
8
8
  class Directive
9
9
  attr_reader :qualifier, :mechanism
10
+
10
11
  delegate :context_dependent?, :dns_lookup_term?,
11
12
  :includes_ptr?, to: :mechanism
12
13
 
@@ -38,7 +39,7 @@ module Coppertone
38
39
  qualifier.default? ? mechanism_s : "#{qualifier}#{mechanism_s}"
39
40
  end
40
41
 
41
- DIRECTIVE_REGEXP = /\A([\+\-\~\?]?)([a-zA-Z0-9]*)((:?)\S*)\z/.freeze
42
+ DIRECTIVE_REGEXP = /\A([+\-~?]?)([a-zA-Z0-9]*)((:?)\S*)\z/.freeze
42
43
  def self.matching_term(text)
43
44
  return nil if text.include?('=')
44
45
 
@@ -4,11 +4,13 @@ module Coppertone
4
4
 
5
5
  # Error classes mapping to the SPF result codes
6
6
  class TemperrorError < Coppertone::Error; end
7
+
7
8
  class PermerrorError < Coppertone::Error; end
8
9
 
9
10
  # Errors occurring when the string representation of a MacroString
10
11
  # or DomainSpec does not obey the syntax requirements.
11
12
  class MacroStringParsingError < Coppertone::PermerrorError; end
13
+
12
14
  class DomainSpecParsingError < MacroStringParsingError; end
13
15
 
14
16
  # Occurs when an SPF record cannot be parsed.
@@ -42,8 +44,11 @@ module Coppertone
42
44
 
43
45
  # Errors generated when certain spec-defined limits are exceeded.
44
46
  class LimitExceededError < Coppertone::PermerrorError; end
47
+
45
48
  class TermLimitExceededError < PermerrorError; end
49
+
46
50
  class VoidLimitExceededError < PermerrorError; end
51
+
47
52
  class MXLimitExceededError < PermerrorError; end
48
53
 
49
54
  # Raised when context is required to evaluate a value, but
@@ -10,6 +10,7 @@ module Coppertone
10
10
  # will fail if passed an address with a non-trivial network prefix
11
11
  class IPAddressWrapper
12
12
  attr_reader :string_representation, :ip
13
+
13
14
  def initialize(s)
14
15
  @ip = self.class.parse(s)
15
16
  raise ArgumentError unless @ip
@@ -7,7 +7,7 @@ module Coppertone
7
7
  # A context used to evaluate MacroStrings. Responds to all of the
8
8
  # macro letter directives except 'p'.
9
9
  class MacroContext
10
- attr_reader :domain, :ip_address_wrapper, :sender_identity, :helo_domain
10
+ attr_reader :domain, :ip_address_wrapper, :sender_identity, :helo_domain, :hostname
11
11
 
12
12
  delegate :s, :l, :o, to: :sender_identity
13
13
  alias d domain
@@ -16,7 +16,6 @@ module Coppertone
16
16
  to: :ip_address_wrapper
17
17
  alias h helo_domain
18
18
 
19
- attr_reader :hostname
20
19
  def initialize(domain, ip_as_s, sender, helo_domain = 'unknown',
21
20
  options = {})
22
21
  @ip_address_wrapper = IPAddressWrapper.new(ip_as_s)
@@ -37,10 +36,18 @@ module Coppertone
37
36
  end
38
37
 
39
38
  RESERVED_REGEXP = Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")
39
+
40
+ def escape(string)
41
+ encoding = string.encoding
42
+ string.b.gsub(RESERVED_REGEXP) do |m|
43
+ "%#{m.unpack('H2' * m.bytesize).join('%').upcase}"
44
+ end.force_encoding(encoding)
45
+ end
46
+
40
47
  %w[s l o d i v h c r t].each do |m|
41
48
  define_method(m.upcase) do
42
49
  unencoded = send(m)
43
- unencoded ? ::URI.escape(unencoded, RESERVED_REGEXP) : nil
50
+ unencoded ? escape(unencoded) : nil
44
51
  end
45
52
  end
46
53
 
@@ -9,6 +9,7 @@ module Coppertone
9
9
  # context for interpolation.
10
10
  class MacroString
11
11
  attr_reader :macro_text
12
+
12
13
  def initialize(macro_text)
13
14
  @macro_text = macro_text
14
15
  macros
@@ -19,11 +20,11 @@ module Coppertone
19
20
  end
20
21
 
21
22
  def expand(context, request = nil)
22
- macros.map { |m| m.expand(context, request) }.join('')
23
+ macros.map { |m| m.expand(context, request) }.join
23
24
  end
24
25
 
25
26
  def to_s
26
- macros.map(&:to_s).join('')
27
+ macros.map(&:to_s).join
27
28
  end
28
29
 
29
30
  def context_dependent?
@@ -9,6 +9,7 @@ module Coppertone
9
9
  # in the context of a particular SPF check.
10
10
  class MacroParser
11
11
  attr_reader :macros
12
+
12
13
  def initialize(s)
13
14
  @s = s.dup
14
15
  @macros = []
@@ -37,7 +38,7 @@ module Coppertone
37
38
 
38
39
  interpolated_body = @s[2, closing_index - 2]
39
40
  @macros << MacroExpand.new(interpolated_body)
40
- @s = @s[(closing_index + 1)..-1]
41
+ @s = @s[(closing_index + 1)..]
41
42
  end
42
43
 
43
44
  SIMPLE_MACRO_LETTERS = %w[% _ -].freeze
@@ -47,7 +48,7 @@ module Coppertone
47
48
  macro_code = @s[0, 2]
48
49
  if MacroStaticExpand.exists_for?(macro_code)
49
50
  @macros << MacroStaticExpand.macro_for(macro_code)
50
- @s = @s[2..-1]
51
+ @s = @s[2..]
51
52
  else
52
53
  parse_contextual_interpolated_macro
53
54
  end
@@ -57,7 +58,7 @@ module Coppertone
57
58
  new_idx = @s.index('%')
58
59
  new_idx ||= @s.length
59
60
  @macros << MacroLiteral.new(@s[0, new_idx])
60
- @s = @s[new_idx..-1]
61
+ @s = @s[new_idx..]
61
62
  new_idx
62
63
  end
63
64
  end
@@ -27,6 +27,7 @@ module Coppertone
27
27
  end
28
28
 
29
29
  attr_reader :arguments
30
+
30
31
  def initialize(arguments)
31
32
  @arguments = arguments
32
33
  end
@@ -15,7 +15,7 @@ module Coppertone
15
15
  def trim_domain_spec(raw_domain_spec)
16
16
  return nil if raw_domain_spec.blank?
17
17
 
18
- raw_domain_spec[1..-1]
18
+ raw_domain_spec[1..]
19
19
  end
20
20
 
21
21
  def self.dns_lookup_term?
@@ -19,6 +19,7 @@ module Coppertone
19
19
  end
20
20
 
21
21
  attr_reader :record
22
+
22
23
  def initialize(record)
23
24
  @record = record
24
25
  end
@@ -3,6 +3,7 @@ module Coppertone
3
3
  # Implements the ip4 mechanism.
4
4
  class IPMechanism < Mechanism
5
5
  attr_reader :netblock, :cidr_length
6
+
6
7
  def self.create(attributes)
7
8
  new(attributes)
8
9
  end
@@ -10,13 +11,13 @@ module Coppertone
10
11
  def initialize(attributes)
11
12
  super(attributes)
12
13
  unless attributes.blank?
13
- attributes = attributes[1..-1] if attributes[0] == ':'
14
+ attributes = attributes[1..] if attributes[0] == ':'
14
15
  @netblock, @cidr_length = parse_netblock(attributes)
15
16
  end
16
17
  raise Coppertone::InvalidMechanismError if @netblock.nil?
17
18
  end
18
19
 
19
- LEADING_ZEROES_IN_CIDR_REGEXP = %r{\/0\d}.freeze
20
+ LEADING_ZEROES_IN_CIDR_REGEXP = %r{/0\d}.freeze
20
21
  def validate_no_leading_zeroes_in_cidr(ip_as_s)
21
22
  return unless LEADING_ZEROES_IN_CIDR_REGEXP.match?(ip_as_s)
22
23
 
@@ -14,7 +14,7 @@ module Coppertone
14
14
  class_builder.register(klass.label, klass)
15
15
  end
16
16
 
17
- MODIFIER_REGEXP = /\A([a-zA-Z]+[a-zA-Z0-9\-\_\.]*)=(\S*)\z/.freeze
17
+ MODIFIER_REGEXP = /\A([a-zA-Z]+[a-zA-Z0-9\-_.]*)=(\S*)\z/.freeze
18
18
  def self.matching_term(text)
19
19
  matches = MODIFIER_REGEXP.match(text)
20
20
  return nil unless matches
@@ -29,6 +29,7 @@ module Coppertone
29
29
  end
30
30
 
31
31
  attr_reader :arguments
32
+
32
33
  def initialize(arguments)
33
34
  @arguments = arguments
34
35
  end
@@ -3,6 +3,7 @@ module Coppertone
3
3
  # Base class including logic common to modifiers
4
4
  class Base < Modifier
5
5
  attr_reader :domain_spec
6
+
6
7
  def initialize(attributes)
7
8
  super(attributes)
8
9
  raise InvalidModifierError if attributes.blank?
@@ -4,6 +4,7 @@ module Coppertone
4
4
  # defined by the SPF spec
5
5
  class Unknown < Modifier
6
6
  attr_reader :label
7
+
7
8
  def initialize(label, attributes)
8
9
  super(attributes)
9
10
  @label = label
@@ -22,6 +22,7 @@ module Coppertone
22
22
  end
23
23
 
24
24
  attr_reader :text, :result_code
25
+
25
26
  def initialize(text, result_code)
26
27
  @text = text
27
28
  @result_code = result_code
@@ -3,6 +3,7 @@ module Coppertone
3
3
  # record from a text string.
4
4
  class Record
5
5
  attr_reader :text
6
+
6
7
  def initialize(raw_text)
7
8
  @terms = Coppertone::RecordTermParser.new(raw_text).terms
8
9
  normalize_terms
@@ -2,6 +2,7 @@ module Coppertone
2
2
  # A helper class for finding SPF records for a domain.
3
3
  class RecordEvaluator
4
4
  attr_reader :record
5
+
5
6
  def initialize(record)
6
7
  @record = record
7
8
  end
@@ -2,6 +2,7 @@ module Coppertone
2
2
  # A helper class for finding SPF records for a domain.
3
3
  class RecordFinder
4
4
  attr_reader :dns_client, :domain
5
+
5
6
  def initialize(dns_client, domain)
6
7
  @dns_client = dns_client
7
8
  @domain = domain
@@ -12,9 +13,7 @@ module Coppertone
12
13
  begin
13
14
  validate_txt_records
14
15
  spf_dns_record = txt_records.first
15
- return nil unless spf_dns_record
16
-
17
- Record.new(spf_dns_record)
16
+ spf_dns_record ? Record.new(spf_dns_record) : nil
18
17
  end
19
18
  end
20
19
 
@@ -7,11 +7,13 @@ module Coppertone
7
7
 
8
8
  def self.record?(text)
9
9
  return false if text.blank?
10
+ return true if RECORD_REGEXP.match?(text.strip)
10
11
 
11
- RECORD_REGEXP.match?(text.strip) ? true : false
12
+ false
12
13
  end
13
14
 
14
15
  attr_reader :text, :terms
16
+
15
17
  def initialize(text)
16
18
  raise RecordParsingError unless self.class.record?(text)
17
19
  raise RecordParsingError unless ALLOWED_CHARACTERS.match?(text)
@@ -21,7 +23,7 @@ module Coppertone
21
23
  end
22
24
 
23
25
  def terms_segment
24
- text[VERSION_STR.length..-1].strip
26
+ text[VERSION_STR.length..].strip
25
27
  end
26
28
  end
27
29
  end
@@ -2,6 +2,7 @@ module Coppertone
2
2
  # A helper class for finding SPF records for a redirect modifier.
3
3
  class RedirectRecordFinder
4
4
  attr_reader :redirect, :macro_context, :request_context
5
+
5
6
  def initialize(redirect, macro_context, request_context)
6
7
  @redirect = redirect
7
8
  @macro_context = macro_context
@@ -1,8 +1,8 @@
1
1
  module Coppertone
2
2
  # Represents an SPF request.
3
3
  class Request
4
- attr_reader :ip_as_s, :sender, :helo_domain, :options, :result
5
- attr_reader :helo_result, :mailfrom_result
4
+ attr_reader :ip_as_s, :sender, :helo_domain, :options, :result, :helo_result, :mailfrom_result
5
+
6
6
  def initialize(ip_as_s, sender, helo_domain, options = {})
7
7
  @ip_as_s = ip_as_s
8
8
  @sender = sender
@@ -74,9 +74,7 @@ module Coppertone
74
74
  def check_spf_for_context(macro_context, identity)
75
75
  record = spf_record(macro_context)
76
76
  @result = spf_request(macro_context, record, identity) if record
77
- rescue DNSAdapter::Error => e
78
- Result.temperror(e.message)
79
- rescue Coppertone::TemperrorError => e
77
+ rescue DNSAdapter::Error, Coppertone::TemperrorError => e
80
78
  Result.temperror(e.message)
81
79
  rescue Coppertone::PermerrorError => e
82
80
  Result.permerror(e.message)
@@ -3,6 +3,7 @@ module Coppertone
3
3
  # used to track and limit the number of DNS queries of various types.
4
4
  class RequestCountLimiter
5
5
  attr_accessor :count, :limit, :counter_description
6
+
6
7
  def initialize(limit = nil, counter_description = nil)
7
8
  self.limit = limit
8
9
  self.counter_description = counter_description
@@ -16,6 +16,7 @@ module Coppertone
16
16
 
17
17
  attr_reader :code, :mechanism
18
18
  attr_accessor :explanation, :problem, :identity
19
+
19
20
  def initialize(code, mechanism = nil)
20
21
  @code = code
21
22
  @mechanism = mechanism
@@ -7,6 +7,7 @@ module Coppertone
7
7
  EMAIL_ADDRESS_SPLIT_REGEXP = /^(.*)@(.*?)$/.freeze
8
8
 
9
9
  attr_reader :sender, :localpart, :domain
10
+
10
11
  def initialize(sender)
11
12
  @sender = sender
12
13
  initialize_localpart_and_domain
@@ -2,6 +2,7 @@ module Coppertone
2
2
  # Parses a un-prefixed string into terms
3
3
  class TermsParser
4
4
  attr_reader :text
5
+
5
6
  def initialize(text)
6
7
  @text = text
7
8
  end
@@ -42,7 +42,7 @@ module Coppertone
42
42
 
43
43
  NO_DASH_NONNUMERIC_REGEXP = /\A[a-zA-Z0-9]*[a-zA-Z]+[a-zA-Z0-9]*\z/.freeze
44
44
  NO_DASH_REGEXP = /\A[a-zA-Z0-9]+\z/.freeze
45
- DASH_REGEXP = /\A[a-zA-Z0-9]+\-[a-zA-Z0-9\-]*[a-zA-Z0-9]+\z/.freeze
45
+ DASH_REGEXP = /\A[a-zA-Z0-9]+-[a-zA-Z0-9\-]*[a-zA-Z0-9]+\z/.freeze
46
46
 
47
47
  def self.valid_hostname_label?(l)
48
48
  return false unless valid_label?(l)
@@ -4,7 +4,8 @@ module Coppertone
4
4
  # section 5.5 of the RFC.
5
5
  class ValidatedDomainFinder
6
6
  attr_reader :subdomain_only
7
- def initialize(macro_context, request_context, subdomain_only = true)
7
+
8
+ def initialize(macro_context, request_context, subdomain_only = true) # rubocop:disable Style/OptionalBooleanParameter
8
9
  @mc = macro_context
9
10
  @request_context = request_context
10
11
  @subdomain_only = subdomain_only
@@ -1,3 +1,3 @@
1
1
  module Coppertone
2
- VERSION = '0.0.11'.freeze
2
+ VERSION = '0.0.12'.freeze
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -16,4 +16,4 @@ SimpleCov.start
16
16
  require 'coppertone'
17
17
 
18
18
  # Support files
19
- Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
19
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].sort.each { |f| require f }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coppertone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter M. Goldstein
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-31 00:00:00.000000000 Z
11
+ date: 2021-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '12.3'
103
+ version: '13.0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '12.3'
110
+ version: '13.0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rspec
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -133,6 +133,7 @@ extra_rdoc_files: []
133
133
  files:
134
134
  - ".circleci/config.yml"
135
135
  - ".codeclimate.yml"
136
+ - ".github/dependabot.yml"
136
137
  - ".gitignore"
137
138
  - ".rubocop.yml"
138
139
  - ".travis.yml"
@@ -253,7 +254,7 @@ homepage: https://github.com/ValiMail/coppertone
253
254
  licenses:
254
255
  - MIT
255
256
  metadata: {}
256
- post_install_message:
257
+ post_install_message:
257
258
  rdoc_options: []
258
259
  require_paths:
259
260
  - lib
@@ -261,15 +262,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
261
262
  requirements:
262
263
  - - ">="
263
264
  - !ruby/object:Gem::Version
264
- version: '0'
265
+ version: '2.7'
265
266
  required_rubygems_version: !ruby/object:Gem::Requirement
266
267
  requirements:
267
268
  - - ">="
268
269
  - !ruby/object:Gem::Version
269
270
  version: '0'
270
271
  requirements: []
271
- rubygems_version: 3.0.4
272
- signing_key:
272
+ rubygems_version: 3.2.8
273
+ signing_key:
273
274
  specification_version: 4
274
275
  summary: A Sender Policy Framework (SPF) toolkit
275
276
  test_files: