motion-duration 0.0.1

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: 4cbcecf706355f4e25da91d2fb26273343e0dc5c
4
+ data.tar.gz: 5c27161964749bbcc3ddfd0a036ad8fb11e47a53
5
+ SHA512:
6
+ metadata.gz: bcc4a70e1b9a18e8df7b374121a4d2fae377bdd20e265d381db0f202f67abd098f3a884c4f1e4987327cf30e497175b23f579b3f9c449464d9d5e353cda7a6ce
7
+ data.tar.gz: ee785e180abdd260d40080b06f41971d04794d087dc47b3881e5bf3dc34d33eb3e89654223e50a905dea1fa3876e2b9fe90266fb9105b29aea2d478d489f047a
data/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # motion-duration
2
+
3
+ [![Build Status](https://travis-ci.org/OTGApps/motion-duration.svg)](https://travis-ci.org/OTGApps/motion-duration)
4
+
5
+ Motion::Duration is an immutable type that represents some amount of time with accuracy in seconds.
6
+
7
+ It was adapted for RubyMotion from [ruby-duration](https://github.com/peleteiro/ruby-duration) by Jose Peleteiro since it required ActiveRecord, iso8601, and i18n.
8
+
9
+ This version currently lacks i18n, iso8601, and formatting support.
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'motion-duration'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install motion-duration
24
+
25
+ ## Usage
26
+
27
+ ```ruby
28
+ Duration.new(100) => #<Duration: minutes=1, seconds=40, total=100>
29
+ Duration.new(:hours => 5, :minutes => 70) => #<Duration: hours=6, minutes=10, total=22200>
30
+ ```
31
+
32
+ ## Contributing
33
+
34
+ 1. Fork it
35
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
36
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
37
+ 4. Push to the branch (`git push origin my-new-feature`)
38
+ 5. Create new Pull Request
39
+
40
+ ## Original License
41
+
42
+ Copyright (c) 2010 Jose Peleteiro
43
+
44
+ Permission is hereby granted, free of charge, to any person obtaining
45
+ a copy of this software and associated documentation files (the
46
+ "Software"), to deal in the Software without restriction, including
47
+ without limitation the rights to use, copy, modify, merge, publish,
48
+ distribute, sublicense, and/or sell copies of the Software, and to
49
+ permit persons to whom the Software is furnished to do so, subject to
50
+ the following conditions:
51
+
52
+ The above copyright notice and this permission notice shall be
53
+ included in all copies or substantial portions of the Software.
54
+
55
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
56
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
57
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
58
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
59
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
60
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
61
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+
3
+ unless defined?(Motion::Project::Config)
4
+ raise "This file must be required within a RubyMotion project Rakefile."
5
+ end
6
+
7
+ lib_dir_path = File.dirname(File.expand_path(__FILE__))
8
+ Motion::Project::App.setup do |app|
9
+ app.files.unshift(Dir.glob(File.join(lib_dir_path, "project/**/*.rb")))
10
+ end
@@ -0,0 +1,5 @@
1
+ class Integer
2
+ def duration_comparable_bool
3
+ self == 0
4
+ end
5
+ end
@@ -0,0 +1,191 @@
1
+ class Motion
2
+ class Duration
3
+ UNITS = [:seconds, :minutes, :hours, :days, :weeks]
4
+
5
+ MULTIPLES = {:seconds => 1,
6
+ :minutes => 60,
7
+ :hours => 3600,
8
+ :days => 86400,
9
+ :weeks => 604800,
10
+ :second => 1,
11
+ :minute => 60,
12
+ :hour => 3600,
13
+ :day => 86400,
14
+ :week => 604800}
15
+
16
+ attr_reader :weeks, :days, :hours, :minutes, :seconds, :total
17
+
18
+ # Initialize a duration. 'args' can be a hash or anything else. If a hash is
19
+ # passed, it will be scanned for a key=>value pair of time units such as those
20
+ # listed in the Duration::UNITS array or Duration::MULTIPLES hash.
21
+ #
22
+ # If anything else except a hash is passed, #to_i is invoked on that object
23
+ # and expects that it return the number of seconds desired for the duration.
24
+ def initialize(args = 0)
25
+ if args.kind_of?(Hash)
26
+ @seconds = 0
27
+ MULTIPLES.each do |unit, multiple|
28
+ unit = unit.to_sym
29
+ @seconds += args[unit].to_i * multiple if args.key?(unit)
30
+ end
31
+ # elsif args.kind_of?(String) and args[0] == 'P'
32
+ # @seconds = ISO8601::Duration.new(args).to_seconds
33
+ else
34
+ @seconds = args.to_i
35
+ end
36
+
37
+ calculate!
38
+ end
39
+
40
+ # Compare this duration to another (or objects that respond to #to_i)
41
+ def <=>(other)
42
+ return false unless other.is_a?(Duration)
43
+ (@total <=> other.to_i).duration_comparable_bool
44
+ end
45
+
46
+ def +(other)
47
+ Duration.new(@total + other.to_i)
48
+ end
49
+
50
+ def -(other)
51
+ Duration.new(@total - other.to_i)
52
+ end
53
+
54
+ def *(other)
55
+ Duration.new(@total * other.to_i)
56
+ end
57
+
58
+ def /(other)
59
+ Duration.new(@total / other.to_i)
60
+ end
61
+
62
+ def %(other)
63
+ Duration.new(@total % other.to_i)
64
+ end
65
+
66
+ %w(minutes hours days).each do |meth|
67
+ define_method("total_#{meth}") { @total / MULTIPLES[meth.to_sym] }
68
+ end
69
+
70
+ # @return true if total is 0
71
+ def blank?
72
+ @total == 0
73
+ end
74
+
75
+ # @return true if total different than 0
76
+ def present?
77
+ !blank?
78
+ end
79
+
80
+ def negative?
81
+ @negative
82
+ end
83
+
84
+ # Format a duration into a human-readable string.
85
+ #
86
+ # %w => weeks
87
+ # %d => days
88
+ # %h => hours
89
+ # %m => minutes
90
+ # %s => seconds
91
+ # %td => total days
92
+ # %th => total hours
93
+ # %tm => total minutes
94
+ # %ts => total seconds
95
+ # %t => total seconds
96
+ # %MP => minutes with UTF-8 prime
97
+ # %SP => seconds with UTF-8 double-prime
98
+ # %MH => minutes with HTML prime
99
+ # %SH => seconds with HTML double-prime
100
+ # %H => zero-padded hours
101
+ # %M => zero-padded minutes
102
+ # %S => zero-padded seconds
103
+ # %~s => locale-dependent "seconds" terminology
104
+ # %~m => locale-dependent "minutes" terminology
105
+ # %~h => locale-dependent "hours" terminology
106
+ # %~d => locale-dependent "days" terminology
107
+ # %~w => locale-dependent "weeks" terminology
108
+ # %tdu => total days with locale-dependent unit
109
+ # %thu => total hours with locale-dependent unit
110
+ # %tmu => total minutes with locale-dependent unit
111
+ # %tsu => total seconds with locale-dependent unit
112
+ #
113
+ #
114
+ # def format(format_str)
115
+ # identifiers = {
116
+ # 'w' => @weeks,
117
+ # 'd' => @days,
118
+ # 'h' => @hours,
119
+ # 'm' => @minutes,
120
+ # 's' => @seconds,
121
+ # 'td' => Proc.new { total_days },
122
+ # 'th' => Proc.new { total_hours },
123
+ # 'tm' => Proc.new { total_minutes },
124
+ # 'ts' => @total,
125
+ # 't' => @total,
126
+ # 'MP' => Proc.new { "#{@minutes}′"},
127
+ # 'SP' => Proc.new { "#{@seconds}″"},
128
+ # 'MH' => Proc.new { "#{@minutes}&#8242;"},
129
+ # 'SH' => Proc.new { "#{@seconds}&#8243;"},
130
+ # 'H' => @hours.to_s.rjust(2, '0'),
131
+ # 'M' => @minutes.to_s.rjust(2, '0'),
132
+ # 'S' => @seconds.to_s.rjust(2, '0'),
133
+ # '~s' => i18n_for(:second),
134
+ # '~m' => i18n_for(:minute),
135
+ # '~h' => i18n_for(:hour),
136
+ # '~d' => i18n_for(:day),
137
+ # '~w' => i18n_for(:week),
138
+ # 'tdu'=> Proc.new { "#{total_days} #{i18n_for(:total_day)}"},
139
+ # 'thu'=> Proc.new { "#{total_hours} #{i18n_for(:total_hour)}"},
140
+ # 'tmu'=> Proc.new { "#{total_minutes} #{i18n_for(:total_minute)}"},
141
+ # 'tsu'=> Proc.new { "#{total} #{i18n_for(:total)}"},
142
+ # }
143
+
144
+ # format_str.gsub(/%?%(w|d|h|m|s|t([dhms]u?)?|MP|SP|MH|SH|H|M|S|~(?:s|m|h|d|w))/) do |match|
145
+ # match['%%'] ? match : (identifiers[match[1..-1]].class == Proc ? identifiers[match[1..-1]].call : identifiers[match[1..-1]])
146
+ # end.gsub('%%', '%')
147
+ # end
148
+
149
+ alias_method :to_i, :total
150
+ # alias_method :strftime, :format
151
+
152
+ private
153
+
154
+ # Calculates the duration from seconds and figures out what the actual
155
+ # durations are in specific units. This method is called internally, and
156
+ # does not need to be called by user code.
157
+ def calculate!
158
+ multiples = [MULTIPLES[:weeks], MULTIPLES[:days], MULTIPLES[:hours], MULTIPLES[:minutes], MULTIPLES[:seconds]]
159
+ units = []
160
+ @negative = @seconds < 0
161
+ @total = @seconds.abs.to_f.round
162
+ multiples.inject(@total) do |total, multiple|
163
+ # Divide into largest unit
164
+ units << total / multiple
165
+ total % multiple # The remainder will be divided as the next largest
166
+ end
167
+
168
+ # Gather the divided units
169
+ @weeks, @days, @hours, @minutes, @seconds = units
170
+ end
171
+
172
+ # def i18n_for(singular)
173
+ # if singular == :total
174
+ # fn_name = :total
175
+ # singular = :second
176
+ # plural = 'seconds'
177
+ # elsif singular.to_s.start_with?('total_')
178
+ # fn_name = "#{singular}s"
179
+ # singular = singular.to_s['total_'.length..-1]
180
+ # plural = "#{singular}s"
181
+ # else
182
+ # plural = "#{singular}s"
183
+ # fn_name = plural
184
+ # end
185
+ # label = send(fn_name) == 1 ? singular : plural
186
+
187
+ # I18n.t(label, :scope => :ruby_duration, :default => label.to_s)
188
+ # end
189
+
190
+ end
191
+ end
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: motion-duration
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Mark Rickert
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Motion::Duration is an immutable type that represents some amount of
28
+ time with accuracy in seconds.
29
+ email:
30
+ - mark@otgapps.io
31
+ executables: []
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - README.md
36
+ - lib/motion-duration.rb
37
+ - lib/project/ext.rb
38
+ - lib/project/motion-duration.rb
39
+ homepage: https://github.com/otgapps/motion-duration
40
+ licenses:
41
+ - MIT
42
+ metadata: {}
43
+ post_install_message:
44
+ rdoc_options: []
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ requirements: []
58
+ rubyforge_project:
59
+ rubygems_version: 2.2.0
60
+ signing_key:
61
+ specification_version: 4
62
+ summary: Motion::Duration is an immutable type that represents some amount of time
63
+ with accuracy in seconds.
64
+ test_files: []