momm 1.0.1 → 2.0.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
  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: