ambito 0.1.0 → 0.2.1

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: 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