simple_forex 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +48 -27
- data/lib/doc/CreateCurrencies.html +137 -0
- data/lib/doc/Object.html +114 -0
- data/lib/doc/SimpleForex/Currency.html +99 -0
- data/lib/doc/SimpleForex/Error.html +97 -0
- data/lib/doc/SimpleForex/Railtie.html +97 -0
- data/lib/doc/SimpleForex.html +254 -0
- data/lib/doc/SimpleForexGenerator.html +137 -0
- data/lib/doc/created.rid +8 -0
- data/lib/doc/css/fonts.css +167 -0
- data/lib/doc/css/rdoc.css +639 -0
- data/lib/doc/fonts/Lato-Light.ttf +0 -0
- data/lib/doc/fonts/Lato-LightItalic.ttf +0 -0
- data/lib/doc/fonts/Lato-Regular.ttf +0 -0
- data/lib/doc/fonts/Lato-RegularItalic.ttf +0 -0
- data/lib/doc/fonts/SourceCodePro-Bold.ttf +0 -0
- data/lib/doc/fonts/SourceCodePro-Regular.ttf +0 -0
- data/lib/doc/images/add.png +0 -0
- data/lib/doc/images/arrow_up.png +0 -0
- data/lib/doc/images/brick.png +0 -0
- data/lib/doc/images/brick_link.png +0 -0
- data/lib/doc/images/bug.png +0 -0
- data/lib/doc/images/bullet_black.png +0 -0
- data/lib/doc/images/bullet_toggle_minus.png +0 -0
- data/lib/doc/images/bullet_toggle_plus.png +0 -0
- data/lib/doc/images/date.png +0 -0
- data/lib/doc/images/delete.png +0 -0
- data/lib/doc/images/find.png +0 -0
- data/lib/doc/images/loadingAnimation.gif +0 -0
- data/lib/doc/images/macFFBgHack.png +0 -0
- data/lib/doc/images/package.png +0 -0
- data/lib/doc/images/page_green.png +0 -0
- data/lib/doc/images/page_white_text.png +0 -0
- data/lib/doc/images/page_white_width.png +0 -0
- data/lib/doc/images/plugin.png +0 -0
- data/lib/doc/images/ruby.png +0 -0
- data/lib/doc/images/tag_blue.png +0 -0
- data/lib/doc/images/tag_green.png +0 -0
- data/lib/doc/images/transparent.png +0 -0
- data/lib/doc/images/wrench.png +0 -0
- data/lib/doc/images/wrench_orange.png +0 -0
- data/lib/doc/images/zoom.png +0 -0
- data/lib/doc/index.html +94 -0
- data/lib/doc/js/darkfish.js +84 -0
- data/lib/doc/js/navigation.js +105 -0
- data/lib/doc/js/navigation.js.gz +0 -0
- data/lib/doc/js/search.js +110 -0
- data/lib/doc/js/search_index.js +1 -0
- data/lib/doc/js/search_index.js.gz +0 -0
- data/lib/doc/js/searcher.js +229 -0
- data/lib/doc/js/searcher.js.gz +0 -0
- data/lib/doc/simple_forex/tasks/simple_forex_rake.html +153 -0
- data/lib/doc/table_of_contents.html +101 -0
- data/lib/simple_forex/version.rb +1 -1
- data/lib/simple_forex.rb +92 -2
- metadata +69 -5
- data/lib/easy_money.rb +0 -109
- data/lib/simple_forex/.DS_Store +0 -0
@@ -0,0 +1,153 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
|
3
|
+
<html>
|
4
|
+
<head>
|
5
|
+
<meta charset="UTF-8">
|
6
|
+
|
7
|
+
<title>simple_forex.rake - RDoc Documentation</title>
|
8
|
+
|
9
|
+
<script type="text/javascript">
|
10
|
+
var rdoc_rel_prefix = "../../";
|
11
|
+
var index_rel_prefix = "../../";
|
12
|
+
</script>
|
13
|
+
|
14
|
+
<script src="../../js/navigation.js" defer></script>
|
15
|
+
<script src="../../js/search.js" defer></script>
|
16
|
+
<script src="../../js/search_index.js" defer></script>
|
17
|
+
<script src="../../js/searcher.js" defer></script>
|
18
|
+
<script src="../../js/darkfish.js" defer></script>
|
19
|
+
|
20
|
+
<link href="../../css/fonts.css" rel="stylesheet">
|
21
|
+
<link href="../../css/rdoc.css" rel="stylesheet">
|
22
|
+
|
23
|
+
|
24
|
+
<body id="top" role="document" class="file">
|
25
|
+
<nav role="navigation">
|
26
|
+
<div id="project-navigation">
|
27
|
+
<div id="home-section" role="region" title="Quick navigation" class="nav-section">
|
28
|
+
<h2>
|
29
|
+
<a href="../../index.html" rel="home">Home</a>
|
30
|
+
</h2>
|
31
|
+
|
32
|
+
<div id="table-of-contents-navigation">
|
33
|
+
<a href="../../table_of_contents.html#pages">Pages</a>
|
34
|
+
<a href="../../table_of_contents.html#classes">Classes</a>
|
35
|
+
<a href="../../table_of_contents.html#methods">Methods</a>
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
|
39
|
+
<div id="search-section" role="search" class="project-section initially-hidden">
|
40
|
+
<form action="#" method="get" accept-charset="utf-8">
|
41
|
+
<div id="search-field-wrapper">
|
42
|
+
<input id="search-field" role="combobox" aria-label="Search"
|
43
|
+
aria-autocomplete="list" aria-controls="search-results"
|
44
|
+
type="text" name="search" placeholder="Search" spellcheck="false"
|
45
|
+
title="Type to search, Up and Down to navigate, Enter to load">
|
46
|
+
</div>
|
47
|
+
|
48
|
+
<ul id="search-results" aria-label="Search Results"
|
49
|
+
aria-busy="false" aria-expanded="false"
|
50
|
+
aria-atomic="false" class="initially-hidden"></ul>
|
51
|
+
</form>
|
52
|
+
</div>
|
53
|
+
|
54
|
+
</div>
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
<div id="project-metadata">
|
59
|
+
|
60
|
+
<div id="fileindex-section" class="nav-section">
|
61
|
+
<h3>Pages</h3>
|
62
|
+
|
63
|
+
<ul class="link-list">
|
64
|
+
<li><a href="../../simple_forex/tasks/simple_forex_rake.html">simple_forex.rake</a>
|
65
|
+
</ul>
|
66
|
+
</div>
|
67
|
+
|
68
|
+
</div>
|
69
|
+
</nav>
|
70
|
+
|
71
|
+
<main role="main" aria-label="Page simple_forex/tasks/simple_forex.rake">
|
72
|
+
|
73
|
+
<p># Useful example from ryanb's letter_opener gem # namespace :tmp do # task :zzzzzzzzzzzzzz do # rm_rf <a href="^.">Dir[“tmp/letter_opener/</a>*”], verbose: false # end</p>
|
74
|
+
|
75
|
+
<p># task zzzzzzzzz: :letter_opener # end</p>
|
76
|
+
|
77
|
+
<p># Run from terminal with: RAILS_ENV=test rake fetch_rates</p>
|
78
|
+
|
79
|
+
<p>desc “This retrieves currency data” namespace :simple_forex do</p>
|
80
|
+
|
81
|
+
<pre class="ruby"><span class="ruby-identifier">task</span> <span class="ruby-value">:fetch_rates</span> <span class="ruby-operator">=></span> <span class="ruby-value">:environment</span> <span class="ruby-keyword">do</span>
|
82
|
+
|
83
|
+
<span class="ruby-identifier">error_message</span> = <span class="ruby-string">""</span><span class="ruby-string">"
|
84
|
+
Missing openexchangerates_key in credentials.
|
85
|
+
Please ensure you have added the key to your credentials.
|
86
|
+
|
87
|
+
Edit credentials.yml with
|
88
|
+
|
89
|
+
```
|
90
|
+
EDITOR=\"vim\" rails credentials:edit
|
91
|
+
```
|
92
|
+
|
93
|
+
It should contain lines like this:
|
94
|
+
|
95
|
+
```
|
96
|
+
simple_forex:
|
97
|
+
openexchangerates_key: 1234AB
|
98
|
+
```
|
99
|
+
"</span><span class="ruby-string">""</span>
|
100
|
+
<span class="ruby-comment"># from = "AUDz"</span>
|
101
|
+
<span class="ruby-comment"># error_message % {currency_code: from}</span>
|
102
|
+
|
103
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">get_key</span>
|
104
|
+
<span class="ruby-comment"># Get key</span>
|
105
|
+
<span class="ruby-keyword">if</span> <span class="ruby-constant">Rails</span>.<span class="ruby-identifier">version</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">to_i</span> <span class="ruby-operator"><=</span> <span class="ruby-value">6</span>
|
106
|
+
<span class="ruby-comment"># Works in rails 6</span>
|
107
|
+
<span class="ruby-constant">Rails</span>.<span class="ruby-identifier">application</span>.<span class="ruby-identifier">credentials</span>.<span class="ruby-identifier">simple_forex</span>[<span class="ruby-value">:openexchangerates_key</span>]
|
108
|
+
<span class="ruby-keyword">elsif</span> <span class="ruby-constant">Rails</span>.<span class="ruby-identifier">version</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">to_i</span> <span class="ruby-operator">>=</span> <span class="ruby-value">7</span>
|
109
|
+
<span class="ruby-comment"># Works for rails 7</span>
|
110
|
+
<span class="ruby-constant">Rails</span>.<span class="ruby-identifier">application</span>.<span class="ruby-identifier">credentials</span>.<span class="ruby-identifier">simple_forex</span>.<span class="ruby-identifier">openexchangerates_key</span>
|
111
|
+
<span class="ruby-keyword">end</span>
|
112
|
+
<span class="ruby-keyword">end</span>
|
113
|
+
|
114
|
+
<span class="ruby-keyword">begin</span>
|
115
|
+
<span class="ruby-identifier">openexchangerates_key</span> = <span class="ruby-identifier">get_key</span>
|
116
|
+
<span class="ruby-keyword">rescue</span> <span class="ruby-operator">=></span> <span class="ruby-identifier">exception</span>
|
117
|
+
<span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">"Error: #{exception} - \n\n"</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">error_message</span> <span class="ruby-operator">+</span> <span class="ruby-string">"\n\n"</span>
|
118
|
+
<span class="ruby-keyword">end</span>
|
119
|
+
|
120
|
+
<span class="ruby-identifier">open_exchange_rates_url</span> = <span class="ruby-string">"https://openexchangerates.org/api/latest.json?app_id="</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">openexchangerates_key</span>
|
121
|
+
|
122
|
+
<span class="ruby-identifier">cur</span> = <span class="ruby-constant">JSON</span>.<span class="ruby-identifier">load</span>(<span class="ruby-constant">URI</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">open_exchange_rates_url</span>))
|
123
|
+
|
124
|
+
<span class="ruby-comment"># Iterate over each of the rates and ensure it's a decimal, otherwise it could mess with multiplication later</span>
|
125
|
+
<span class="ruby-comment"># Here's why decimal over float;</span>
|
126
|
+
<span class="ruby-comment"># https://stackoverflow.com/a/8523253/5783745</span>
|
127
|
+
<span class="ruby-comment"># TL;DR slightly more accurate, slightly less performant</span>
|
128
|
+
<span class="ruby-identifier">cur</span>[<span class="ruby-string">"rates"</span>].<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">code</span>, <span class="ruby-identifier">rate</span><span class="ruby-operator">|</span> <span class="ruby-identifier">cur</span>[<span class="ruby-string">"rates"</span>][<span class="ruby-identifier">code</span>] = <span class="ruby-identifier">rate</span>.<span class="ruby-identifier">to_d</span> }
|
129
|
+
|
130
|
+
<span class="ruby-constant">Currency</span>.<span class="ruby-identifier">create!</span>(<span class="ruby-value">blob:</span> <span class="ruby-identifier">cur</span>)
|
131
|
+
|
132
|
+
<span class="ruby-identifier">success_message</span> = <span class="ruby-string">""</span><span class="ruby-string">"
|
133
|
+
Successfully updated %{number_of_currencies} currencies.
|
134
|
+
View them with `Currency.last.blob[\"rates\"].keys` or `Currency.last`.
|
135
|
+
"</span><span class="ruby-string">""</span>
|
136
|
+
|
137
|
+
<span class="ruby-identifier">puts</span> <span class="ruby-identifier">success_message</span> <span class="ruby-operator">%</span> {<span class="ruby-value">number_of_currencies:</span> <span class="ruby-constant">Currency</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">blob</span>[<span class="ruby-string">"rates"</span>].<span class="ruby-identifier">count</span>.<span class="ruby-identifier">to_s</span> }
|
138
|
+
|
139
|
+
<span class="ruby-keyword">end</span>
|
140
|
+
</pre>
|
141
|
+
|
142
|
+
<p>end</p>
|
143
|
+
|
144
|
+
</main>
|
145
|
+
|
146
|
+
|
147
|
+
|
148
|
+
<footer id="validator-badges" role="contentinfo">
|
149
|
+
<p><a href="https://validator.w3.org/check/referer">Validate</a>
|
150
|
+
<p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> 6.3.3.
|
151
|
+
<p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
|
152
|
+
</footer>
|
153
|
+
|
@@ -0,0 +1,101 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
|
3
|
+
<html>
|
4
|
+
<head>
|
5
|
+
<meta charset="UTF-8">
|
6
|
+
|
7
|
+
<title>Table of Contents - RDoc Documentation</title>
|
8
|
+
|
9
|
+
<script type="text/javascript">
|
10
|
+
var rdoc_rel_prefix = "./";
|
11
|
+
var index_rel_prefix = "./";
|
12
|
+
</script>
|
13
|
+
|
14
|
+
<script src="./js/navigation.js" defer></script>
|
15
|
+
<script src="./js/search.js" defer></script>
|
16
|
+
<script src="./js/search_index.js" defer></script>
|
17
|
+
<script src="./js/searcher.js" defer></script>
|
18
|
+
<script src="./js/darkfish.js" defer></script>
|
19
|
+
|
20
|
+
<link href="./css/fonts.css" rel="stylesheet">
|
21
|
+
<link href="./css/rdoc.css" rel="stylesheet">
|
22
|
+
|
23
|
+
|
24
|
+
<body id="top" class="table-of-contents">
|
25
|
+
<main role="main">
|
26
|
+
<h1 class="class">Table of Contents - RDoc Documentation</h1>
|
27
|
+
|
28
|
+
<h2 id="pages">Pages</h2>
|
29
|
+
<ul>
|
30
|
+
<li class="file">
|
31
|
+
<a href="simple_forex/tasks/simple_forex_rake.html">simple_forex.rake</a>
|
32
|
+
</li>
|
33
|
+
</ul>
|
34
|
+
|
35
|
+
<h2 id="classes">Classes and Modules</h2>
|
36
|
+
<ul>
|
37
|
+
<li class="class">
|
38
|
+
<a href="CreateCurrencies.html">CreateCurrencies</a>
|
39
|
+
</li>
|
40
|
+
<li class="class">
|
41
|
+
<a href="Object.html">Object</a>
|
42
|
+
</li>
|
43
|
+
<li class="module">
|
44
|
+
<a href="SimpleForex.html">SimpleForex</a>
|
45
|
+
</li>
|
46
|
+
<li class="class">
|
47
|
+
<a href="SimpleForex/Currency.html">SimpleForex::Currency</a>
|
48
|
+
</li>
|
49
|
+
<li class="class">
|
50
|
+
<a href="SimpleForex/Error.html">SimpleForex::Error</a>
|
51
|
+
</li>
|
52
|
+
<li class="class">
|
53
|
+
<a href="SimpleForex/Railtie.html">SimpleForex::Railtie</a>
|
54
|
+
</li>
|
55
|
+
<li class="class">
|
56
|
+
<a href="SimpleForexGenerator.html">SimpleForexGenerator</a>
|
57
|
+
</li>
|
58
|
+
</ul>
|
59
|
+
|
60
|
+
<h2 id="methods">Methods</h2>
|
61
|
+
<ul>
|
62
|
+
|
63
|
+
<li class="method">
|
64
|
+
<a href="SimpleForex.html#method-i-all_currencies">#all_currencies</a>
|
65
|
+
—
|
66
|
+
<span class="container">SimpleForex</span>
|
67
|
+
|
68
|
+
<li class="method">
|
69
|
+
<a href="CreateCurrencies.html#method-i-change">#change</a>
|
70
|
+
—
|
71
|
+
<span class="container">CreateCurrencies</span>
|
72
|
+
|
73
|
+
<li class="method">
|
74
|
+
<a href="SimpleForex.html#method-i-convert">#convert</a>
|
75
|
+
—
|
76
|
+
<span class="container">SimpleForex</span>
|
77
|
+
|
78
|
+
<li class="method">
|
79
|
+
<a href="SimpleForexGenerator.html#method-i-copy_files">#copy_files</a>
|
80
|
+
—
|
81
|
+
<span class="container">SimpleForexGenerator</span>
|
82
|
+
|
83
|
+
<li class="method">
|
84
|
+
<a href="SimpleForex.html#method-i-currency_exchange_rate">#currency_exchange_rate</a>
|
85
|
+
—
|
86
|
+
<span class="container">SimpleForex</span>
|
87
|
+
|
88
|
+
<li class="method">
|
89
|
+
<a href="SimpleForex.html#method-i-some_currencies">#some_currencies</a>
|
90
|
+
—
|
91
|
+
<span class="container">SimpleForex</span>
|
92
|
+
</ul>
|
93
|
+
</main>
|
94
|
+
|
95
|
+
|
96
|
+
<footer id="validator-badges" role="contentinfo">
|
97
|
+
<p><a href="https://validator.w3.org/check/referer">Validate</a>
|
98
|
+
<p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> 6.3.3.
|
99
|
+
<p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
|
100
|
+
</footer>
|
101
|
+
|
data/lib/simple_forex/version.rb
CHANGED
data/lib/simple_forex.rb
CHANGED
@@ -1,7 +1,97 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
require "active_record/railtie" # Sc: I added this because without it rspec complains about ActiveRecord::Base
|
3
2
|
require_relative "simple_forex/version"
|
4
3
|
|
4
|
+
|
5
|
+
# # SimpleForex
|
6
|
+
|
7
|
+
# This ruby gem lets you fetch exchange rates for ~170 currencies (a total of ~14,000 imputed currency pairs) for free, on an hourly frequently (sufficient for most, but not all, use cases), and takes only about 5 minutes to set up.
|
8
|
+
|
9
|
+
# The usage instructions below show how to create a currencies table, run a rake task to update the exchange rates, and use `convert()` to convert between currencies inside your application. Total time to implementation should be ~5 minutes.
|
10
|
+
|
11
|
+
|
12
|
+
# ## Installation
|
13
|
+
|
14
|
+
# Install the gem in one of the usual ways:
|
15
|
+
|
16
|
+
# bundle add simple_forex
|
17
|
+
|
18
|
+
# gem install simple_forex
|
19
|
+
|
20
|
+
|
21
|
+
# ## Usage
|
22
|
+
|
23
|
+
# ### Create a currencies table
|
24
|
+
|
25
|
+
# Use the included generator will make a currencies table migration:
|
26
|
+
|
27
|
+
# ```bash
|
28
|
+
# rails generate simple_forex
|
29
|
+
# ```
|
30
|
+
|
31
|
+
# Then run the migration:
|
32
|
+
|
33
|
+
# ```
|
34
|
+
# rake db:migrate
|
35
|
+
# ```
|
36
|
+
|
37
|
+
# ### Fetch exchange rates
|
38
|
+
|
39
|
+
# Create a [free API key](https://openexchangerates.org/signup/free), open credentials.yml (`EDITOR="vim" rails credentials:edit`) and add the API key to credentials.yml like so:
|
40
|
+
|
41
|
+
# ```
|
42
|
+
# # config/credentials.yml.enc
|
43
|
+
|
44
|
+
# simple_forex:
|
45
|
+
# openexchangerates_key: 1234abcd
|
46
|
+
# ```
|
47
|
+
|
48
|
+
# Run this rate task to retrieve currencies and store them in the currencies table:
|
49
|
+
|
50
|
+
# ```bash
|
51
|
+
# rake simple_forex:fetch_rates
|
52
|
+
# ```
|
53
|
+
|
54
|
+
# View the exchange rate data in the rails console with `Currency.last`:
|
55
|
+
|
56
|
+
# ```
|
57
|
+
# => #<SimpleForex::Currency:0x000000013c4bae78
|
58
|
+
# id: 1,
|
59
|
+
# blob:
|
60
|
+
# {"base"=>"USD",
|
61
|
+
# "rates"=>
|
62
|
+
# {"AED"=>"3.67286",
|
63
|
+
# "AFN"=>"89.49999",
|
64
|
+
# "ALL"=>"108.164235",
|
65
|
+
# "AMD"=>"388.147964",
|
66
|
+
# "ANG"=>"1.798456",
|
67
|
+
# "AOA"=>"503.891",
|
68
|
+
# "ARS"=>"198.1831",
|
69
|
+
# "AUD"=>"1.485125",
|
70
|
+
|
71
|
+
# ...
|
72
|
+
|
73
|
+
# "XOF"=>"617.115134",
|
74
|
+
# "XPD"=>"0.00069861",
|
75
|
+
# "XPF"=>"112.265627",
|
76
|
+
# "XPT"=>"0.00103175",
|
77
|
+
# "YER"=>"250.300106",
|
78
|
+
# "ZAR"=>"18.23512",
|
79
|
+
# "ZMW"=>"19.934751",
|
80
|
+
# "ZWL"=>"322.0"},
|
81
|
+
# "license"=>"https://openexchangerates.org/license",
|
82
|
+
# "timestamp"=>1678096800,
|
83
|
+
# "disclaimer"=>"Usage subject to terms: https://openexchangerates.org/terms"},
|
84
|
+
# created_at: Mon, 06 Mar 2023 10:43:54 UTC +00:00,
|
85
|
+
# updated_at: Mon, 06 Mar 2023 10:43:54 UTC +00:00>
|
86
|
+
# ```
|
87
|
+
|
88
|
+
|
89
|
+
# **Optional**
|
90
|
+
|
91
|
+
# Schedule the `simple_forex:fetch_rates` rake task to run at the frequency you require.
|
92
|
+
|
93
|
+
# Tip: open exchange rates's free API gives 1000 calls monthly, and there are ~700 hours in month, so you safely run it hourly while staying within the free limit.
|
94
|
+
|
5
95
|
module SimpleForex
|
6
96
|
class Error < StandardError; end
|
7
97
|
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_forex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steve Condylios
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-03-
|
12
|
-
dependencies:
|
11
|
+
date: 2023-03-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
description: simple_forex lets you setup and use currency conversion in your Rails
|
14
28
|
application. It includes a migration for a currencies table that stores all world
|
15
29
|
currencies, including some cryptocurrencies. It also includes a rake task for retrieving
|
@@ -27,10 +41,60 @@ files:
|
|
27
41
|
- LICENSE.txt
|
28
42
|
- README.md
|
29
43
|
- Rakefile
|
30
|
-
- lib/
|
44
|
+
- lib/doc/CreateCurrencies.html
|
45
|
+
- lib/doc/Object.html
|
46
|
+
- lib/doc/SimpleForex.html
|
47
|
+
- lib/doc/SimpleForex/Currency.html
|
48
|
+
- lib/doc/SimpleForex/Error.html
|
49
|
+
- lib/doc/SimpleForex/Railtie.html
|
50
|
+
- lib/doc/SimpleForexGenerator.html
|
51
|
+
- lib/doc/created.rid
|
52
|
+
- lib/doc/css/fonts.css
|
53
|
+
- lib/doc/css/rdoc.css
|
54
|
+
- lib/doc/fonts/Lato-Light.ttf
|
55
|
+
- lib/doc/fonts/Lato-LightItalic.ttf
|
56
|
+
- lib/doc/fonts/Lato-Regular.ttf
|
57
|
+
- lib/doc/fonts/Lato-RegularItalic.ttf
|
58
|
+
- lib/doc/fonts/SourceCodePro-Bold.ttf
|
59
|
+
- lib/doc/fonts/SourceCodePro-Regular.ttf
|
60
|
+
- lib/doc/images/add.png
|
61
|
+
- lib/doc/images/arrow_up.png
|
62
|
+
- lib/doc/images/brick.png
|
63
|
+
- lib/doc/images/brick_link.png
|
64
|
+
- lib/doc/images/bug.png
|
65
|
+
- lib/doc/images/bullet_black.png
|
66
|
+
- lib/doc/images/bullet_toggle_minus.png
|
67
|
+
- lib/doc/images/bullet_toggle_plus.png
|
68
|
+
- lib/doc/images/date.png
|
69
|
+
- lib/doc/images/delete.png
|
70
|
+
- lib/doc/images/find.png
|
71
|
+
- lib/doc/images/loadingAnimation.gif
|
72
|
+
- lib/doc/images/macFFBgHack.png
|
73
|
+
- lib/doc/images/package.png
|
74
|
+
- lib/doc/images/page_green.png
|
75
|
+
- lib/doc/images/page_white_text.png
|
76
|
+
- lib/doc/images/page_white_width.png
|
77
|
+
- lib/doc/images/plugin.png
|
78
|
+
- lib/doc/images/ruby.png
|
79
|
+
- lib/doc/images/tag_blue.png
|
80
|
+
- lib/doc/images/tag_green.png
|
81
|
+
- lib/doc/images/transparent.png
|
82
|
+
- lib/doc/images/wrench.png
|
83
|
+
- lib/doc/images/wrench_orange.png
|
84
|
+
- lib/doc/images/zoom.png
|
85
|
+
- lib/doc/index.html
|
86
|
+
- lib/doc/js/darkfish.js
|
87
|
+
- lib/doc/js/navigation.js
|
88
|
+
- lib/doc/js/navigation.js.gz
|
89
|
+
- lib/doc/js/search.js
|
90
|
+
- lib/doc/js/search_index.js
|
91
|
+
- lib/doc/js/search_index.js.gz
|
92
|
+
- lib/doc/js/searcher.js
|
93
|
+
- lib/doc/js/searcher.js.gz
|
94
|
+
- lib/doc/simple_forex/tasks/simple_forex_rake.html
|
95
|
+
- lib/doc/table_of_contents.html
|
31
96
|
- lib/generators/simple_forex/simple_forex_generator.rb
|
32
97
|
- lib/simple_forex.rb
|
33
|
-
- lib/simple_forex/.DS_Store
|
34
98
|
- lib/simple_forex/initializer.rb
|
35
99
|
- lib/simple_forex/migration.rb
|
36
100
|
- lib/simple_forex/railtie.rb
|
data/lib/easy_money.rb
DELETED
@@ -1,109 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "simple_forex/version"
|
4
|
-
|
5
|
-
module SimpleForex
|
6
|
-
class Error < StandardError; end
|
7
|
-
|
8
|
-
# From: https://stackoverflow.com/a/31701809/5783745
|
9
|
-
# Otherwise after the migration you get Currency.count # uninitialized constant Currency (NameError)
|
10
|
-
class Currency < ActiveRecord::Base
|
11
|
-
end
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
def currency_exchange_rate(from, to)
|
16
|
-
|
17
|
-
currencies = Currency.last.blob
|
18
|
-
|
19
|
-
# Tests:
|
20
|
-
# currency_exchange_rate("aud", "gbp") # 0.54
|
21
|
-
# currency_exchange_rate("GBP", "AUD") # 1.832
|
22
|
-
# currency_exchange_rate("USD", "AUD") # 1.29
|
23
|
-
# currency_exchange_rate("AUD", "usd") # 0.77
|
24
|
-
|
25
|
-
# The open exchange rate API uses UPPER case (unlike stripe and some other platforms)
|
26
|
-
from = from.upcase
|
27
|
-
to = to.upcase
|
28
|
-
|
29
|
-
error_message = """
|
30
|
-
The currency %{currency_code} is not a valid currency code.
|
31
|
-
Run `Currency.last.blob[\"rates\"].keys` to view
|
32
|
-
available currencies.
|
33
|
-
"""
|
34
|
-
# from = "AUDz"
|
35
|
-
# error_message % {currency_code: from}
|
36
|
-
|
37
|
-
raise error_message % {currency_code: from} unless currencies["rates"].keys.include? from
|
38
|
-
raise error_message % {currency_code: to} unless currencies["rates"].keys.include? to
|
39
|
-
|
40
|
-
|
41
|
-
usd_to_from = currencies['rates'][from].to_d
|
42
|
-
usd_to_to = currencies['rates'][to].to_d
|
43
|
-
rate = usd_to_to / usd_to_from
|
44
|
-
# This converts 1 AUD to GPD (gives 0.54585)
|
45
|
-
# R example: rates$rates$GBP / rates$rates$AUD
|
46
|
-
# Ruby: currency['rates']['GBP'].to_d / currency['rates']['AUD'].to_d
|
47
|
-
|
48
|
-
return rate
|
49
|
-
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
def convert(amount, from_currency, to_currency)
|
56
|
-
# Examples:
|
57
|
-
# convert(100, "aud", "gbp") # 54.585
|
58
|
-
# convert(100, "gbp", "aud") # 183.2
|
59
|
-
# convert(100, "usd", "aud") # 129.0
|
60
|
-
# convert(100, "aud", "usd") # 77.0
|
61
|
-
begin
|
62
|
-
rate = currency_exchange_rate(from_currency, to_currency)
|
63
|
-
rescue => exception
|
64
|
-
$stderr.puts "Error: #{exception} - \n\nYou could be seeing this error if you forgot to setup the database and fetch currency data.
|
65
|
-
\nDid you forget to run `rails g simple_forex:install`, `rake db:migrate` or `rake simple_forex:fetch_rates`?
|
66
|
-
\nSee documentation for more information: https://github.com/stevecondylios/SimpleForex\n\n"
|
67
|
-
end
|
68
|
-
|
69
|
-
converted_amount = amount * rate
|
70
|
-
return converted_amount
|
71
|
-
end
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
def all_currencies
|
76
|
-
# Acquired via Currency.last.blob['rates'].keys
|
77
|
-
["AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", "BAM", "BBD", "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BRL", "BSD", "BTC", "BTN", "BWP", "BYN", "BZD", "CAD", "CDF", "CHF", "CLF", "CLP", "CNH", "CNY", "COP", "CRC", "CUC", "CUP", "CVE", "CZK", "DJF", "DKK", "DOP", "DZD", "EGP", "ERN", "ETB", "EUR", "FJD", "FKP", "GBP", "GEL", "GGP", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL", "HRK", "HTG", "HUF", "IDR", "ILS", "IMP", "INR", "IQD", "IRR", "ISK", "JEP", "JMD", "JOD", "JPY", "KES", "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD", "LSL", "LYD", "MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRU", "MUR", "MVR", "MWK", "MXN", "MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "OMR", "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON", "RSD", "RUB", "RWF", "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLL", "SOS", "SRD", "SSP", "STD", "STN", "SVC", "SYP", "SZL", "THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD", "TWD", "TZS", "UAH", "UGX", "USD", "UYU", "UZS", "VES", "VND", "VUV", "WST", "XAF", "XAG", "XAU", "XCD", "XDR", "XOF", "XPD", "XPF", "XPT", "YER", "ZAR", "ZMW", "ZWL"]
|
78
|
-
end
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
def some_currencies
|
84
|
-
["AUD", "CAD", "EUR", "GBP", "HKD", "NZD", "SGD", "USD"]
|
85
|
-
end
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
# Required for rake files
|
91
|
-
# From here: https://gist.github.com/ntamvl/7a6658b4cd82d6fbd15434f0a9953411#integrate-our-gem-with-rails-apps
|
92
|
-
# require 'railtie' if defined?(Rails)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
end # This is the end for the module
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
# sc: this goes at the end so the module gets loaded when require 'simple_forex' is called
|
104
|
-
include SimpleForex
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
require "simple_forex/railtie" if defined?(Rails::Railtie)
|
data/lib/simple_forex/.DS_Store
DELETED
Binary file
|