ambito 0.1.0 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c265a6e3056079bd1e4a3649877cbc253dd2951b88cf09897fd77382de2a9f6a
4
- data.tar.gz: 6d8ba5bcfa6bf8f56243c13f8cf69d0f28f0d5336790fabb31395bd42fd8b072
3
+ metadata.gz: d23be2cb4c6df3b9b39b52bca2a3f61f97d3ea0da79bee423df5e85e4387324e
4
+ data.tar.gz: d0b1156222d75af14749b9bfff6cc80550fcc0c20004337cfb7e0d478ac2d715
5
5
  SHA512:
6
- metadata.gz: 12d8278b1df950077cc1da344ec0bbd8aec1e99feae39cdee08bfcd18108dae5f91ea43a5dddf90f3ae350bc4b2dd9ae0bfd14c626d48d9dc8e96316ab8e6427
7
- data.tar.gz: 0c480f522071a99c8a25d7739d68ba479bcb4645af716bcc6af88a97eede71b60fa85af4e97891c994c3478ea2a0010b7ea1edfca29c6ada8defac549122c46c
6
+ metadata.gz: bdc8d2f6b7cb93b1af53f83d2f2c64a78f1198d260ec1e11a7ac8ef5b6e8b93affd564de405001f52e116264defd2253a60cb304e417a50caf7a4840a3460405
7
+ data.tar.gz: 4526159a7ac8282191e9f884e45efd713cde0e91857168eca569be72d24f4ba553d8dfdda67175cdba425be9c1c1597185f312ccb29b7ca887a49993a860685f
data/CHANGELOG.md CHANGED
@@ -1,4 +1,16 @@
1
- ## [Unreleased]
1
+ # Changelog
2
+
3
+ ## [0.2.1] - 2023-11-27
4
+
5
+ ### Fixed
6
+
7
+ - Correct path when loading configuration
8
+
9
+ ## [0.2.0] - 2023-11-24
10
+
11
+ ### Added
12
+
13
+ - Option to fetch a single rate
2
14
 
3
15
  ## [0.1.0] - 2023-11-22
4
16
 
@@ -0,0 +1,16 @@
1
+ - !ruby/object:Ambito::Dollar
2
+ name: oficial
3
+ display: Oficial
4
+ endpoint: /dolar/oficial/variacion
5
+ - !ruby/object:Ambito::Dollar
6
+ name: informal
7
+ display: Informal
8
+ endpoint: /dolar/informal/variacion
9
+ - !ruby/object:Ambito::Dollar
10
+ name: mep
11
+ display: MEP
12
+ endpoint: /dolarrava/mep/variacion
13
+ - !ruby/object:Ambito::Dollar
14
+ name: cripto
15
+ display: Cripto
16
+ endpoint: /dolarcripto/variacion
data/exe/ambito CHANGED
@@ -4,4 +4,4 @@ $LOAD_PATH.unshift("#{__dir__}/../lib")
4
4
 
5
5
  require "ambito"
6
6
 
7
- Ambito::CLI.new.run
7
+ Ambito::CLI.new(ARGV).run
data/lib/ambito/cli.rb CHANGED
@@ -1,7 +1,29 @@
1
+ require "optparse"
2
+
1
3
  module Ambito
2
4
  class CLI
5
+ def initialize(argv)
6
+ @argv = argv
7
+ end
8
+
3
9
  def run
4
- puts Ambito.fetch
10
+ if options.any?
11
+ puts Ambito.rate(*options)
12
+ else
13
+ puts Ambito.rates
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def options
20
+ [].tap do |parsed_options|
21
+ OptionParser.new do |options|
22
+ options.on("-d", "--dollar DOLLAR", "Select the rate") do |dollar|
23
+ parsed_options << dollar
24
+ end
25
+ end.parse(@argv)
26
+ end
5
27
  end
6
28
  end
7
29
  end
data/lib/ambito/dollar.rb CHANGED
@@ -1,43 +1,41 @@
1
+ require "yaml"
2
+
1
3
  module Ambito
2
4
  class Dollar
3
- EMOJI = {up: "📈", down: "📉", equal: "📊"}.freeze
4
- TYPES = {oficial: "Oficial", informal: "Informal", mep: "MEP"}.freeze
5
-
6
- def initialize(buy:, sell:, type:, variation:)
7
- @buy = float(buy)
8
- @sell = float(sell)
9
- @type = TYPES.fetch(type.to_sym)
10
- @variation = float(variation)
11
- end
5
+ LIST = YAML.safe_load_file(
6
+ "#{__dir__}/../../config/dollars.yml",
7
+ permitted_classes: [Ambito::Dollar]
8
+ ).freeze
12
9
 
13
- def average
14
- (buy + sell) / 2
15
- end
10
+ attr_reader :name, :display, :endpoint
16
11
 
17
- def to_s
18
- "#{type}: $ #{format(average)} #{emoji} #{format(variation)}%"
12
+ def initialize(name:, display:, endpoint:)
13
+ @name = name
14
+ @display = display
15
+ @endpoint = endpoint
19
16
  end
20
17
 
21
- private
22
-
23
- attr_reader :buy, :sell, :type, :variation
18
+ def rate
19
+ gateway = Gateway.new(endpoint:)
20
+ buy, sell, value, variation = gateway.get("compra", "venta", "valor", "variacion")
24
21
 
25
- def emoji
26
- if variation.positive?
27
- EMOJI[:up]
28
- elsif variation.negative?
29
- EMOJI[:down]
30
- else
31
- EMOJI[:equal]
32
- end
22
+ Rate.new(dollar: self, buy:, sell:, value:, variation:)
33
23
  end
34
24
 
35
- def float(value)
36
- value.tr(",", ".").to_f
25
+ def to_s
26
+ display
37
27
  end
38
28
 
39
- def format(number)
40
- sprintf("%.2f" % number)
29
+ class << self
30
+ def all
31
+ LIST
32
+ end
33
+
34
+ def find(name)
35
+ LIST.find do |dollar|
36
+ dollar.name == String(name)
37
+ end
38
+ end
41
39
  end
42
40
  end
43
41
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "net/http"
4
+ require "json"
5
+
6
+ module Ambito
7
+ class Gateway
8
+ BASE_URL = "https://mercados.ambito.com"
9
+
10
+ def initialize(endpoint:)
11
+ @endpoint = endpoint
12
+ end
13
+
14
+ def get(*)
15
+ JSON.parse(request).values_at(*)
16
+ end
17
+
18
+ private
19
+
20
+ attr_reader :endpoint
21
+
22
+ def request
23
+ Net::HTTP.get(uri)
24
+ end
25
+
26
+ def uri
27
+ URI.join(BASE_URL, endpoint)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,27 @@
1
+ module Ambito
2
+ class Price
3
+ attr_reader :quote
4
+
5
+ def initialize(quote)
6
+ @quote = parse(quote)
7
+ end
8
+
9
+ def +(other)
10
+ quote + other.quote
11
+ end
12
+
13
+ def parse(quote)
14
+ String(quote).tr(",", ".").to_f
15
+ end
16
+
17
+ def to_s
18
+ sprintf("$ %.2f" % quote)
19
+ end
20
+
21
+ class << self
22
+ def [](quote)
23
+ quote && new(quote) || nil
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,29 @@
1
+ module Ambito
2
+ class Rate
3
+ TRENDS = {up: "📈", down: "📉", equal: "📊"}.freeze
4
+
5
+ def initialize(dollar:, buy:, sell:, value:, variation:)
6
+ @dollar = dollar
7
+ @buy = Price[buy]
8
+ @sell = Price[sell]
9
+ @value = Price[value]
10
+ @variation = Variation[variation]
11
+ end
12
+
13
+ def average
14
+ Price[(buy + sell) / 2]
15
+ end
16
+
17
+ def to_s
18
+ "#{dollar}: #{price} #{variation.trend} #{variation}"
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :dollar, :buy, :sell, :value, :variation
24
+
25
+ def price
26
+ value || average
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ module Ambito
2
+ class Variation
3
+ TRENDS = {up: "📈", down: "📉", equal: "📊"}.freeze
4
+
5
+ attr_reader :value
6
+
7
+ def initialize(value)
8
+ @value = parse(value)
9
+ end
10
+
11
+ def to_s
12
+ sprintf("%.2f" % value) << "%"
13
+ end
14
+
15
+ def trend
16
+ if value.positive?
17
+ TRENDS[:up]
18
+ elsif value.negative?
19
+ TRENDS[:down]
20
+ else
21
+ TRENDS[:equal]
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def parse(value)
28
+ value.tr(",", ".").to_f
29
+ end
30
+
31
+ class << self
32
+ def [](value)
33
+ new(value)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ambito
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.1"
5
5
  end
data/lib/ambito.rb CHANGED
@@ -1,32 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "net/http"
4
- require "json"
5
3
  require_relative "ambito/cli"
6
4
  require_relative "ambito/dollar"
5
+ require_relative "ambito/gateway"
6
+ require_relative "ambito/price"
7
+ require_relative "ambito/rate"
8
+ require_relative "ambito/variation"
7
9
  require_relative "ambito/version"
8
10
 
9
11
  module Ambito
10
- class Error < StandardError; end
11
-
12
- DOLLARS = %w[
13
- dolar/oficial
14
- dolar/informal
15
- dolarrava/mep
16
- ].freeze
17
-
18
12
  class << self
19
- def fetch
20
- DOLLARS.map do |dollar|
21
- res = JSON.parse(Net::HTTP.get(uri(dollar)))
22
- type = dollar.split("/").last
23
- buy, sell, variation = res.values_at("compra", "venta", "variacion")
24
- Dollar.new(type:, buy:, sell:, variation:)
25
- end
13
+ def rates
14
+ Dollar.all.map(&:rate)
26
15
  end
27
16
 
28
- def uri(dollar)
29
- URI("https://mercados.ambito.com/#{dollar}/variacion")
17
+ def rate(dollar)
18
+ Dollar.find(dollar).rate
30
19
  end
31
20
  end
32
21
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ambito
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ariel Rzezak
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-11-22 00:00:00.000000000 Z
11
+ date: 2023-11-27 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A Ruby gem for retrieving real-time USD exchange rates and financial
14
14
  data.
@@ -25,12 +25,16 @@ files:
25
25
  - README.md
26
26
  - Rakefile
27
27
  - ambito.gemspec
28
+ - config/dollars.yml
28
29
  - exe/ambito
29
30
  - lib/ambito.rb
30
31
  - lib/ambito/cli.rb
31
32
  - lib/ambito/dollar.rb
33
+ - lib/ambito/gateway.rb
34
+ - lib/ambito/price.rb
35
+ - lib/ambito/rate.rb
36
+ - lib/ambito/variation.rb
32
37
  - lib/ambito/version.rb
33
- - sig/ambito.rbs
34
38
  homepage: https://github.com/arzezak/ambito
35
39
  licenses:
36
40
  - MIT
data/sig/ambito.rbs DELETED
@@ -1,4 +0,0 @@
1
- module Ambito
2
- VERSION: String
3
- # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
- end