rack-si 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source :rubygems
2
+
3
+ gemspec :path => '.'
4
+
5
+ gem 'herbalist', :path => '~/herbalist'
data/README.markdown ADDED
File without changes
@@ -0,0 +1,5 @@
1
+ module Rack
2
+ class SI
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
data/lib/rack/si.rb ADDED
@@ -0,0 +1,40 @@
1
+ require 'herbalist'
2
+ Herbalist.basic = true
3
+
4
+ module Rack
5
+
6
+ # A Rack middleware for converting params to base SI units
7
+ #
8
+ class Rack::SI
9
+ BASE_UNITS = [:metre, :metres, :meter, :meters, :litre, :litres, :liter, :liters, :joule, :joules, :gram, :grams, :watt, :watts]
10
+
11
+ def initialize(app)
12
+ @app = app
13
+ end
14
+
15
+ def call(env)
16
+ convert_params(env)
17
+ @app.call(env)
18
+ end
19
+
20
+ def convert_params(env)
21
+ params = ::Rack::Request.new(env).params
22
+ env['si.params'] = params.inject({}) do |hsh, (name, value)|
23
+ if measurement = Herbalist.parse(value)
24
+ value = normalize(measurement)
25
+ end
26
+ hsh[name] = value
27
+ hsh
28
+ end
29
+ end
30
+
31
+ def normalize(measurement)
32
+ group_name = Alchemist.conversion_table.keys.find do |k|
33
+ Alchemist.conversion_table[k].include?(measurement.unit_name)
34
+ end
35
+ group = Alchemist.conversion_table[group_name]
36
+ base_unit = BASE_UNITS.find { |u| group.include?(u) }
37
+ measurement.to.send base_unit
38
+ end
39
+ end
40
+ end
data/rack-si.gemspec ADDED
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/rack/si/version', __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = 'rack-si'
6
+ s.version = Rack::SI::VERSION
7
+ s.author = 'Derek Kastner'
8
+ s.email = ['dkastner@gmail.com']
9
+ s.summary = 'Convert any measurement params to base SI units'
10
+ s.description = 'Choose params that are converted with Herbalist to base SI units (meters, grams, etc)'
11
+ s.homepage = 'https://github.com/brighterplanet/carbon'
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
+ s.require_paths = ["lib"]
16
+
17
+ #s.add_runtime_dependency 'herbalist'
18
+ s.add_runtime_dependency 'rack'
19
+
20
+ s.add_development_dependency 'rack-test'
21
+ s.add_development_dependency 'rspec'
22
+ end
data/spec/helper.rb ADDED
@@ -0,0 +1,3 @@
1
+ require 'bundler'
2
+
3
+ Bundler.setup
data/spec/si_spec.rb ADDED
@@ -0,0 +1,54 @@
1
+ require 'rack/si'
2
+ require 'rack/test'
3
+
4
+ describe Rack::SI do
5
+ include Rack::Test::Methods
6
+
7
+ def app
8
+ Rack::SI.new lambda { |env| [200, {}, []] }
9
+ end
10
+
11
+ describe '#call' do
12
+ it 'returns control to the app' do
13
+ get '/foo'
14
+ last_response.should be_ok
15
+ end
16
+
17
+ it 'ignores missing parameters' do
18
+ post '/bar'
19
+ last_request.env['si.params'].should == {}
20
+ end
21
+
22
+ it 'does not convert non-unit params' do
23
+ post '/automobile_trips', {
24
+ 'destination' => '2,3',
25
+ 'distance' => 233
26
+ }
27
+ last_request.env['si.params'].should ==({
28
+ 'destination' => '2,3',
29
+ 'distance' => '233'
30
+ })
31
+ end
32
+
33
+ it 'converts any unit-ed params to base SI units' do
34
+ post '/automobile_trips', {
35
+ 'destination' => '2,3',
36
+ 'distance' => '233 miles'
37
+ }
38
+ last_request.env['si.params']['destination'].should == '2,3'
39
+ last_request.env['si.params']['distance'].to_f.should == 374977.152
40
+ end
41
+
42
+ #it 'converts compound measurements' do
43
+ #post '/automobile_trips', {
44
+ #'fuel_efficiency' => '54 miles per gallon'
45
+ #}
46
+ #last_request.env['si.params']['fuel_efficiency'].to_f.should == 86904.576
47
+ #end
48
+
49
+ #it 'converts dates' do
50
+
51
+ #end
52
+ end
53
+ end
54
+
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-si
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Derek Kastner
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-27 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rack
16
+ requirement: &2166367960 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2166367960
25
+ - !ruby/object:Gem::Dependency
26
+ name: rack-test
27
+ requirement: &2166383900 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2166383900
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ requirement: &2166383480 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2166383480
47
+ description: Choose params that are converted with Herbalist to base SI units (meters,
48
+ grams, etc)
49
+ email:
50
+ - dkastner@gmail.com
51
+ executables: []
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - .gitignore
56
+ - Gemfile
57
+ - README.markdown
58
+ - lib/rack/si.rb
59
+ - lib/rack/si/version.rb
60
+ - rack-si.gemspec
61
+ - spec/helper.rb
62
+ - spec/si_spec.rb
63
+ homepage: https://github.com/brighterplanet/carbon
64
+ licenses: []
65
+ post_install_message:
66
+ rdoc_options: []
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ requirements: []
82
+ rubyforge_project:
83
+ rubygems_version: 1.8.11
84
+ signing_key:
85
+ specification_version: 3
86
+ summary: Convert any measurement params to base SI units
87
+ test_files:
88
+ - spec/helper.rb
89
+ - spec/si_spec.rb