minfraud 1.0.4 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +5 -5
  2. data/.github/dependabot.yml +11 -0
  3. data/.github/workflows/release.yml +28 -0
  4. data/.github/workflows/rubocop.yml +18 -0
  5. data/.github/workflows/test.yml +36 -0
  6. data/.gitignore +2 -0
  7. data/.rubocop.yml +90 -0
  8. data/CHANGELOG.md +197 -4
  9. data/CODE_OF_CONDUCT.md +4 -4
  10. data/Gemfile +2 -2
  11. data/LICENSE.txt +2 -1
  12. data/README.dev.md +4 -0
  13. data/README.md +255 -58
  14. data/Rakefile +9 -3
  15. data/bin/console +4 -3
  16. data/dev-bin/release.sh +59 -0
  17. data/lib/minfraud/assessments.rb +127 -53
  18. data/lib/minfraud/components/account.rb +31 -9
  19. data/lib/minfraud/components/addressable.rb +73 -26
  20. data/lib/minfraud/components/base.rb +26 -14
  21. data/lib/minfraud/components/billing.rb +5 -0
  22. data/lib/minfraud/components/credit_card.rb +117 -29
  23. data/lib/minfraud/components/custom_inputs.rb +25 -0
  24. data/lib/minfraud/components/device.rb +51 -10
  25. data/lib/minfraud/components/email.rb +120 -9
  26. data/lib/minfraud/components/event.rb +60 -13
  27. data/lib/minfraud/components/order.rb +59 -22
  28. data/lib/minfraud/components/payment.rb +192 -22
  29. data/lib/minfraud/components/report/transaction.rb +80 -0
  30. data/lib/minfraud/components/shipping.rb +15 -6
  31. data/lib/minfraud/components/shopping_cart.rb +19 -12
  32. data/lib/minfraud/components/shopping_cart_item.rb +42 -13
  33. data/lib/minfraud/enum.rb +22 -8
  34. data/lib/minfraud/error_handler.rb +45 -18
  35. data/lib/minfraud/errors.rb +22 -2
  36. data/lib/minfraud/http_service/response.rb +61 -17
  37. data/lib/minfraud/model/abstract.rb +20 -0
  38. data/lib/minfraud/model/address.rb +52 -0
  39. data/lib/minfraud/model/billing_address.rb +11 -0
  40. data/lib/minfraud/model/credit_card.rb +75 -0
  41. data/lib/minfraud/model/device.rb +51 -0
  42. data/lib/minfraud/model/disposition.rb +42 -0
  43. data/lib/minfraud/model/email.rb +54 -0
  44. data/lib/minfraud/model/email_domain.rb +24 -0
  45. data/lib/minfraud/model/error.rb +28 -0
  46. data/lib/minfraud/model/factors.rb +24 -0
  47. data/lib/minfraud/model/geoip2_location.rb +25 -0
  48. data/lib/minfraud/model/insights.rb +68 -0
  49. data/lib/minfraud/model/ip_address.rb +58 -0
  50. data/lib/minfraud/model/ip_risk_reason.rb +48 -0
  51. data/lib/minfraud/model/issuer.rb +49 -0
  52. data/lib/minfraud/model/score.rb +76 -0
  53. data/lib/minfraud/model/score_ip_address.rb +23 -0
  54. data/lib/minfraud/model/shipping_address.rb +30 -0
  55. data/lib/minfraud/model/subscores.rb +156 -0
  56. data/lib/minfraud/model/warning.rb +63 -0
  57. data/lib/minfraud/report.rb +66 -0
  58. data/lib/minfraud/resolver.rb +25 -16
  59. data/lib/minfraud/validates.rb +187 -0
  60. data/lib/minfraud/version.rb +4 -1
  61. data/lib/minfraud.rb +55 -16
  62. data/minfraud.gemspec +27 -18
  63. metadata +107 -36
  64. data/.travis.yml +0 -5
  65. data/lib/minfraud/http_service/request.rb +0 -37
  66. data/lib/minfraud/http_service.rb +0 -31
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 360e5c67027b7cac3bacd6715aa3afee61de8a75
4
- data.tar.gz: cb6dd240c3436fe0c0c23e7aa6d5ad5c4bcfcae8
2
+ SHA256:
3
+ metadata.gz: 14d6fda0782c4f12ecd3599b4d6f3887be93845fca267490bbc64ad6bf5e3518
4
+ data.tar.gz: 0dbcb74c203b066c41ad1d85b25e236a63c9e2904a87064bece9ce69a60eecc6
5
5
  SHA512:
6
- metadata.gz: c3cb59ad5bde816f3b2f8be3cc1f0699ce18c1728a8267d7e827b28e8fecd0a20c638211f453a0f8dee2ea7c252096193293633ca5ecf4e3a640f632e5201dfb
7
- data.tar.gz: 2b430855a1157e215891a09a1cf0aab79bad1a027e272359a536caf81db8958835e06f591393a9782b22c90655017b91475eff775208f964a4ae0ca44bb1dd43
6
+ metadata.gz: 74a6d172a649d417c89ca8a22a454407e54d70a19cea0583594165a2de23ac9df889478675fadad4becade61a84ac7fb39950ae890cd8d98c80e2dcdb6a2d38d
7
+ data.tar.gz: 7c9c52f1929869e043878b4f74c40d488fa5a44df587b63362a537b14b8f3602a4c78b51abeb18ab2404bf49ba2662b38919a5470de8270f2b53dc1ea2b80071
@@ -0,0 +1,11 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ open-pull-requests-limit: 10
8
+ - package-ecosystem: "github-actions"
9
+ directory: "/"
10
+ schedule:
11
+ interval: daily
@@ -0,0 +1,28 @@
1
+ name: Release
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ pull_request:
6
+ push:
7
+ branches:
8
+ - main
9
+ release:
10
+ types:
11
+ - published
12
+
13
+ jobs:
14
+ push:
15
+ if: github.event_name == 'release' && github.event.action == 'published'
16
+ runs-on: ubuntu-latest
17
+ environment: release
18
+ permissions:
19
+ id-token: write
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ - name: Set up Ruby
23
+ uses: ruby/setup-ruby@v1
24
+ with:
25
+ bundler-cache: true
26
+ ruby-version: ruby
27
+
28
+ - uses: rubygems/release-gem@v1
@@ -0,0 +1,18 @@
1
+ name: Run rubocop
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+ schedule:
7
+ - cron: '4 0 * * SUN'
8
+
9
+ jobs:
10
+ rubocop:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: 3.3
17
+ - run: bundle install
18
+ - run: bundle exec rake -t rubocop
@@ -0,0 +1,36 @@
1
+ name: Run tests
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+ schedule:
7
+ - cron: '4 1 * * SUN'
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ${{ matrix.os }}
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ os: [ubuntu-latest, windows-latest, macos-latest]
16
+ version:
17
+ [
18
+ 2.7,
19
+ '3.0',
20
+ 3.1,
21
+ 3.2,
22
+ 3.3,
23
+ jruby,
24
+ ]
25
+ exclude:
26
+ - os: windows-latest
27
+ version: jruby
28
+ steps:
29
+ - uses: actions/checkout@v4
30
+ with:
31
+ submodules: true
32
+ - uses: ruby/setup-ruby@v1
33
+ with:
34
+ ruby-version: ${{ matrix.version }}
35
+ - run: bundle install
36
+ - run: bundle exec rake -t spec
data/.gitignore CHANGED
@@ -1,7 +1,9 @@
1
+ /coverage
1
2
  pkg
2
3
  .project
3
4
  Gemfile.lock
4
5
  .rvmrc
5
6
  *.rbc
7
+ .yardoc
6
8
  *~
7
9
  .DS_Store
data/.rubocop.yml ADDED
@@ -0,0 +1,90 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.7
3
+ NewCops: enable
4
+
5
+ # Metrics.
6
+
7
+ Metrics/BlockLength:
8
+ Enabled: false # Default is true, but mostly hit in tests.
9
+
10
+ Metrics/AbcSize:
11
+ Enabled: false # To allow for pre-existing code.
12
+
13
+ Metrics/ClassLength:
14
+ Enabled: false # To allow for pre-existing code.
15
+
16
+ Metrics/CyclomaticComplexity:
17
+ Enabled: false # To allow for pre-existing code.
18
+
19
+ Metrics/MethodLength:
20
+ Enabled: false # To allow for pre-existing code.
21
+
22
+ Metrics/PerceivedComplexity:
23
+ Enabled: false # To allow for pre-existing code.
24
+
25
+ # Layout.
26
+
27
+ Layout/LineLength:
28
+ Max: 150 # Default is 120.
29
+
30
+ Layout/HashAlignment:
31
+ EnforcedHashRocketStyle: table # Default is key.
32
+ EnforcedColonStyle: table # Default is key.
33
+
34
+ Layout/ExtraSpacing:
35
+ ForceEqualSignAlignment: true # Default is false.
36
+
37
+ Layout/IndentationStyle:
38
+ IndentationWidth: 2 # Default is <none>.
39
+
40
+ # Style.
41
+
42
+ Style/HashSyntax:
43
+ EnforcedStyle: ruby19_no_mixed_keys # Default is ruby19. This one is better.
44
+
45
+ Style/CollectionMethods:
46
+ Enabled: true # Default is false.
47
+
48
+ Style/NumericLiterals:
49
+ MinDigits: 4 # Default is 5.
50
+
51
+ Style/NegatedIf: # I disagree with this.
52
+ Enabled: false
53
+
54
+ Style/IfUnlessModifier: # This doesn't always make sense.
55
+ Enabled: false
56
+
57
+ # Trailing commas are often good.
58
+ Style/TrailingCommaInArguments:
59
+ Enabled: false
60
+ Style/TrailingCommaInArrayLiteral:
61
+ Enabled: false
62
+ Style/TrailingCommaInHashLiteral:
63
+ Enabled: false
64
+
65
+ # Default is both which is probably fine, but it changes code and I don't want
66
+ # to investigate any possible behavior change right now.
67
+ Style/EmptyElse:
68
+ EnforcedStyle: empty
69
+
70
+ Style/ConditionalAssignment:
71
+ Enabled: false # This produces kind of strange results.
72
+
73
+ Style/GuardClause:
74
+ Enabled: false # Doesn't always make sense.
75
+
76
+ Style/FormatStringToken:
77
+ Enabled: false # Seems unnecessary.
78
+
79
+ # Seems unnecessary. Asks us to call super in a bunch of places when there's no
80
+ # need.
81
+ Lint/MissingSuper:
82
+ Enabled: false
83
+
84
+ # Naming.
85
+
86
+ Naming/VariableNumber:
87
+ Enabled: false # Doesn't always make sense.
88
+
89
+ Gemspec/DevelopmentDependencies:
90
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,14 +1,207 @@
1
- # Minfraud Changelog
1
+ # Changelog
2
2
 
3
- ## v1.0.4
3
+ ## v2.4.0 (2024-01-12)
4
+
5
+ * Ruby 2.7+ is now required. If you're using Ruby 2.5 or 2.6, please use
6
+ version 2.3.0 of this gem.
7
+ * Added the processors `:pxp_financial` and `:trustpay` to
8
+ `Minfraud::Components::Payment`.
9
+
10
+ ## v2.3.0 (2023-12-04)
11
+
12
+ * Added the processor `:shopify_payments` to `Minfraud::Components::Payment`.
13
+ * Added the processor `:google_pay` to `Minfraud::Components::Payment`.
14
+ * Added the processor `:placetopay` to `Minfraud::Components::Payment`.
15
+ * In addition to the minfraud gem version, the User-Agent now includes the
16
+ version of Ruby and the version of the HTTP client in all HTTP requests.
17
+ * Updated `maxmind-geoip2` to version that includes the `anycast?` method
18
+ on `MaxMind::GeoIP2::Record::Traits`. This returns `true` if the IP
19
+ address belongs to an [anycast
20
+ network](https://en.wikipedia.org/wiki/Anycast). This is available in
21
+ minFraud Insights and Factors.
22
+
23
+ ## v2.2.0 (2022-03-28)
24
+
25
+ * Added the input `/credit_card/country`. This is the country where the
26
+ issuer of the card is located. This may be passed instead of the
27
+ `/credit_card/issuer_id_number` if you do not wish to pass partial
28
+ account numbers or if your payment processor does not provide them. You
29
+ may provide this using the `country` attribute on
30
+ `Minfraud::Components::CreditCard`.
31
+
32
+ ## v2.1.0 (2022-01-25)
33
+
34
+ * Adds the following new processor to `Minfraud::Components::Payment`:
35
+ * `:windcave`
36
+ * The `last_4_digits` input to `Minfraud::Components::CreditCard` has been
37
+ deprecated in favor of `last_digits` and will be removed in a future
38
+ release. `last_digits`/`last_4_digits` also now supports two digit values
39
+ in addition to the previous four digit values.
40
+ * Eight digit `issuer_id_number` inputs are now supported by
41
+ `Minfraud::Components::CreditCard` in addition to the previously accepted
42
+ six digit `issuer_id_number`. In most cases, you should send the last four
43
+ digits for `last_digits`. If you send an `issuer_id_number` that contains
44
+ an eight digit IIN, and if the credit card brand is not one of the
45
+ following, you should send the last two digits for `last_digits`:
46
+ * `Discover`
47
+ * `JCB`
48
+ * `Mastercard`
49
+ * `UnionPay`
50
+ * `Visa`
51
+
52
+ ## v2.0.0 (2021-12-06)
53
+
54
+ * Breaking change from 1.x: Removed deprecated methods
55
+ `is_in_european_union`, `is_anonymous`, `is_anonymous_vpn`,
56
+ `is_hosting_provider`, `is_public_proxy`, and `is_tor_exit_node`. The
57
+ non-deprecated equivalents are `in_european_union?`, `anonymous?`,
58
+ `anonymous_vpn?`, `hosting_provider?`, `public_proxy?`, and
59
+ `tor_exit_node?`.
60
+ * Breaking change from 1.x: Removed deprecated methods for deprecated
61
+ subscores: `email_tenure` and `ip_tenure`. For `email_tenure`, please use
62
+ the `email_address` subscore instead. For `ip_tenure`, please use
63
+ `risk_score` instead.
64
+ * Breaking change from 1.x: Removed deprecated method for deprecated
65
+ attribute `ip_address.country.is_high_risk`.
66
+ * Breaking change from 1.x: Switches HTTP client from faraday to http.rb.
67
+ There should be no behavior change for most users, but this is
68
+ technically a breaking change from the perspective of semver. Most users
69
+ should not be affected as the changes are limited to attributes and
70
+ classes that would not normally be accessed outside the gem.
71
+ * Breaking change from 1.x: `user_id` is no longer supported as a way to
72
+ configure your MaxMind account ID. Use `account_id` instead.
73
+ * Breaking change from 1.x: Removed the `Minfraud.configuration` method.
74
+ * Breaking change from 1.x: Localized names are no longer exposed via
75
+ methods on `names` objects, only as hash keys. For example, use
76
+ `response.ip_address.country.names['en']` instead of
77
+ `response.ip_address.country.names.en`. The latter was deprecated.
78
+ * Adds mobile country code (MCC) and mobile network code (MNC) to minFraud
79
+ Insights and Factors responses. These are available at
80
+ `response.ip_address.traits.mobile_country_code` and
81
+ `response.ip_address.traits.mobile_network_code`. We expect this data to
82
+ be available by late January, 2022.
83
+ * Adds the following new processors to `Minfraud::Components::Payment`:
84
+ * `:boacompra`
85
+ * `:boku`
86
+ * `:coregateway`
87
+ * `:fiserv`
88
+ * `:neopay`
89
+ * `:neosurf`
90
+ * `:openbucks`
91
+ * `:paysera`
92
+ * `:payvision`
93
+ * `:trustly`
94
+ * Depend on the `maxmind-geoip2` gem. This allows us to delete classes from
95
+ that gem that we previously had included in this gem. There is no
96
+ functional difference.
97
+
98
+ ## v1.6.0 (2021-08-19)
99
+
100
+ * Adds new processor to `Minfraud::Components::Payment`: `:cardknox`,
101
+ `:creditguard`, `:credorax`, `:datacap`, `:dlocal`, `:onpay`, and
102
+ `:safecharge`.
103
+ * Adds `rule_label` to minFraud output `/disposition`.
104
+ * Adds support for the `/credit_card/was_3d_secure_successful` input. This is
105
+ available by setting the `was_3d_secure_successful` attribute on
106
+ `Minfraud::Components::CreditCard`.
107
+ * Ruby 2.5+ is now required. If you're using Ruby 2.1, 2.2, 2.3, or 2.4,
108
+ please use version 1.5.0 of this gem.
109
+
110
+ ## v1.5.0 (2021-02-02)
111
+
112
+ * Adds the `hash_address` attribute to `Minfraud::Components::Email`. If
113
+ this is `true`, the MD5 hash of the `address` will be sent instead of the
114
+ plain text `address`. Use this if you prefer to send the hash of the
115
+ `address` rather than the plain text. Note that this normalizes the
116
+ `address`, so we recommend using it as opposed to hashing the `address`
117
+ manually.
118
+ * The email `domain` input is now automatically set if the email `address`
119
+ input is set but the `domain` is not.
120
+ * Adds new payment processors `:apple_pay` and `:aps_payments` to
121
+ `Minfraud::Components::Payment`.
122
+ * Adds support for the IP address risk reasons in the minFraud Insights
123
+ and Factors responses. This is available at `.ip_address.risk_reasons`.
124
+ It is an array of `IPRiskReason` objects.
125
+
126
+ ## v1.4.1 (2020-12-01)
127
+
128
+ * Do not throw an exception if the response does not include IP address
129
+ information. Previously we would incorrectly try to retrieve fields from
130
+ `nil`, leading to a `NoMethodError`.
131
+
132
+ ## v1.4.0 (2020-10-13)
133
+
134
+ * IMPORTANT: Ruby 2.0 is no longer supported. If you're using Ruby 2.0,
135
+ please use version 1.3.0.
136
+ * Adds handling for the `REQUEST_INVALID` error code.
137
+ * The IP address is no longer a required input.
138
+ * Adds new payment processor `:tsys` to `Minfraud::Components::Payment`.
139
+
140
+ ## v1.3.0 (2020-09-25)
141
+
142
+ * Adds support for persistent HTTP connections. Connections persist
143
+ automatically.
144
+ * IMPORTANT: Ruby 1.9 is no longer supported. If you're using Ruby 1.9,
145
+ please use version 1.2.0 or older.
146
+ * Adds support for client side validation of inputs. An `InvalidInputError`
147
+ exception will be raised if an input is invalid. This can be enabled by
148
+ setting `enable_validation` to `true` when configuring `Minfraud`. It is
149
+ disabled by default.
150
+ * Adds the `residential_proxy?` method to `MaxMind::GeoIP2::Record::Traits`
151
+ for use with minFraud Insights and Factors.
152
+
153
+ ## v1.2.0 (2020-07-15)
154
+
155
+ * Adds new processor types to `Minfraud::Components::Payment`: `:cashfree`,
156
+ `:first_atlantic_commerce`, `:komoju`, `:paytm`, `:razorpay`, and
157
+ `:systempay`.
158
+ * Adds support for three new Factors outputs: `/subscores/device` (the risk
159
+ associated with the device), `/subscores/email_local_part` (the risk
160
+ associated with the part of the email address before the @ symbol) and
161
+ `/subscores/shipping_address` (the risk associated with the shipping
162
+ address).
163
+ * Adds support for providing your MaxMind account ID using the `account_id`
164
+ attribute instead of the `user_id` attribute. In a future release,
165
+ support for the `user_id` attribute will be removed.
166
+
167
+ ## v1.1.0 (2020-06-19)
168
+
169
+ * Adds support for the minFraud Report Transaction API. Reporting
170
+ transactions to MaxMind helps us detect about 10-50% more fraud and
171
+ reduce false positives for you.
172
+ * Adds support for the new credit card output `/credit_card/is_business`.
173
+ This indicates whether the card is a business card. It may be accessed
174
+ via `response.credit_credit.is_business` on the minFraud Insights and
175
+ Factors response objects.
176
+ * Adds support for the new email domain output `/email/domain/first_seen`.
177
+ This may be accessed via `response.email.domain.first_seen` on the
178
+ minFraud Insights and Factors response objects.
179
+ * Rename `ErrorHandler#inspect` to `ErrorHandler#examine` in order not to
180
+ break LSP.
181
+ * Adds classes for the Score, Insights, and Factors responses. This allows
182
+ us to provide API documentation for the various response attributes.
183
+ * Removes `hashie` as a required dependency.
184
+ * Adds new processor types to `Minfraud::Components::Payment`: `:affirm`,
185
+ `:afterpay`, `:cardpay`, `:ccavenue`, `:cetelem`, `:ct_payments`,
186
+ `:dalenys`, `:datacash`, `:dotpay`, `:ecommpay`, `:epx`, `:g2a_pay`,
187
+ `:gocardless`, `:interac`, `:klarna`, `:mercanet`, `:oney`, `:payeezy`,
188
+ `:paylike`, `:payment_express`, `:paysafecard`, `:posconnect`,
189
+ `:smartdebit`, `:synapsefi`, and others.
190
+ * Adds support for passing custom inputs to minFraud. GitHub #6.
191
+ * Adds `:email_change`, `:password_reset`, and `:payout_change` as types to
192
+ `Minfraud::Components::Event`.
193
+ * Adds support for the `session_id` and `session_age` inputs.
194
+
195
+ ## v1.0.4 (2016-12-23)
4
196
 
5
197
  * Prevents boolean value conversion to string to avoid warnings
6
198
  * Adds `amount` attribute to the `Minfraud::Components::Order` instances
7
199
 
8
- ## v1.0.3
200
+ ## v1.0.3 (2016-11-24)
201
+
9
202
  * Adds `token` attribute to the `Minfraud::Components::CreditCard` instances
10
203
  according to the MinFraud Release Notes introduced on November 17, 2016
11
204
 
12
- ## v1.0.2
205
+ ## v1.0.2 (2016-10-11)
13
206
 
14
207
  * Adds support for Ruby >= 1.9
data/CODE_OF_CONDUCT.md CHANGED
@@ -35,7 +35,7 @@ This code of conduct applies both within project spaces and in public spaces
35
35
  when an individual is representing the project or its community.
36
36
 
37
37
  Instances of abusive, harassing, or otherwise unacceptable behavior may be
38
- reported by contacting a project maintainer at kushnir.yb@gmail.com. All
38
+ reported by contacting a project maintainer at support@maxmind.com. All
39
39
  complaints will be reviewed and investigated and will result in a response that
40
40
  is deemed necessary and appropriate to the circumstances. Maintainers are
41
41
  obligated to maintain confidentiality with regard to the reporter of an
@@ -43,7 +43,7 @@ incident.
43
43
 
44
44
  This Code of Conduct is adapted from the [Contributor Covenant][homepage],
45
45
  version 1.3.0, available at
46
- [http://contributor-covenant.org/version/1/3/0/][version]
46
+ [https://contributor-covenant.org/version/1/3/0/][version]
47
47
 
48
- [homepage]: http://contributor-covenant.org
49
- [version]: http://contributor-covenant.org/version/1/3/0/
48
+ [homepage]: https://contributor-covenant.org
49
+ [version]: https://contributor-covenant.org/version/1/3/0/
data/Gemfile CHANGED
@@ -1,5 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
- # Specify your gem's dependencies in minfraud.gemspec
4
- gem 'coveralls', require: false
5
5
  gemspec
data/LICENSE.txt CHANGED
@@ -1,6 +1,7 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2016 kushnir.yb
3
+ Copyright (c) 2016-2020 kushnir.yb
4
+ Copyright (c) 2020-2024 MaxMind, Inc.
4
5
 
5
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
7
  of this software and associated documentation files (the "Software"), to deal
data/README.dev.md ADDED
@@ -0,0 +1,4 @@
1
+ # How to release
2
+
3
+ See
4
+ [here](https://github.com/maxmind/MaxMind-DB-Reader-ruby/blob/main/README.dev.md).