momm 1.0.1 → 2.0.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
  SHA1:
3
- metadata.gz: 49188c9f9fe8e63f39ca27c846cdc2ad823ab600
4
- data.tar.gz: 78119d09bbd3b29e366be6eca01cd8bf704ce8a8
3
+ metadata.gz: 2f8c123f9bcdbbb764e3fd54e535b680459832b3
4
+ data.tar.gz: 00ccc6dd8dcbac9c8fe9c86cae4edbfc19fbefbe
5
5
  SHA512:
6
- metadata.gz: 90a91b4b43ddc53843c35bd9e660efcba4f41f91d7723a65bae7769fa8143681c5808c32953583bfa1534ff294a48d42e89b992e1b8857226a850c352715a772
7
- data.tar.gz: e532d8336ad98898eaead87bf039270839b71dd4a1b429645262c9637d6232a0012dc2adf89c5c5436cb5071783492abc01f20ecbe7ac9171b1b1b6d12419b10
6
+ metadata.gz: 34f6a7c4b0efc62474ba01ff124f54468cc84247e542feb3a609f52c0e77d1caf84e9239c3f7134da58b3543a679aacd786743490a0cf344d5d332a5931d1a84
7
+ data.tar.gz: 400f36abfcfd4e82fc72890ed957ca18ad5e352539f47bfd12cd885120202e632ed506b8a8d1720c4663d7847d4325e6530d8698dbb2c05551808a7b8866cda5
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/jaxi/momm.svg?branch=master)](https://travis-ci.org/jaxi/momm)
4
4
 
5
- Money on My Mind - An awesome gem for currency exchange.
5
+ Money on My Mind - A pure Ruby gem for currency exchange.
6
6
 
7
7
  ```
8
8
  __ __ __ __
@@ -71,12 +71,10 @@ After the gem is installed, momm provide you a command line tool. The storage en
71
71
 
72
72
  Momm.exchange_rate 'GBP', 'USD' # By default Today
73
73
  Momm.exchange_rate 'GBP', 'USD', date: Date.today
74
- Momm.exchange_rate_from_gbp_to_usd, date: "2014-3-4"
75
74
 
76
75
  Momm.exchange 100, 'GBP', 'USD'
77
76
  Momm.exchange 100, 'GBP', 'USD', date: Date.today
78
77
  Momm.exchange_from_gbp_to_usd 100
79
- Momm.exchange_from_gbp_to_usd 100, date: "2014-3-4"
80
78
 
81
79
  Momm.update! # Fetching the feeds from remote. Only do that if you find any abnormal.
82
80
  ```
@@ -26,8 +26,7 @@ module Momm
26
26
 
27
27
  # delegate the exchange, :currencies, exchange_rate,
28
28
  # as well as meta programmed methods to module level
29
- delegate [:currencies, :exchange, :exchange_rate,
30
- :method_missing, :respond_to?, :update! ] => :calculator
29
+ delegate [:currencies, :exchange, :exchange_rate, :update! ] => :calculator
31
30
 
32
31
  delegate [:store, :source ] => :bridge
33
32
 
@@ -65,4 +64,4 @@ module Momm
65
64
  Keep calm bro. We'll calculate rate for you.
66
65
  EOS
67
66
 
68
- end
67
+ end
@@ -44,4 +44,4 @@ module Momm
44
44
 
45
45
  attr_reader :storage, :feed
46
46
  end
47
- end
47
+ end
@@ -122,26 +122,5 @@ module Momm
122
122
  update!
123
123
  get_rate_origin(from, date)
124
124
  end
125
-
126
- # @TODO: Refactoring
127
- def method_missing(meth, *args, &block)
128
- meth = meth.to_s
129
- case
130
- when meth.match(/^exchange_rate_from_(\w+)_to_(\w+)/)
131
- exchange_rate($1.upcase.to_sym, $2.upcase.to_sym, *args, &block)
132
- when meth.match(/^exchange_from_(\w+)_to_(\w+)/)
133
- money, *res = args
134
- exchange(money, $1.upcase.to_sym, $2.upcase.to_sym, *res, &block)
135
- else
136
- super
137
- end
138
- end
139
-
140
- def respond_to?(meth, include_private = false)
141
- meth = meth.to_s
142
- meth.match(/^exchange_rate_from_(\w+)_to_(\w+)/) ||
143
- meth.match(/^exchange_from_(\w+)_to_(\w+)/) ||
144
- super
145
- end
146
125
  end
147
- end
126
+ end
@@ -1,11 +1,12 @@
1
- require 'httparty'
2
- require 'open-uri'
1
+ require "net/http"
2
+ require "uri"
3
+ require "rexml/document"
3
4
 
4
5
  module Momm
5
6
  module Feeds
6
7
  class ECB
7
8
 
8
- FETCHING_URL = "http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml".freeze
9
+ FETCHING_URL = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml".freeze
9
10
 
10
11
  #Hard coded for good
11
12
  CURRENCIES = %w{USD JPY BGN CZK DKK GBP HUF LTL PLN RON SEK CHF
@@ -24,39 +25,54 @@ module Momm
24
25
  end
25
26
  end
26
27
 
28
+ ConnectionError = Class.new(StandardError)
27
29
  # should be a singleton class
28
30
  private_class_method :new
29
31
 
30
- # Parse the XML data by Nokogiri
32
+ # Request the feed and get the response
33
+ #
31
34
  # == Returns
32
- # Nokogiri Object
35
+ # A Net::HTTPResponse response
33
36
  #
34
- def parsed_content
35
- # @TODO Refactoring Bad patterns
36
- HTTParty.get(fetching_url, format: :xml)['Envelope']['Cube']['Cube']
37
+ def response
38
+ @response ||= Net::HTTP.start(fetching_url.host, fetching_url.port,
39
+ :use_ssl => fetching_url.scheme == "https",
40
+ :open_timeout => 5,
41
+ :read_timeout => 5) do |http|
42
+
43
+ http.request Net::HTTP::Get.new(fetching_url)
44
+ end
45
+ end
46
+
47
+ # Response body in xml format
48
+ def xml
49
+ @xml ||= begin
50
+ raise ConnectionError unless response.is_a? Net::HTTPOK
51
+ REXML::Document.new response.body
52
+ end
37
53
  end
38
54
 
39
- # convert the nokogiri parsed data to array
55
+ # turn the xml data to array of currencies
40
56
  #
41
57
  # == Returns
42
58
  # looks like [{date: Date.now, currency: :CNY, rate: 1.23} ...]
43
59
  #
44
60
  def currency_rates
45
- parsed_content.map do |content|
46
- date = Date.parse(content["time"])
47
- cubes = content["Cube"]
48
- cubes.map do |cube|
61
+ daily_currencies = xml.elements["//Cube"].select{ |c| c.is_a? REXML::Element }
62
+ daily_currencies.map do |daily_currency|
63
+ date = Date.parse daily_currency.attributes["time"]
64
+ daily_currency.map do |cube|
49
65
  {
50
66
  date: date,
51
- currency: cube["currency"].to_sym,
52
- rate: cube["rate"].to_f
67
+ currency: cube.attributes["currency"].to_sym,
68
+ rate: cube.attributes["rate"].to_f
53
69
  }
54
70
  end
55
71
  end.flatten
56
72
  end
57
73
 
58
74
  def fetching_url
59
- FETCHING_URL
75
+ URI(FETCHING_URL)
60
76
  end
61
77
 
62
78
  def currencies
@@ -64,4 +80,4 @@ module Momm
64
80
  end
65
81
  end
66
82
  end
67
- end
83
+ end
@@ -1,3 +1,3 @@
1
1
  module Momm
2
- VERSION = "1.0.1"
2
+ VERSION = "2.0.1"
3
3
  end
@@ -1,7 +1,7 @@
1
- require 'sinatra/base'
2
- require 'momm'
3
- require 'erb'
4
-
1
+ require "sinatra/base"
2
+ require "momm"
3
+ require "erb"
4
+ require "json"
5
5
  module Momm
6
6
  class Web < ::Sinatra::Base
7
7
 
@@ -34,11 +34,13 @@ module Momm
34
34
  to = (params[:to] || "GBP").to_sym
35
35
  date = params[:date] || Date.today
36
36
 
37
- if money && from && to && date
38
- Momm.exchange(money, from, to, date: date).to_json
37
+ rate = if money && from && to && date
38
+ Momm.exchange(money, from, to, date: date)
39
39
  else
40
40
  "N/A"
41
41
  end
42
+
43
+ {rate: rate}.to_json
42
44
  end
43
45
 
44
46
  # GET '/currencies'
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Jingkai He"]
10
10
  spec.email = ["jaxihe@gmail.com"]
11
11
  spec.summary = %q{A Currency Exchange Calculator}
12
- spec.description = %q{A Currency Exchange Calculator}
12
+ spec.description = %q{A currency exchange calculator build in pure Ruby.}
13
13
  spec.homepage = "https://github.com/jaxi/momm"
14
14
  spec.license = "MIT"
15
15
 
@@ -18,14 +18,10 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "httparty", ">= 0.12.0"
22
- spec.add_dependency "json"
23
-
24
- spec.add_development_dependency "redis"
25
- spec.add_development_dependency "dalli"
26
- spec.add_development_dependency "redis-namespace"
27
- spec.add_development_dependency "rack-test"
28
- spec.add_development_dependency "rake"
29
- spec.add_development_dependency "sinatra"
21
+ spec.add_development_dependency "dalli", "2.7.6"
22
+ spec.add_development_dependency "redis-namespace", "1.5.2"
23
+ spec.add_development_dependency "rack-test", "0.6.3"
24
+ spec.add_development_dependency "rake", "10.5.0"
25
+ spec.add_development_dependency "sinatra", "1.4.7"
30
26
  spec.add_development_dependency "rspec", "3.4.0"
31
27
  end
@@ -23,7 +23,7 @@ describe Momm::Feeds::ECB do
23
23
 
24
24
  describe "#fetching_url" do
25
25
  it 'should not be nil' do
26
- expect(Momm::Feeds::ECB.instance.fetching_url).to be_a String
26
+ expect(Momm::Feeds::ECB.instance.fetching_url).to be_a URI::HTTPS
27
27
  end
28
28
  end
29
29
 
@@ -10,14 +10,6 @@ describe Momm do
10
10
  expect(Momm).to respond_to :exchange
11
11
  end
12
12
 
13
- it "should respond to exchange_from_gbp_to_usd" do
14
- expect(Momm).to respond_to :exchange_from_gbp_to_usd
15
- end
16
-
17
- it "should respond to exchange_rate_from_gbp_to_usd" do
18
- expect(Momm).to respond_to :exchange_rate_from_gbp_to_usd
19
- end
20
-
21
13
  it "should respond to update!" do
22
14
  expect(Momm).to respond_to :update!
23
15
  end
@@ -15015,7 +15015,7 @@ jQuery(function(){
15015
15015
  money: $('.momm-money').val(),
15016
15016
  date: $('.momm-date').val()
15017
15017
  }, function(result){
15018
- $('.momm-exchange').text(result);
15018
+ $('.momm-exchange').text(result.rate);
15019
15019
  });
15020
15020
  };
15021
15021
 
@@ -15027,4 +15027,4 @@ jQuery(function(){
15027
15027
  load_exchanged();
15028
15028
 
15029
15029
  $(".mom-ele").on('change', load_exchanged);
15030
- });
15030
+ });
metadata CHANGED
@@ -1,127 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: momm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jingkai He
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-14 00:00:00.000000000 Z
11
+ date: 2016-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: httparty
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 0.12.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.12.0
27
- - !ruby/object:Gem::Dependency
28
- name: json
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: redis
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
13
  - !ruby/object:Gem::Dependency
56
14
  name: dalli
57
15
  requirement: !ruby/object:Gem::Requirement
58
16
  requirements:
59
- - - ">="
17
+ - - '='
60
18
  - !ruby/object:Gem::Version
61
- version: '0'
19
+ version: 2.7.6
62
20
  type: :development
63
21
  prerelease: false
64
22
  version_requirements: !ruby/object:Gem::Requirement
65
23
  requirements:
66
- - - ">="
24
+ - - '='
67
25
  - !ruby/object:Gem::Version
68
- version: '0'
26
+ version: 2.7.6
69
27
  - !ruby/object:Gem::Dependency
70
28
  name: redis-namespace
71
29
  requirement: !ruby/object:Gem::Requirement
72
30
  requirements:
73
- - - ">="
31
+ - - '='
74
32
  - !ruby/object:Gem::Version
75
- version: '0'
33
+ version: 1.5.2
76
34
  type: :development
77
35
  prerelease: false
78
36
  version_requirements: !ruby/object:Gem::Requirement
79
37
  requirements:
80
- - - ">="
38
+ - - '='
81
39
  - !ruby/object:Gem::Version
82
- version: '0'
40
+ version: 1.5.2
83
41
  - !ruby/object:Gem::Dependency
84
42
  name: rack-test
85
43
  requirement: !ruby/object:Gem::Requirement
86
44
  requirements:
87
- - - ">="
45
+ - - '='
88
46
  - !ruby/object:Gem::Version
89
- version: '0'
47
+ version: 0.6.3
90
48
  type: :development
91
49
  prerelease: false
92
50
  version_requirements: !ruby/object:Gem::Requirement
93
51
  requirements:
94
- - - ">="
52
+ - - '='
95
53
  - !ruby/object:Gem::Version
96
- version: '0'
54
+ version: 0.6.3
97
55
  - !ruby/object:Gem::Dependency
98
56
  name: rake
99
57
  requirement: !ruby/object:Gem::Requirement
100
58
  requirements:
101
- - - ">="
59
+ - - '='
102
60
  - !ruby/object:Gem::Version
103
- version: '0'
61
+ version: 10.5.0
104
62
  type: :development
105
63
  prerelease: false
106
64
  version_requirements: !ruby/object:Gem::Requirement
107
65
  requirements:
108
- - - ">="
66
+ - - '='
109
67
  - !ruby/object:Gem::Version
110
- version: '0'
68
+ version: 10.5.0
111
69
  - !ruby/object:Gem::Dependency
112
70
  name: sinatra
113
71
  requirement: !ruby/object:Gem::Requirement
114
72
  requirements:
115
- - - ">="
73
+ - - '='
116
74
  - !ruby/object:Gem::Version
117
- version: '0'
75
+ version: 1.4.7
118
76
  type: :development
119
77
  prerelease: false
120
78
  version_requirements: !ruby/object:Gem::Requirement
121
79
  requirements:
122
- - - ">="
80
+ - - '='
123
81
  - !ruby/object:Gem::Version
124
- version: '0'
82
+ version: 1.4.7
125
83
  - !ruby/object:Gem::Dependency
126
84
  name: rspec
127
85
  requirement: !ruby/object:Gem::Requirement
@@ -136,7 +94,7 @@ dependencies:
136
94
  - - '='
137
95
  - !ruby/object:Gem::Version
138
96
  version: 3.4.0
139
- description: A Currency Exchange Calculator
97
+ description: A currency exchange calculator build in pure Ruby.
140
98
  email:
141
99
  - jaxihe@gmail.com
142
100
  executables: