time-elapsed 0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 92bba8e887a6e34be29d882acb9bb277f0c29d36
4
+ data.tar.gz: 0ade0e672b19e5545c72e61276e7c043160e69f4
5
+ SHA512:
6
+ metadata.gz: c160353b58fb8c35460ce4e858fc54204eda7ae2c99582c4f3281749e1d6deb0e78f86521a044f3fbaeb1a2f99645f8884725583ca833bf28e37c6e0f68b3846
7
+ data.tar.gz: 7e1d84f7eff3aae9a71dd41f3314b01336589a97f1ccc9cf175ca91f4082cd680164f54e4b39f686a35eeba27554875854a7013c4434f316f3889e38aabe675c
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in time-elapsed.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,17 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ time-elapsed (0.0.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ rake (10.0.4)
10
+
11
+ PLATFORMS
12
+ ruby
13
+
14
+ DEPENDENCIES
15
+ bundler (~> 1.3)
16
+ rake
17
+ time-elapsed!
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 TODO: Write your name
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # Time::Elapsed
2
+
3
+ Adds elapsed time functionality to ruby Time objects
4
+
5
+ ## Installation
6
+ ```
7
+ gem install time-elapsed
8
+ ```
9
+ ## Usage
10
+ ```
11
+ require 'time-elapsed'
12
+ ```
13
+ ## Examples
14
+ ```
15
+ Time.now.plus('2 minutes 32 seconds')
16
+ Time.now.minus('3 weeks and 3 days and 32 hours')
17
+ Time.now + Time::Elapsed.time('34m30s')
18
+ ```
19
+ ## Contributing
20
+
21
+ 1. Fork it
22
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
23
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
24
+ 4. Push to the branch (`git push origin my-new-feature`)
25
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,41 @@
1
+ class Time
2
+ module Elapsed
3
+
4
+ module Parser
5
+ LAST_REGEX = /
6
+ ((?<years>[\d]+)y)?
7
+ ((?<weeks>[\d]+)w)?
8
+ ((?<days>[\d]+)d)?
9
+ ((?<hours>[\d]+)h)?
10
+ ((?<minutes>[\d]+)m)?
11
+ ((?<seconds>[\d]+)s?)? #Defaults to seconds
12
+ /ix
13
+
14
+ TIME_TO_SECONDS = {
15
+ 'years' => 31536000,
16
+ 'weeks' => 604800,
17
+ 'days' => 86400,
18
+ 'hours' => 3600,
19
+ 'minutes' => 60,
20
+ 'seconds' => 1
21
+ }
22
+
23
+ # @param [String] time_str User string to parse
24
+ # @return [Fixnum] parsed time in seconds
25
+ def self.parse_time_str(time_str, last_regex = LAST_REGEX)
26
+ raise ArgumentError unless last_regex.is_a?(Regexp)
27
+ keys = last_regex.names
28
+ matches = time_str.gsub(/\s+/, '').scan(last_regex)
29
+ ago_hash = matches.inject({}) do |h, m|
30
+ m.map!(&:to_i) #Expect zeros
31
+ match_hash = Hash[*keys.zip(m).flatten]
32
+ h.merge(match_hash){|k, old_v, new_v| [old_v, new_v].max }
33
+ end
34
+ ago_hash.merge(TIME_TO_SECONDS) do |k, base, multiplier|
35
+ base*multiplier
36
+ end.values.inject(&:+)
37
+ end
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,5 @@
1
+ class Time
2
+ module Elapsed
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
@@ -0,0 +1,37 @@
1
+ require 'time'
2
+
3
+ class Time
4
+ # @param [String] time_str time string to be added
5
+ def plus(time_str)
6
+ self + Elapsed.time(time_str)
7
+ end
8
+ # @param [String] time_str time string to be subtracted
9
+ def minus(time_str)
10
+ self - Elapsed.time(time_str)
11
+ end
12
+
13
+ module Elapsed
14
+ # @param [String] time_str time string to be parsed
15
+ # @return [Fixnum] time_str in seconds
16
+ def self.time(time_str)
17
+ not_zero Parser.parse_time_str(time_str)
18
+ end
19
+
20
+ private
21
+ # Allows number Strings or Fixnums
22
+ # Raise ArgumentError unless the number is not zero
23
+ # always returns Integer
24
+ def self.not_zero(i)
25
+ i_dup = i.to_i #not really a dup since Fixnum is immutable
26
+ if i_dup.zero?
27
+ raise ArgumentError, 'Elapsed time not parsable'
28
+ else
29
+ return i_dup
30
+ end
31
+ end
32
+ end
33
+
34
+ end
35
+
36
+ require File.expand_path('../elapsed/version.rb', __FILE__)
37
+ require File.expand_path('../elapsed/parser/parser.rb', __FILE__)
@@ -0,0 +1 @@
1
+ require File.expand_path('../time/elapsed.rb', __FILE__)
data/spec/elapsed.rb ADDED
@@ -0,0 +1,29 @@
1
+ require 'time-elapsed'
2
+ describe Time do
3
+ describe '.plus' do
4
+ it 'adds time to value' do
5
+ Time.at(0).plus('3days').to_i.should == 259200
6
+ end
7
+ end
8
+
9
+ describe '.minus' do
10
+ it 'subtracts time to value' do
11
+ Time.at(259200 + 1234).minus('3 days').to_i.should == 1234
12
+ end
13
+ end
14
+ end
15
+
16
+ describe Time::Elapsed do
17
+ describe '.time' do
18
+ it 'creates a parsed string' do
19
+ Time::Elapsed.time('3 weeks').should == 1814400
20
+ end
21
+ it 'raises an error on zero values' do
22
+ expect { Time::Elapsed.time('0 weeks') }.to raise_error
23
+ end
24
+ it 'defaults to seconds' do
25
+ Time::Elapsed.time('3m3').should == 183
26
+ Time::Elapsed.time('3').should == 3
27
+ end
28
+ end
29
+ end
data/spec/parser.rb ADDED
@@ -0,0 +1,24 @@
1
+ require 'time-elapsed'
2
+ describe Time::Elapsed::Parser do
3
+ p = Time::Elapsed::Parser
4
+ describe '.parse_time_str' do
5
+ it 'should correctly parse test cases' do
6
+ p.parse_time_str('32s').should == 32
7
+ p.parse_time_str('5 minutes 4seconds').should == 304
8
+ p.parse_time_str('6 weeks of vacation').should == 3628800
9
+ p.parse_time_str('12 years ago').should == 378432000
10
+ p.parse_time_str('12days 3 minutes and 6hrs2sec').should == 1058582
11
+ p.parse_time_str('13minutes').should == 780
12
+ p.parse_time_str('2 hours').should == 7200
13
+ p.parse_time_str('13').should == 13
14
+ p.parse_time_str('3 weeks 2days 4hrs 10minutes 2 secs').should == 2002202
15
+ end
16
+
17
+ it 'should return zero for no elapsed time and non-parsable garbage' do
18
+ p.parse_time_str('afea').should == 0
19
+ p.parse_time_str('0s').should == 0
20
+ p.parse_time_str('0 weeks of vacation').should == 0
21
+ end
22
+ end
23
+ end
24
+
@@ -0,0 +1,22 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'time/elapsed/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'time-elapsed'
8
+ spec.version = Time::Elapsed::VERSION
9
+ spec.authors = ['kcen']
10
+ spec.description = %q{Adds elapsed time functionality to rubys time}
11
+ spec.summary = %q{Adds elapsed time functionality to rubys time}
12
+ spec.homepage = 'https://github.com/kcen/time-elapsed'
13
+ spec.license = 'MIT'
14
+
15
+ spec.files = `git ls-files`.split($/)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ['lib']
19
+
20
+ spec.add_development_dependency 'bundler', '~> 1.3'
21
+ spec.add_development_dependency 'rake'
22
+ end
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: time-elapsed
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - kcen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2013-08-14 00:00:00 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ prerelease: false
17
+ requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: "1.3"
22
+ type: :development
23
+ version_requirements: *id001
24
+ - !ruby/object:Gem::Dependency
25
+ name: rake
26
+ prerelease: false
27
+ requirement: &id002 !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - &id003
30
+ - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id002
35
+ description: Adds elapsed time functionality to rubys time
36
+ email:
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files: []
42
+
43
+ files:
44
+ - .gitignore
45
+ - Gemfile
46
+ - Gemfile.lock
47
+ - LICENSE
48
+ - README.md
49
+ - Rakefile
50
+ - lib/time-elapsed.rb
51
+ - lib/time/elapsed.rb
52
+ - lib/time/elapsed/parser/parser.rb
53
+ - lib/time/elapsed/version.rb
54
+ - spec/elapsed.rb
55
+ - spec/parser.rb
56
+ - time-elapsed.gemspec
57
+ homepage: https://github.com/kcen/time-elapsed
58
+ licenses:
59
+ - MIT
60
+ metadata: {}
61
+
62
+ post_install_message:
63
+ rdoc_options: []
64
+
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - *id003
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - *id003
73
+ requirements: []
74
+
75
+ rubyforge_project:
76
+ rubygems_version: 2.0.6
77
+ signing_key:
78
+ specification_version: 4
79
+ summary: Adds elapsed time functionality to rubys time
80
+ test_files:
81
+ - spec/elapsed.rb
82
+ - spec/parser.rb