deranged 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 188ec8f315e2306e3915e8645d7a50bb7841d5cb
4
+ data.tar.gz: 6598c8fc2058e34ef81db718107f231c87da98c9
5
+ SHA512:
6
+ metadata.gz: cb14a615d499c39a471e69973a720d9aa3d686e71b665866654a2e629920e590a053946af02153d5583479b6d2e5ac3b9ef2527f8294f2fac54fbd284c66d709
7
+ data.tar.gz: dde504478b63922b4f4d53a0a8e25c5c0dafca145dd90d7e3f38ed42f6be79550edf48abc2a296e9d8a54ee4fbe0755511d5963753dd330fae41848d7c408a3d
data/MIT-LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2011 by Biola University
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,37 @@
1
+ Deranged
2
+ ========
3
+
4
+ A natural language range parser with ActiveModel helpers.
5
+
6
+ Installation
7
+ ------------
8
+
9
+ Just add `gem 'deranged'` to your `Gemfile` and `bundle install` it.
10
+
11
+ Usage
12
+ -----
13
+
14
+ ```ruby
15
+ Deranged.parse('2010-2016') #=> 2010..2016
16
+ Deranged.parse('1,000,000 to 1,000,000,000 dollars') #=> 1000000..1000000000
17
+ Deranged::Parser.new('between .42 and 42').to_range #=> 0.42..42.0
18
+ Deranged.format(1..10) #=> "1-10"
19
+ Deranged::Formatter.new(3..33.3333333).to_s #=> "3-33.3333333"
20
+
21
+ class JobOpportunity
22
+ include Deranged::Attrs
23
+ attr_accessor :salary_range
24
+ derange :salary_range
25
+ end
26
+
27
+ job = JobOpportunity.new
28
+ job.salary_range_string = '$75,000 - $85,000'
29
+ job.salary_range #=> 75000..85000
30
+ job.salary_range_string #=> "75000-85000"
31
+ ```
32
+
33
+ TODO:
34
+ -----
35
+
36
+ - Tests
37
+ - Custom formatting
@@ -0,0 +1,21 @@
1
+ module Deranged
2
+ module Attrs
3
+ def self.included base
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ def derange(range_attr_name, string_attr_name = nil)
9
+ string_attr_name ||= :"#{range_attr_name}_string"
10
+
11
+ define_method(string_attr_name) do
12
+ Formatter.new(send(range_attr_name)).to_s
13
+ end
14
+
15
+ define_method("#{string_attr_name}=") do |string|
16
+ send(:"#{range_attr_name}=", Parser.new(string).to_range)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ module Deranged
2
+ class Formatter
3
+ def initialize(range)
4
+ @range = range
5
+ end
6
+
7
+ # TODO: support multiple and custom formats
8
+ def to_s
9
+ [range.min, range.max].uniq.join('-')
10
+ end
11
+
12
+ private
13
+
14
+ attr_reader :range
15
+ end
16
+ end
@@ -0,0 +1,45 @@
1
+ module Deranged
2
+ class Parser
3
+ class InvalidRangeString < ArgumentError; end
4
+
5
+ def initialize(string)
6
+ @string = string.to_s
7
+ end
8
+
9
+ def to_range
10
+ return nil if numbers.empty?
11
+ numbers.first..numbers.last
12
+ end
13
+
14
+ def to_range!
15
+ raise InvalidRangeString if to_range.nil?
16
+ to_range
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :string
22
+
23
+ def numbers
24
+ @numbers ||= sanitized_string.split.map(&cast_method)
25
+ end
26
+
27
+ # TODO: support non-US number formats
28
+ def sanitized_string
29
+ @sanitized_string ||= (
30
+ str = string.dup
31
+ # Remove thousand separator commas
32
+ str.gsub! /(\d)(,)(?=\d{3}\b)/, '\1'
33
+
34
+ # replace any non number or decimal characters with spaces
35
+ str.gsub! /[^0-9\.]/, ' '
36
+
37
+ str
38
+ )
39
+ end
40
+
41
+ def cast_method
42
+ sanitized_string =~ /\.[0-9]/ ? :to_f : :to_i
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,3 @@
1
+ module Deranged
2
+ VERSION = '0.1.0'
3
+ end
data/lib/deranged.rb ADDED
@@ -0,0 +1,13 @@
1
+ module Deranged
2
+ require 'deranged/formatter'
3
+ require 'deranged/parser'
4
+ require 'deranged/attrs'
5
+
6
+ def self.parse(string)
7
+ Parser.new(string).to_range
8
+ end
9
+
10
+ def self.format(range)
11
+ Formatter.new(range).to_s
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: deranged
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Adam Crownoble
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-05-30 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Makes it easy to convert strings to ranges and use them in your forms
14
+ email: adam@codenoble.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - MIT-LICENSE
20
+ - README.md
21
+ - lib/deranged.rb
22
+ - lib/deranged/attrs.rb
23
+ - lib/deranged/formatter.rb
24
+ - lib/deranged/parser.rb
25
+ - lib/deranged/version.rb
26
+ homepage: https://github.com/codenoble/deranged
27
+ licenses:
28
+ - MIT
29
+ metadata: {}
30
+ post_install_message:
31
+ rdoc_options: []
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubyforge_project:
46
+ rubygems_version: 2.5.1
47
+ signing_key:
48
+ specification_version: 4
49
+ summary: A natuaral language range parser and model helper
50
+ test_files: []