makeplans_sms_pricing 0.2.1
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 +7 -0
- data/.env.test +1 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +37 -0
- data/README.md +53 -0
- data/Rakefile +18 -0
- data/lib/makeplans_sms_pricing/Rakefile +4 -0
- data/lib/makeplans_sms_pricing/import.rb +22 -0
- data/lib/makeplans_sms_pricing/railtie.rb +13 -0
- data/lib/makeplans_sms_pricing/tasks/import.rake +8 -0
- data/lib/makeplans_sms_pricing/version.rb +5 -0
- data/lib/makeplans_sms_pricing.rb +96 -0
- metadata +100 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5f8803c6a1c8796be7b934c09162e2c98fb17153bae826a179ef920d08c9ce1f
|
4
|
+
data.tar.gz: 9a292fb41eb4ccbde073b30592194cdaf38089fab5cc7e261bbc876390c4fd32
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6d6bf20ed74999554ab74b74c525499fc665842b5f2303e336d1716ab91bda1440d1c5857d9c068596f282e56a8731e8f6d57a26d0a34c4a2f3ce66268ee2322
|
7
|
+
data.tar.gz: d2c0a40c93e7b2deb186727bcf568c7cf337dd396bbfbefd094cfbc64bc77e9ee479e480045611d4abba7d58f2290edb9de75e42dd7f54c1695e1b2fa6b9df31
|
data/.env.test
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
REDIS_URL=redis://localhost:6380
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
makeplans_sms_pricing (0.2.0)
|
5
|
+
connection_pool
|
6
|
+
countries
|
7
|
+
redis
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
connection_pool (2.4.1)
|
13
|
+
countries (6.0.1)
|
14
|
+
unaccent (~> 0.3)
|
15
|
+
dotenv (3.1.2)
|
16
|
+
minitest (5.25.1)
|
17
|
+
rake (13.2.1)
|
18
|
+
redis (5.2.0)
|
19
|
+
redis-client (>= 0.22.0)
|
20
|
+
redis-client (0.22.2)
|
21
|
+
connection_pool
|
22
|
+
unaccent (0.4.0)
|
23
|
+
|
24
|
+
PLATFORMS
|
25
|
+
arm64-darwin-21
|
26
|
+
arm64-darwin-22
|
27
|
+
arm64-darwin-23
|
28
|
+
x86_64-linux
|
29
|
+
|
30
|
+
DEPENDENCIES
|
31
|
+
dotenv
|
32
|
+
makeplans_sms_pricing!
|
33
|
+
minitest
|
34
|
+
rake
|
35
|
+
|
36
|
+
BUNDLED WITH
|
37
|
+
2.4.7
|
data/README.md
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# MakeplansSmsPricing
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
|
5
|
+
Add this in the Gemfile:
|
6
|
+
```ruby
|
7
|
+
gem "makeplans_sms_pricing", github: "makeplans/makeplans_sms_pricing", branch: "main"
|
8
|
+
```
|
9
|
+
|
10
|
+
Follow these [steps](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) to generate a GitHub personal access token to allow access to private repositories. Then, set it in your application environment:
|
11
|
+
|
12
|
+
´´´shell
|
13
|
+
bundle config --local github.com x-access-token:your-token
|
14
|
+
```
|
15
|
+
|
16
|
+
Fetch the dependencies:
|
17
|
+
|
18
|
+
´´´shell
|
19
|
+
bundle
|
20
|
+
```
|
21
|
+
|
22
|
+
## Usage
|
23
|
+
Let's say that we use Twilio as a SMS provider.
|
24
|
+
|
25
|
+
You can import SMS pricing data like so:
|
26
|
+
|
27
|
+
´´´shell
|
28
|
+
bundle exec rake "makeplans_sms_pricing:import[twilio, https://assets.cdn.prod.twilio.com/pricing-csv/SMSPricing.csv, USD]"
|
29
|
+
```
|
30
|
+
|
31
|
+
And fetch SMS prices using a country code:
|
32
|
+
```ruby
|
33
|
+
MakeplansSmsPricing.sms_price "twilio", "US", "USD"
|
34
|
+
```
|
35
|
+
|
36
|
+
## Configuration
|
37
|
+
|
38
|
+
You can configure Redis using `MakeplansSmsPricing.configure`:
|
39
|
+
```ruby
|
40
|
+
MakeplansSmsPricing.configure do |config|
|
41
|
+
config.redis = { ... } # or ConnectionPool.new(...)
|
42
|
+
end
|
43
|
+
```
|
44
|
+
|
45
|
+
## Development
|
46
|
+
|
47
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
48
|
+
|
49
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
50
|
+
|
51
|
+
## Contributing
|
52
|
+
|
53
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/makeplans/makeplans_sms_pricing.
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
require "rake/testtask"
|
5
|
+
|
6
|
+
Rake::TestTask.new(:test) do |t|
|
7
|
+
t.libs << "test"
|
8
|
+
t.libs << "lib"
|
9
|
+
t.test_files = FileList["test/**/test_*.rb"]
|
10
|
+
end
|
11
|
+
|
12
|
+
task default: :test
|
13
|
+
|
14
|
+
require "bundler/setup"
|
15
|
+
require "makeplans_sms_pricing"
|
16
|
+
|
17
|
+
gem_path = File.expand_path(__dir__)
|
18
|
+
Dir.glob("#{gem_path}/lib/makeplans_sms_pricing/tasks/**/*.rake").each { |task| import task }
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module MakeplansSmsPricing
|
2
|
+
module Import
|
3
|
+
class << self
|
4
|
+
def teletopia(provider, url, currency)
|
5
|
+
require "json"
|
6
|
+
require "countries"
|
7
|
+
response = Net::HTTP.get_response(URI.parse(url))
|
8
|
+
json = response.body
|
9
|
+
rows = JSON.parse(json)
|
10
|
+
rows.each do |row|
|
11
|
+
country_name = row["country"].strip
|
12
|
+
country = ISO3166::Country.find_country_by_any_name(country_name)
|
13
|
+
unless country.nil?
|
14
|
+
country_code = country.alpha2
|
15
|
+
price = row["price"][currency]["standard"]
|
16
|
+
MakeplansSmsPricing.import(provider, country_code, currency, price)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
namespace :makeplans_sms_pricing do
|
2
|
+
desc "Import SMS pricing data"
|
3
|
+
task :import, [:provider, :url, :currency] do |t, args|
|
4
|
+
provider, url, currency = args[:provider], args[:url], args[:currency] || "USD"
|
5
|
+
MakeplansSmsPricing.import_from_csv(provider, url, currency) if url.end_with?(".csv")
|
6
|
+
MakeplansSmsPricing::Import.teletopia(provider, url, currency) if (url.end_with?(".json") && provider == "teletopia")
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "makeplans_sms_pricing/version"
|
4
|
+
|
5
|
+
module MakeplansSmsPricing
|
6
|
+
require "makeplans_sms_pricing/railtie" if defined? Rails::Railtie
|
7
|
+
require "redis"
|
8
|
+
require "connection_pool"
|
9
|
+
require "net/http"
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def sms_price(provider, country_code, currency)
|
13
|
+
key = "sms_pricing:#{provider}:#{country_code}:#{currency}"
|
14
|
+
prices = redis.then do |conn|
|
15
|
+
conn.lrange key, 0, -1
|
16
|
+
end
|
17
|
+
|
18
|
+
prices.map(&:to_f).max
|
19
|
+
end
|
20
|
+
|
21
|
+
def lowest_price(providers, country_code, currency)
|
22
|
+
providers.map{|provider|
|
23
|
+
{
|
24
|
+
provider: provider,
|
25
|
+
price: sms_price(provider, country_code, currency)
|
26
|
+
}
|
27
|
+
}.min_by {|provider|provider[:price]}
|
28
|
+
end
|
29
|
+
|
30
|
+
def import_from_csv(provider, url, currency)
|
31
|
+
require "csv"
|
32
|
+
response = Net::HTTP.get_response(URI.parse(url))
|
33
|
+
csv = response.body
|
34
|
+
rows = CSV.parse csv, headers: true, return_headers: false
|
35
|
+
|
36
|
+
rows.each do |row|
|
37
|
+
country_code, price = row[0], row[3]
|
38
|
+
import(provider, country_code, currency, price)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def import(provider, country_code, currency, price)
|
43
|
+
key = "sms_pricing:#{provider}:#{country_code}:#{currency}"
|
44
|
+
MakeplansSmsPricing.redis.then do |conn|
|
45
|
+
conn.rpush key, price
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def export(provider, provider_per_country = nil)
|
50
|
+
raise ArgumentError, "You need to pass value to default provider" if provider.nil?
|
51
|
+
all_list = {}
|
52
|
+
MakeplansSmsPricing.redis.with do |conn|
|
53
|
+
conn.scan_each(match: "sms_pricing:#{provider}:*:*") do |key|
|
54
|
+
split = key.split ":"
|
55
|
+
set_price_list(all_list, split[1], split[2], split[3])
|
56
|
+
end
|
57
|
+
|
58
|
+
unless provider_per_country.nil?
|
59
|
+
provider_per_country.each do |country_code, provider|
|
60
|
+
conn.scan_each(match: "sms_pricing:#{provider}:#{country_code}:*") do |key|
|
61
|
+
split = key.split ":"
|
62
|
+
set_price_list(all_list, split[1], split[2], split[3])
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
all_list
|
68
|
+
end
|
69
|
+
|
70
|
+
def redis
|
71
|
+
@redis ||= ConnectionPool.new(size: 5) { Redis.new }
|
72
|
+
end
|
73
|
+
|
74
|
+
def redis=(config)
|
75
|
+
if config.is_a? ConnectionPool
|
76
|
+
@redis = config
|
77
|
+
else
|
78
|
+
@redis = Redis.new(config)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def configure
|
83
|
+
yield self if block_given?
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
def set_price_list(all_list, provider, country_code, currency)
|
89
|
+
if all_list.key?(country_code)
|
90
|
+
all_list[country_code][:price]["#{currency}".to_sym] = MakeplansSmsPricing.sms_price(provider, country_code, currency)
|
91
|
+
else
|
92
|
+
all_list[country_code] = { price: { "#{currency}": MakeplansSmsPricing.sms_price(provider, country_code, currency) } }
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: makeplans_sms_pricing
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- mansakondo
|
8
|
+
- Espen Antonsen
|
9
|
+
autorequire:
|
10
|
+
bindir: exe
|
11
|
+
cert_chain: []
|
12
|
+
date: 2024-08-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: redis
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: connection_pool
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: countries
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
description:
|
57
|
+
email:
|
58
|
+
- mansakondo22@gmail.com
|
59
|
+
- espen@inspired.no
|
60
|
+
executables: []
|
61
|
+
extensions: []
|
62
|
+
extra_rdoc_files: []
|
63
|
+
files:
|
64
|
+
- ".env.test"
|
65
|
+
- CHANGELOG.md
|
66
|
+
- Gemfile
|
67
|
+
- Gemfile.lock
|
68
|
+
- README.md
|
69
|
+
- Rakefile
|
70
|
+
- lib/makeplans_sms_pricing.rb
|
71
|
+
- lib/makeplans_sms_pricing/Rakefile
|
72
|
+
- lib/makeplans_sms_pricing/import.rb
|
73
|
+
- lib/makeplans_sms_pricing/railtie.rb
|
74
|
+
- lib/makeplans_sms_pricing/tasks/import.rake
|
75
|
+
- lib/makeplans_sms_pricing/version.rb
|
76
|
+
homepage: https://github.com/makeplans/makeplans_sms_pricing
|
77
|
+
licenses: []
|
78
|
+
metadata:
|
79
|
+
homepage_uri: https://github.com/makeplans/makeplans_sms_pricing
|
80
|
+
source_code_uri: https://github.com/makeplans/makeplans_sms_pricing
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options: []
|
83
|
+
require_paths:
|
84
|
+
- lib
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 2.6.0
|
90
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
requirements: []
|
96
|
+
rubygems_version: 3.5.14
|
97
|
+
signing_key:
|
98
|
+
specification_version: 4
|
99
|
+
summary: MakePlans SMS Pricing
|
100
|
+
test_files: []
|