spanner 0.0.2 → 0.0.3

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: '082aae9dadaa848bff6868d920d15d9cf837c2d78409272621c0c5ce0f39f173'
4
+ data.tar.gz: e4cd05bbfa0e2e1acfa3357dc82093d5f618a3c6acbf9f5ca415298065d80b2e
5
+ SHA512:
6
+ metadata.gz: 0ebb8c6f50e970f2f551760079d8b81fca888d103c96edf8c953ad0386ce60a0309219975ddc925fe36f508b19bb23c9af03fa017fc8b28858c94a98402ae881
7
+ data.tar.gz: 4086710464fa7280770f7fdb8e6b081755798c8eb513d7119e774604ebe2e431261a0a242b45300e2cbf61d9525be04df71037588bae8e1206b509fa2eac5798
data/.gitignore ADDED
@@ -0,0 +1,8 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in spanner.gemspec
6
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2019 joshbuddy
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -1,14 +1,15 @@
1
- = Spanner
1
+ # Spanner
2
2
 
3
3
  Easy way to parse natural language time spans as periods expressed in seconds. Supports float point notions of spans as well.
4
4
 
5
- == Usage
5
+ ## Usage
6
6
 
7
- require 'spanner'
8
-
9
- Spanner.parse('1s')
10
- => 1
11
-
12
- Spanner.parse('23 hours 12 minutes')
13
- => 83520
7
+ ```ruby
8
+ require 'spanner'
14
9
 
10
+ Spanner.parse('1s')
11
+ # 1
12
+
13
+ Spanner.parse('23 hours 12 minutes')
14
+ # 83520
15
+ ```
data/Rakefile CHANGED
@@ -1,28 +1,10 @@
1
- begin
2
- require 'jeweler'
3
- Jeweler::Tasks.new do |s|
4
- s.name = "spanner"
5
- s.description = s.summary = "Natural language time span parsing"
6
- s.email = "joshbuddy@gmail.com"
7
- s.homepage = "http://github.com/joshbuddy/spanner"
8
- s.authors = ["Joshua Hull"]
9
- s.files = FileList["[A-Z]*", "{lib,spec}/**/*"]
10
- end
11
- Jeweler::GemcutterTasks.new
12
- rescue LoadError
13
- puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
14
- end
15
-
16
- require 'spec'
17
- require 'spec/rake/spectask'
18
- task :spec => 'spec:all'
19
- namespace(:spec) do
20
- Spec::Rake::SpecTask.new(:all) do |t|
21
- t.spec_opts ||= []
22
- t.spec_opts << "-rubygems -rdirge"
23
- t.spec_opts << "--options" << "spec/spec.opts"
24
- t.spec_files = FileList['spec/**/*_spec.rb']
25
- end
26
-
27
- end
28
-
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
data/lib/spanner.rb CHANGED
@@ -1,46 +1,46 @@
1
- require 'date'
1
+ require "spanner/version"
2
+ require "date"
2
3
 
3
4
  class Spanner
4
-
5
5
  ParseError = Class.new(RuntimeError)
6
6
 
7
7
  def self.parse(str, opts = nil)
8
8
  Spanner.new(opts).parse(str)
9
9
  end
10
-
10
+
11
11
  attr_reader :value, :raise_on_error, :from
12
-
12
+
13
13
  def initialize(opts)
14
14
  @value = value
15
15
  @on_error = opts && opts.key?(:on_error) ? opts[:on_error] : :raise
16
16
  @length_of_month = opts && opts[:length_of_month]
17
-
17
+
18
18
  @from = if opts && opts.key?(:from)
19
- case opts[:from]
20
- when :now
21
- Time.new.to_i
22
- else
23
- opts[:from].to_i
24
- end
25
- else
26
- 0
27
- end
19
+ case opts[:from]
20
+ when :now
21
+ Time.new.to_i
22
+ else
23
+ opts[:from].to_i
24
+ end
25
+ else
26
+ 0
27
+ end
28
28
  end
29
-
29
+
30
30
  def self.days_in_month(year, month)
31
- (Date.new(year, 12, 31) << (12-month)).day
31
+ (Date.new(year, 12, 31) << (12 - month)).day
32
32
  end
33
-
33
+
34
34
  def length_of_month
35
35
  @length_of_month ||= Spanner.parse("#{Spanner.days_in_month(Time.new.year, Time.new.month)} days")
36
36
  end
37
-
37
+
38
38
  def error(err)
39
39
  if on_error == :raise
40
40
  raise ParseError.new(err)
41
41
  end
42
42
  end
43
-
43
+
44
44
  def parse(value)
45
45
  parts = []
46
46
  part_contextualized = nil
@@ -54,39 +54,38 @@ class Spanner
54
54
  error "Part has already been contextualized with #{part_contextualized}"
55
55
  return nil
56
56
  end
57
-
57
+
58
58
  if parts.empty?
59
59
  parts << 1
60
60
  end
61
-
61
+
62
62
  # part is context
63
63
  multiplier = case part
64
- when 's', 'sec', 'seconds' then 1
65
- when 'h', 'hours', 'hrs' then 3600
66
- when 'm', 'min', 'minutes' then 60
67
- when 'd', 'days' then 86_400
68
- when 'w', 'wks', 'weeks' then 604_800
69
- when 'months', 'month', 'M' then length_of_month
70
- when 'years', 'y' then 31_556_926
71
- when /\As/ then 1
72
- when /\Am/ then 60
73
- when /\Ah/ then 86_400
74
- when /\Aw/ then 604_800
75
- when /\AM/ then length_of_month
76
- when /\Ay/ then 31_556_926
77
- end
78
-
64
+ when "s", "sec", "seconds" then 1
65
+ when "h", "hours", "hrs" then 3600
66
+ when "m", "min", "minutes" then 60
67
+ when "d", "days" then 86_400
68
+ when "w", "wks", "weeks" then 604_800
69
+ when "months", "month", "M" then length_of_month
70
+ when "years", "y" then 31_556_926
71
+ when /\As/ then 1
72
+ when /\Am/ then 60
73
+ when /\Ah/ then 86_400
74
+ when /\Aw/ then 604_800
75
+ when /\AM/ then length_of_month
76
+ when /\Ay/ then 31_556_926
77
+ end
78
+
79
79
  part_contextualized = part
80
80
  parts << (parts.pop * multiplier)
81
81
  end
82
82
  end
83
-
83
+
84
84
  if parts.empty?
85
85
  nil
86
86
  else
87
- value = parts.inject(from) {|s, p| s += p}
87
+ value = parts.inject(from) { |s, p| s += p }
88
88
  value.ceil == value ? value.ceil : value
89
89
  end
90
90
  end
91
-
92
- end
91
+ end
@@ -0,0 +1,3 @@
1
+ class Spanner
2
+ VERSION = "0.0.3"
3
+ end
data/spanner.gemspec ADDED
@@ -0,0 +1,27 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "spanner/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "spanner"
8
+ spec.version = Spanner::VERSION
9
+ spec.authors = ["joshbuddy"]
10
+ spec.email = ["joshbuddy@gmail.com"]
11
+
12
+ spec.summary = "Natural language time span parsing"
13
+ spec.description = "Natural language time span parsing"
14
+ spec.homepage = "https://github.com/joshbuddy/spanner"
15
+ spec.license = "MIT"
16
+
17
+ # Specify which files should be added to the gem when it is released.
18
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
+ spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ end
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.17"
25
+ spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "minitest", "~> 5.0"
27
+ end
metadata CHANGED
@@ -1,69 +1,93 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: spanner
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 2
9
- version: 0.0.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
10
5
  platform: ruby
11
- authors:
12
- - Joshua Hull
6
+ authors:
7
+ - joshbuddy
13
8
  autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
-
17
- date: 2010-05-03 00:00:00 -04:00
18
- default_executable:
19
- dependencies: []
20
-
11
+ date: 2019-07-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.17'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.17'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
21
55
  description: Natural language time span parsing
22
- email: joshbuddy@gmail.com
56
+ email:
57
+ - joshbuddy@gmail.com
23
58
  executables: []
24
-
25
59
  extensions: []
26
-
27
- extra_rdoc_files:
28
- - README.rdoc
29
- files:
30
- - README.rdoc
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - Gemfile
64
+ - LICENSE.txt
65
+ - README.md
31
66
  - Rakefile
32
- - VERSION
33
67
  - lib/spanner.rb
34
- - spec/spanner_spec.rb
35
- - spec/spec.opts
36
- - spec/spec_helper.rb
37
- has_rdoc: true
38
- homepage: http://github.com/joshbuddy/spanner
39
- licenses: []
40
-
68
+ - lib/spanner/version.rb
69
+ - spanner.gemspec
70
+ homepage: https://github.com/joshbuddy/spanner
71
+ licenses:
72
+ - MIT
73
+ metadata: {}
41
74
  post_install_message:
42
- rdoc_options:
43
- - --charset=UTF-8
44
- require_paths:
75
+ rdoc_options: []
76
+ require_paths:
45
77
  - lib
46
- required_ruby_version: !ruby/object:Gem::Requirement
47
- requirements:
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
48
80
  - - ">="
49
- - !ruby/object:Gem::Version
50
- segments:
51
- - 0
52
- version: "0"
53
- required_rubygems_version: !ruby/object:Gem::Requirement
54
- requirements:
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
55
85
  - - ">="
56
- - !ruby/object:Gem::Version
57
- segments:
58
- - 0
59
- version: "0"
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
60
88
  requirements: []
61
-
62
- rubyforge_project:
63
- rubygems_version: 1.3.6
89
+ rubygems_version: 3.0.1
64
90
  signing_key:
65
- specification_version: 3
91
+ specification_version: 4
66
92
  summary: Natural language time span parsing
67
- test_files:
68
- - spec/spanner_spec.rb
69
- - spec/spec_helper.rb
93
+ test_files: []
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.0.2
data/spec/spanner_spec.rb DELETED
@@ -1,40 +0,0 @@
1
- require ~'spec_helper'
2
-
3
- describe Spanner do
4
-
5
- it "should return nil for empty strings" do
6
- Spanner.parse('').should be_nil
7
- end
8
-
9
- it "should assume seconds" do
10
- Spanner.parse('1').should == 1
11
- end
12
-
13
- #simple
14
- { '.5s' => 0.5, '1s' => 1, '1.5s' => 1.5, '1m' => 60, '1.5m' => 90, '1d' => 86400, '1.7233312d' => 148895.81568, '1M' => Spanner.days_in_month(Time.new.year, Time.new.month) * 24 * 60 * 60 }.each do |input, output|
15
- it "should parse #{input} and return #{output}" do
16
- Spanner.parse(input).should == output
17
- end
18
- end
19
-
20
- #complex
21
- { '1m23s' => 83 }.each do |input, output|
22
- it "should parse #{input} and return #{output}" do
23
- Spanner.parse(input).should == output
24
- end
25
- end
26
-
27
- it "should let you set the length of a month" do
28
- Spanner.parse("4 months", :length_of_month => 1234).should == 4936
29
- end
30
-
31
- it "should accept time as from option" do
32
- now = Time.new
33
- Spanner.parse('23s', :from => now).should == now.to_i + 23
34
- end
35
-
36
- it "should accept special :now as from option" do
37
- Spanner.parse('23s', :from => :now).should == Time.new.to_i + 23
38
- end
39
-
40
- end
data/spec/spec.opts DELETED
@@ -1,7 +0,0 @@
1
- --colour
2
- --format
3
- specdoc
4
- --loadby
5
- mtime
6
- --reverse
7
- --backtrace
data/spec/spec_helper.rb DELETED
@@ -1 +0,0 @@
1
- require ~'../lib/spanner'