mirror of
https://github.com/jimeh/time_ext.git
synced 2026-02-19 05:16:40 +00:00
Compare commits
57 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 53fed4fb33 | |||
| dad55fb6f9 | |||
| 4b1327306d | |||
| 950a57dc66 | |||
| 59c96c0246 | |||
| 8bb93bf5f1 | |||
| d84154bd5b | |||
| 0bef341111 | |||
| 6686731651 | |||
| fceb7b8ff2 | |||
| 803ad03d6c | |||
| b29c232939 | |||
| f3b9d3751a | |||
| a612a17c54 | |||
| 71c5421587 | |||
| d564c31b93 | |||
| 29e1c7f500 | |||
| f49c6bd455 | |||
| 5ece10846a | |||
| 5afb6bc2b9 | |||
| 9bbd974a75 | |||
| ca929c6ae1 | |||
| edd828bb3e | |||
| 4afd3f84d5 | |||
| ea6d87e35f | |||
| 74574beaf0 | |||
| ba33dfec57 | |||
| c9cd80fd9e | |||
| 06e167d1ab | |||
| ac1ad2dba4 | |||
| ab6e1e8003 | |||
| 3d2b5d0b9e | |||
| b8ba272b95 | |||
| 3201485eaf | |||
| 77d9d67ed1 | |||
| e8d7d9d47b | |||
| 40b86cafc0 | |||
| 66f661aef8 | |||
| c1abca091a | |||
| e6bd7fc000 | |||
| b3eb247e50 | |||
| 1fa6623aa2 | |||
| 333053387f | |||
| d2208c4f5f | |||
| 629c9f1cf9 | |||
| c7e46c25d1 | |||
| 3e6b637f75 | |||
| 20e1957add | |||
| eb6ee05a3e | |||
| d052a720e4 | |||
| ef5e1fb327 | |||
| ce715604a4 | |||
| 820057f842 | |||
| a1c69ea52c | |||
| 438cdd5b68 | |||
| d6b65dbc01 | |||
| 88ece14760 |
8
.gitignore
vendored
8
.gitignore
vendored
@@ -16,7 +16,11 @@ tmtags
|
||||
## PROJECT::GENERAL
|
||||
coverage
|
||||
rdoc
|
||||
pkg
|
||||
Gemfile.lock
|
||||
pkg/*
|
||||
*.gem
|
||||
.bundle
|
||||
|
||||
## PROJECT::SPECIFIC
|
||||
.yardoc/*
|
||||
.yardoc
|
||||
doc/*
|
||||
|
||||
4
Gemfile
Normal file
4
Gemfile
Normal file
@@ -0,0 +1,4 @@
|
||||
source 'http://rubygems.org/'
|
||||
|
||||
# Specify your gem's dependencies in time_ext.gemspec
|
||||
gemspec
|
||||
50
README.md
50
README.md
@@ -10,20 +10,54 @@ This gem extends the abilities of Ruby's built-in Time class by building on top
|
||||
|
||||
## Basic Usage
|
||||
|
||||
require "time/ext"
|
||||
Time.now.round(:week)
|
||||
#=> Beginning of this week, or next week depending on which date is closest
|
||||
### Pure Ruby
|
||||
|
||||
require "time/ext" # or "time_ext"
|
||||
Time.utc(2010, 6, 19).round(:month) #=> Thu Jul 01 00:00:00 UTC 2010
|
||||
#=> Beginning of this month, or beginning of next month depending on which is closest
|
||||
Time.now.each_hour.until(6.hours.from_now) { |t| puts t.to_s }
|
||||
#=> Prints the time at one hour interals from now till 6 hours from now
|
||||
|
||||
### Rails 2.x
|
||||
|
||||
config.gem "time_ext"
|
||||
|
||||
### Rails 3.x
|
||||
|
||||
gem "time_ext"
|
||||
|
||||
|
||||
## Notable Methods
|
||||
## Documentation
|
||||
|
||||
The `round`, `floor`, and `ceil` methods were the main reason I created this gem. Each of them takes a unit argument, which can be one of the following: `:sec`, `:min`, `:hour`, `:day`, `:week`, `:month`, `:quarter`, and `:year`.
|
||||
Complete class and method documentation is available [here][docs] on [rdoc.info][].
|
||||
|
||||
For more, please refer to the source code or the spec tests for now.
|
||||
### Calculations
|
||||
|
||||
ActiveSupport includes some handy `#beginning_of_*` and `#end_of_*` methods among others for year, month, week, and day. TimeExt adds the same methods for quarter (3 months), hour, minute, and second. Additionally it also adds a set of familiar math methods, `#floor`, `#ceil`, and `#round`. Each of them takes a unit argument (day, month, etc.), and goes about it's operation to that unit type.
|
||||
|
||||
### Iterations
|
||||
|
||||
You can easily iterate over specific units of time with the `#each`, `#beginning_of_each`, `#map_each`, and `#map_beginning_of_each` methods. Each method takes a unit input, just like the `#floor` method for example. But the iteration methods also have dynamic unit methods, like so:
|
||||
|
||||
time = Time.local(2010, 07, 10)
|
||||
time.map_each(:hour).until(time + 6.hours) { |t| t.hour } #=> [1, 2, 3, 4, 5, 6]
|
||||
time.map_each_hour.until(time + 6.hours) { |t| t.hour } #=> [1, 2, 3, 4, 5, 6]
|
||||
|
||||
The `#until` method defines when to stop the iteration. You can also use the `#from` method, which then iterates from the time passed into `#from` till the time of the object you're calling each on. If don't specify a end/start time, it'll assume you want all units within it's scope. Or in less gibberish, calling `#each_hour` will iterate every hour for a whole day, or 24 hours. If you're iterating by the minute, it'll stop after an hour.
|
||||
|
||||
Here's a couple of more examples:
|
||||
|
||||
time.map_each_hour.until(time + 6.hours) { |t| t.hour } #=> [1, 2, 3, 4, 5, 6]
|
||||
time.until(time + 6.hours).map_each_hour { |t| t.hour } #=> [1, 2, 3, 4, 5, 6]
|
||||
(time + 6.hours).map_each_hour.from(time) { |t| t.hour } #=> [1, 2, 3, 4, 5, 6]
|
||||
(time + 6.hours).from(time).map_each_hour { |t| t.hour } #=> [1, 2, 3, 4, 5, 6]
|
||||
|
||||
I recommend you read the complete class [documentation][docs] for the Time object to see all the new methods available.
|
||||
|
||||
|
||||
## To-Do
|
||||
|
||||
* Some cleaner code.
|
||||
* Improve ReadMe file.
|
||||
* Improve documentation.
|
||||
|
||||
@@ -64,4 +98,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
|
||||
[as]: http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Time/Calculations.html
|
||||
[as]: http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Time/Calculations.html
|
||||
[docs]: http://rdoc.info/gems/time_ext/frames
|
||||
[rdoc.info]: http://rdoc.info/
|
||||
57
Rakefile
57
Rakefile
@@ -1,43 +1,27 @@
|
||||
require 'rubygems'
|
||||
require 'rake'
|
||||
require 'bundler'
|
||||
Bundler::GemHelper.install_tasks
|
||||
|
||||
begin
|
||||
require 'jeweler'
|
||||
Jeweler::Tasks.new do |gem|
|
||||
gem.name = "time_ext"
|
||||
gem.summary = %Q{Extends the abilities of Ruby's built-in Time class by building on top of ActiveSupport.}
|
||||
gem.description = %Q{Extends the abilities of Ruby's built-in Time class by building on top of ActiveSupport.}
|
||||
gem.email = "contact@jimeh.me"
|
||||
gem.homepage = "http://github.com/jimeh/time_ext"
|
||||
gem.authors = ["Jim Myhrberg"]
|
||||
gem.add_dependency "activesupport", ">= 2.3.0"
|
||||
gem.add_development_dependency "rspec", ">= 1.2.9"
|
||||
gem.add_development_dependency "yard", ">= 0"
|
||||
end
|
||||
Jeweler::GemcutterTasks.new
|
||||
rescue LoadError
|
||||
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
||||
|
||||
#
|
||||
# Rspec
|
||||
#
|
||||
|
||||
require 'rspec/core/rake_task'
|
||||
RSpec::Core::RakeTask.new(:spec) do |spec|
|
||||
spec.pattern = 'spec/**/*_spec.rb'
|
||||
end
|
||||
|
||||
require 'spec/rake/spectask'
|
||||
Spec::Rake::SpecTask.new(:spec) do |spec|
|
||||
spec.libs << 'lib' << 'spec'
|
||||
spec.spec_files = FileList['spec/**/*_spec.rb']
|
||||
end
|
||||
|
||||
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
||||
spec.libs << 'lib' << 'spec'
|
||||
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
||||
spec.pattern = 'spec/**/*_spec.rb'
|
||||
spec.rcov = true
|
||||
end
|
||||
|
||||
task :spec => :check_dependencies
|
||||
|
||||
task :default => :spec
|
||||
|
||||
task :console do
|
||||
exec "irb -r spec/spec_helper"
|
||||
end
|
||||
|
||||
#
|
||||
# Yard
|
||||
#
|
||||
|
||||
begin
|
||||
require 'yard'
|
||||
@@ -47,3 +31,14 @@ rescue LoadError
|
||||
abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
#
|
||||
# Misc.
|
||||
#
|
||||
|
||||
desc "Start an irb console with TimeExt pre-loaded."
|
||||
task :console do
|
||||
exec "irb -r spec/spec_helper"
|
||||
end
|
||||
task :c => :console
|
||||
|
||||
2277
doc/Time.html
2277
doc/Time.html
File diff suppressed because it is too large
Load Diff
@@ -1,94 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta name="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>Documentation by YARD 0.5.8</title>
|
||||
<link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
|
||||
<link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
|
||||
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
relpath = '';
|
||||
if (relpath != '') relpath += '/';
|
||||
</script>
|
||||
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
||||
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
if (window.top.frames.main) document.body.className = 'frames';
|
||||
</script>
|
||||
|
||||
<div id="header">
|
||||
<div id="menu">
|
||||
|
||||
|
||||
<span class="title"></span>
|
||||
|
||||
|
||||
<div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
|
||||
</div>
|
||||
|
||||
<div id="search">
|
||||
<a id="class_list_link" href="#">Class List</a>
|
||||
<a id="method_list_link" href="#">Method List</a>
|
||||
<a id ="file_list_link" href="#">File List</a>
|
||||
</div>
|
||||
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<iframe id="search_frame"></iframe>
|
||||
|
||||
<div id="content"><div id="listing">
|
||||
<h1 class="noborder title">Documentation by YARD 0.5.8</h1>
|
||||
<h1 class="alphaindex">Alphabetic Index</h1>
|
||||
|
||||
|
||||
<h2>File Listing</h2>
|
||||
<ul id="files">
|
||||
|
||||
|
||||
<li class="r1"><a href="index.html" title="README">README</a></li>
|
||||
|
||||
|
||||
</ul>
|
||||
|
||||
<div class="clear"></div>
|
||||
|
||||
<h2>Namespace Listing A-Z</h2>
|
||||
|
||||
|
||||
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td valign='top' width="33%">
|
||||
|
||||
|
||||
<ul id="alpha_T" class="alpha">
|
||||
<li class="letter">T</li>
|
||||
<ul>
|
||||
|
||||
<li>
|
||||
<a href="Time.html" title="Time (class)">Time</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</ul>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div></div>
|
||||
|
||||
<div id="footer">
|
||||
Generated on Tue Jul 27 20:08:51 2010 by
|
||||
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool">yard</a>
|
||||
0.5.8 (ruby-1.8.7).
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,36 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta name="Content-Type" content="text/html; charset=utf-8" />
|
||||
<link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" charset="utf-8" />
|
||||
<link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
|
||||
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
||||
<script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
|
||||
<base id="base_target" target="_parent" />
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
if (window.top.frames.main) {
|
||||
document.getElementById('base_target').target = 'main';
|
||||
document.body.className = 'frames';
|
||||
}
|
||||
</script>
|
||||
<div id="content">
|
||||
<h1 id="full_list_header">Class List</h1>
|
||||
<div id="nav">
|
||||
<a target="_self" href="class_list.html">Classes</a> |
|
||||
<a target="_self" href="method_list.html">Methods</a> |
|
||||
<a target="_self" href="file_list.html">Files</a>
|
||||
</div>
|
||||
<div id="search">Search: <input type="text" /></div>
|
||||
|
||||
<ul id="full_list" class="class">
|
||||
<li><a href="top-level-namespace.html" title=" (root)">Top Level Namespace</a></li>
|
||||
<li><a href="Time.html" title="Time (class)">Time</a> < Object<small class='search_info'>Top Level Namespace</small></li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
/* Override this file with custom rules */
|
||||
@@ -1,50 +0,0 @@
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
|
||||
font-size: 13px;
|
||||
height: 101%;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
h1 { padding: 12px 10px; padding-bottom: 0; margin: 0; font-size: 1.4em; }
|
||||
.clear { clear: both; }
|
||||
#search { position: absolute; right: 5px; top: 9px; }
|
||||
#full_list { padding: 0; list-style: none; margin-left: 0; }
|
||||
#full_list ul { padding: 0; }
|
||||
#full_list li { padding: 5px; padding-left: 12px; margin: 0; font-size: 1.1em; list-style: none; }
|
||||
#noresults { display: none; padding: 7px 12px; }
|
||||
ul.collapsed ul, ul.collapsed li { display: none; }
|
||||
li a.toggle { cursor: default; position: relative; left: -5px; top: 4px; text-indent: -999px; width: 10px; height: 9px; margin-left: -10px; display: block; float: left; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAAVdEVYdENyZWF0aW9uIFRpbWUAMy8xNC8wOeNZPpQAAAE2SURBVDiNrZTBccIwEEXfelIAHUA6CZ24BGaWO+FuzZAK4k6gg5QAdGAq+Bxs2Yqx7BzyL7Llp/VfzZeQhCTc/ezuGzKKnKSzpCxXJM8fwNXda3df5RZETlIt6YUzSQDs93sl8w3wBZxCCE10GM1OcWbWjB2mWgEH4Mfdyxm3PSepBHibgQE2wLe7r4HjEidpnXMYdQPKEMJcsZ4zs2POYQOcaPfwMVOo58zsAdMt18BuoVDPxUJRacELbXv3hUIX2vYmOUvi8C8ydz/ThjXrqKqqLbDIAdsCKBd+Wo7GWa7o9qzOQHVVVXeAbs+yHHCH4aTsaCOQqunmUy1yBUAXkdMIfMlgF5EXLo2OpV/c/Up7jG4hhHcYLgWzAZXUc2b2ixsfvc/RmNNfOXD3Q/oeL9axJE1yT9IOoUu6MGUkAAAAAElFTkSuQmCC) no-repeat bottom left; }
|
||||
li.collapsed a.toggle { opacity: 0.5; cursor: default; background-position: top left; }
|
||||
li { color: #888; cursor: pointer; }
|
||||
li.deprecated { text-decoration: line-through; font-style: italic; }
|
||||
li.r1 { background: #f0f0f0; }
|
||||
li.r2 { background: #fafafa; }
|
||||
li:hover { background: #ddd; }
|
||||
li small:before { content: "("; }
|
||||
li small:after { content: ")"; }
|
||||
li small.search_info { display: none; }
|
||||
a:link, a:visited { text-decoration: none; color: #05a; }
|
||||
li.clicked { background: #05a; color: #ccc; }
|
||||
li.clicked a:link, li.clicked a:visited { color: #eee; }
|
||||
li.clicked a.toggle { opacity: 0.5; background-position: bottom right; }
|
||||
li.collapsed.clicked a.toggle { background-position: top right; }
|
||||
#search input { border: 1px solid #bbb; -moz-border-radius: 3px; -webkit-border-radius: 3px; }
|
||||
#nav { margin-left: 10px; font-size: 0.9em; display: none; color: #aaa; }
|
||||
#nav a:link, #nav a:visited { color: #358; }
|
||||
#nav a:hover { background: transparent; color: #5af; }
|
||||
|
||||
.frames #content h1 { margin-top: 0; }
|
||||
.frames li { white-space: nowrap; cursor: normal; }
|
||||
.frames li small { display: block; font-size: 0.8em; }
|
||||
.frames li small:before { content: ""; }
|
||||
.frames li small:after { content: ""; }
|
||||
.frames li small.search_info { display: none; }
|
||||
.frames #search { position: static; margin: 3px; margin-left: 10px; font-size: 0.9em; color: #888; }
|
||||
.frames #search input { width: 110px; }
|
||||
.frames #nav { display: block; }
|
||||
|
||||
#full_list.insearch li { display: none; }
|
||||
#full_list.insearch li.found { display: list-item; padding-left: 10px; }
|
||||
#full_list.insearch li a.toggle { display: none; }
|
||||
#full_list.insearch li small.search_info { display: block; }
|
||||
@@ -1,277 +0,0 @@
|
||||
body {
|
||||
padding: 0 20px;
|
||||
font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
|
||||
font-size: 13px;
|
||||
}
|
||||
body.frames { padding: 0 5px; }
|
||||
h1 { font-size: 25px; margin: 1em 0 0.5em; padding-top: 4px; border-top: 1px dotted #d5d5d5; }
|
||||
h1.noborder { border-top: 0px; margin-top: 0; padding-top: 4px; }
|
||||
h1.title { margin-bottom: 10px; }
|
||||
h1.alphaindex { margin-top: 0; font-size: 22px; }
|
||||
h2 {
|
||||
padding: 0;
|
||||
padding-bottom: 3px;
|
||||
border-bottom: 1px #aaa solid;
|
||||
font-size: 1.4em;
|
||||
margin: 1.8em 0 0.5em;
|
||||
}
|
||||
h2 small { font-weight: normal; font-size: 0.7em; display: block; float: right; }
|
||||
.clear { clear: both; }
|
||||
.inline { display: inline; }
|
||||
.inline p:first-child { display: inline; }
|
||||
.docstring h1, .docstring h2, .docstring h3, .docstring h4 { padding: 0; border: 0; border-bottom: 1px dotted #bbb; }
|
||||
.docstring h1 { font-size: 1.2em; }
|
||||
.docstring h2 { font-size: 1.1em; }
|
||||
.docstring h3, .docstring h4 { font-size: 1em; border-bottom: 0; padding-top: 10px; }
|
||||
|
||||
.note {
|
||||
color: #222;
|
||||
-moz-border-radius: 3px; -webkit-border-radius: 3px;
|
||||
background: #e3e4e3; border: 1px solid #d5d5d5; padding: 7px 10px;
|
||||
}
|
||||
.note.todo { background: #ffffc5; border-color: #ececaa; }
|
||||
.note.returns_void { background: #efefef; }
|
||||
.note.deprecated { background: #ffe5e5; border-color: #e9dada; }
|
||||
.note.private { background: #ffffc5; border-color: #ececaa; }
|
||||
.note.title { text-transform: lowercase; padding: 1px 5px; margin-left: 5px; font-size: 0.9em; font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; }
|
||||
h1 .note.title { font-size: 0.5em; font-weight: normal; padding: 3px 5px; position: relative; top: -3px; text-transform: capitalize; }
|
||||
.note.title.constructor { color: #fff; background: #6a98d6; border-color: #6689d6; }
|
||||
.note.title.writeonly { color: #fff; background: #45a638; border-color: #2da31d; }
|
||||
.note.title.readonly { color: #fff; background: #6a98d6; border-color: #6689d6; }
|
||||
.note.title.private { background: #d5d5d5; border-color: #c5c5c5; }
|
||||
|
||||
h3.inherited {
|
||||
font-style: italic;
|
||||
font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
|
||||
font-weight: normal;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
margin-top: 12px;
|
||||
margin-bottom: 3px;
|
||||
font-size: 13px;
|
||||
}
|
||||
p.inherited {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
margin-left: 25px;
|
||||
}
|
||||
|
||||
dl.box {
|
||||
width: 520px;
|
||||
font-size: 1em;
|
||||
}
|
||||
dl.box dt {
|
||||
float: left;
|
||||
display: block;
|
||||
width: 100px;
|
||||
margin: 0;
|
||||
text-align: right;
|
||||
font-weight: bold;
|
||||
border: 1px solid #aaa;
|
||||
border-width: 1px 0px 0px 1px;
|
||||
padding: 6px 0;
|
||||
padding-right: 10px;
|
||||
}
|
||||
dl.box dd {
|
||||
float: left;
|
||||
display: block;
|
||||
width: 380px;
|
||||
margin: 0;
|
||||
padding: 6px 0;
|
||||
padding-right: 20px;
|
||||
border: 1px solid #aaa;
|
||||
border-width: 1px 1px 0 0;
|
||||
}
|
||||
dl.box .last {
|
||||
border-bottom: 1px solid #aaa;
|
||||
}
|
||||
dl.box .r1 { background: #eee; }
|
||||
|
||||
ul.toplevel { list-style: none; padding-left: 0; font-size: 1.1em; }
|
||||
#files { padding-left: 15px; font-size: 1.1em; }
|
||||
|
||||
#files { padding: 0; }
|
||||
#files li { list-style: none; display: inline; padding: 7px 12px; line-height: 35px; }
|
||||
|
||||
dl.constants { margin-left: 40px; }
|
||||
dl.constants dt { font-weight: bold; font-size: 1.1em; margin-bottom: 5px; }
|
||||
dl.constants dd { width: 75%; white-space: pre; font-family: monospace; margin-bottom: 18px; }
|
||||
|
||||
.summary_desc { margin-left: 32px; display: block; font-family: sans-serif; }
|
||||
.summary_desc tt { font-size: 0.9em; }
|
||||
dl.constants .docstring { margin-left: 32px; font-size: 0.9em; font-weight: normal; }
|
||||
dl.constants .discussion *:first-child { margin-top: 0; }
|
||||
dl.constants .discussion *:last-child { margin-bottom: 0; }
|
||||
|
||||
.method_details { border-top: 1px dotted #aaa; margin-top: 15px; padding-top: 0; }
|
||||
.method_details.first { border: 0; }
|
||||
p.signature {
|
||||
font-size: 1.1em; font-weight: normal; font-family: Monaco, Consolas, Courier, monospace;
|
||||
padding: 6px 10px; margin-top: 18px;
|
||||
background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px;
|
||||
}
|
||||
p.signature tt { font-family: Monaco, Consolas, Courier, monospace; }
|
||||
p.signature .overload { display: block; }
|
||||
p.signature .extras { font-weight: normal; font-family: sans-serif; color: #444; font-size: 1em; }
|
||||
p.signature .aliases { display: block; font-weight: normal; font-size: 0.9em; font-family: sans-serif; margin-top: 0px; color: #555; }
|
||||
p.signature .aliases .names { font-family: Monaco, Consolas, Courier, monospace; font-weight: bold; color: #000; font-size: 1.2em; }
|
||||
|
||||
.tags h3 { font-size: 1em; margin-bottom: 0; }
|
||||
.tags ul { margin-top: 5px; padding-left: 30px; list-style: square; }
|
||||
.tags ul li { margin-bottom: 3px; }
|
||||
.tags ul .name { font-family: monospace; font-weight: bold; }
|
||||
.tags ul .note { padding: 3px 6px; }
|
||||
.tags { margin-bottom: 12px; }
|
||||
|
||||
.tags .examples h3 { margin-bottom: 10px; }
|
||||
.tags .examples h4 { padding: 0; margin: 0; margin-left: 15px; font-weight: bold; font-size: 0.9em; }
|
||||
|
||||
.tags .overload .overload_item { list-style: none; margin-bottom: 25px; }
|
||||
.tags .overload .overload_item .signature {
|
||||
padding: 2px 8px;
|
||||
background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px;
|
||||
}
|
||||
.tags .overload .signature { margin-left: -15px; font-family: monospace; display: block; font-size: 1.1em; }
|
||||
.tags .overload .docstring { margin-top: 15px; }
|
||||
|
||||
.defines { display: none; }
|
||||
|
||||
#method_missing_details .notice.this { position: relative; top: -8px; color: #888; padding: 0; margin: 0; }
|
||||
|
||||
.showSource { font-size: 0.9em; }
|
||||
.showSource a:link, .showSource a:visited { text-decoration: none; color: #666; }
|
||||
|
||||
#content a:link, #content a:visited { text-decoration: none; color: #05a; }
|
||||
#content a:hover { background: #ffffa5; }
|
||||
.docstring { margin-right: 6em; }
|
||||
|
||||
ul.summary {
|
||||
list-style: none;
|
||||
font-family: monospace;
|
||||
font-size: 1em;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
ul.summary a:link, ul.summary a:visited {
|
||||
text-decoration: none; font-size: 1.1em;
|
||||
}
|
||||
ul.summary li { margin-bottom: 5px; }
|
||||
.summary .summary_signature {
|
||||
padding: 1px 10px;
|
||||
background: #eaeaff; border: 1px solid #dfdfe5;
|
||||
-moz-border-radius: 3px; -webkit-border-radius: 3px;
|
||||
}
|
||||
.summary_signature:hover { background: #eeeeff; cursor: pointer; }
|
||||
ul.summary.compact li { display: inline; margin-right: 5px; line-height: 2.6em;}
|
||||
ul.summary.compact .summary_signature { padding: 5px 7px; padding-right: 4px; }
|
||||
#content .summary_signature:hover a:link,
|
||||
#content .summary_signature:hover a:visited {
|
||||
background: transparent;
|
||||
color: #48f;
|
||||
}
|
||||
|
||||
p.inherited a { font-family: monospace; font-size: 0.9em; }
|
||||
p.inherited { word-spacing: 5px; font-size: 1.2em; }
|
||||
|
||||
p.children { font-size: 1.2em; }
|
||||
p.children a { font-size: 0.9em; }
|
||||
p.children strong { font-size: 0.8em; }
|
||||
p.children strong.modules { padding-left: 5px; }
|
||||
|
||||
ul.fullTree { display: none; padding-left: 0; list-style: none; margin-left: 0; margin-bottom: 10px; }
|
||||
ul.fullTree ul { margin-left: 0; padding-left: 0; list-style: none; }
|
||||
ul.fullTree li { text-align: center; }
|
||||
ul.fullTree li.next:before { font-size: 1.2em; content: '\2B06'; color: #bbb; display: block; margin-top: 3px; }
|
||||
|
||||
#search { position: absolute; right: 14px; top: 0px; }
|
||||
#search a:link, #search a:visited {
|
||||
display: block; float: left; margin-right: 4px;
|
||||
padding: 8px 10px; text-decoration: none; color: #05a; background: #eaeaff;
|
||||
border: 1px solid #d8d8e5;
|
||||
-moz-border-radius-bottomleft: 3px; -moz-border-radius-bottomright: 3px;
|
||||
-webkit-border-bottom-left-radius: 3px; -webkit-border-bottom-right-radius: 3px;
|
||||
}
|
||||
#search a:hover { background: #eef; color: #06b; }
|
||||
#search a.active {
|
||||
background: #568; padding-bottom: 20px; color: #fff; border: 1px solid #457;
|
||||
-moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px;
|
||||
-webkit-border-top-left-radius: 5px; -webkit-border-top-right-radius: 5px;
|
||||
}
|
||||
#search a.inactive { color: #999; }
|
||||
.frames #search { display: none; }
|
||||
.inheritanceTree, .toggleDefines { float: right; }
|
||||
|
||||
#menu { font-size: 1.3em; color: #bbb; top: -5px; position: relative; }
|
||||
#menu .title, #menu a { font-size: 0.7em; }
|
||||
#menu .title a { font-size: 1em; }
|
||||
#menu .title { color: #555; }
|
||||
#menu a:link, #menu a:visited { color: #333; text-decoration: none; border-bottom: 1px dotted #bbd; }
|
||||
#menu a:hover { color: #05a; }
|
||||
#menu .noframes { display: none; }
|
||||
.frames #menu .noframes { display: inline; float: right; }
|
||||
|
||||
#footer { margin-top: 15px; border-top: 1px solid #ccc; text-align: center; padding: 7px 0; color: #999; }
|
||||
#footer a:link, #footer a:visited { color: #444; text-decoration: none; border-bottom: 1px dotted #bbd; }
|
||||
#footer a:hover { color: #05a; }
|
||||
|
||||
#listing ul.alpha { font-size: 1.1em; }
|
||||
#listing ul.alpha { margin: 0; padding: 0; padding-bottom: 10px; list-style: none; }
|
||||
#listing ul.alpha li.letter { font-size: 1.4em; padding-bottom: 10px; }
|
||||
#listing ul.alpha ul { margin: 0; padding-left: 15px; }
|
||||
#listing ul small { color: #666; font-size: 0.7em; }
|
||||
|
||||
li.r1 { background: #f0f0f0; }
|
||||
li.r2 { background: #fafafa; }
|
||||
|
||||
#search_frame {
|
||||
background: #fff;
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 36px;
|
||||
right: 18px;
|
||||
width: 500px;
|
||||
height: 80%;
|
||||
overflow-y: scroll;
|
||||
border: 1px solid #999;
|
||||
border-collapse: collapse;
|
||||
-webkit-box-shadow: -7px 5px 25px #aaa;
|
||||
-moz-box-shadow: -7px 5px 25px #aaa;
|
||||
-moz-border-radius: 2px;
|
||||
-webkit-border-radius: 2px;
|
||||
}
|
||||
|
||||
#content ul.summary li.deprecated a:link,
|
||||
#content ul.summary li.deprecated a:visited { text-decoration: line-through; font-style: italic; }
|
||||
|
||||
/* syntax highlighting */
|
||||
.source_code { display: none; padding: 3px 8px; border-left: 8px solid #ddd; margin-top: 5px; }
|
||||
#filecontents pre.code, .docstring pre.code, .source_code pre { font-family: monospace; }
|
||||
#filecontents pre.code, .docstring pre.code { display: block; }
|
||||
.source_code .lines { padding-right: 12px; color: #555; text-align: right; }
|
||||
#filecontents pre.code, .docstring pre.code,
|
||||
.tags .example { padding: 5px 12px; margin-top: 4px; border: 1px solid #eef; background: #f5f5ff; }
|
||||
pre.code { color: #000; }
|
||||
pre.code .info.file { color: #555; }
|
||||
pre.code .val { color: #036A07; }
|
||||
pre.code .tstring_content,
|
||||
pre.code .heredoc_beg, pre.code .heredoc_end,
|
||||
pre.code .qwords_beg, pre.code .qwords_end,
|
||||
pre.code .tstring, pre.code .dstring { color: #036A07; }
|
||||
pre.code .fid, pre.code .id.new, pre.code .id.to_s,
|
||||
pre.code .id.to_sym, pre.code .id.to_f,
|
||||
pre.code .dot + pre.code .id,
|
||||
pre.code .id.to_i pre.code .id.each { color: #0085FF; }
|
||||
pre.code .comment { color: #0066FF; }
|
||||
pre.code .const, pre.code .constant { color: #585CF6; }
|
||||
pre.code .symbol { color: #C5060B; }
|
||||
pre.code .kw,
|
||||
pre.code .label,
|
||||
pre.code .id.require,
|
||||
pre.code .id.extend,
|
||||
pre.code .id.include { color: #0000FF; }
|
||||
pre.code .ivar { color: #318495; }
|
||||
pre.code .gvar,
|
||||
pre.code .id.backref,
|
||||
pre.code .id.nth_ref { color: #6D79DE; }
|
||||
pre.code .regexp, .dregexp { color: #036A07; }
|
||||
pre.code a { border-bottom: 1px dotted #bbf; }
|
||||
|
||||
@@ -1,105 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta name="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>Documentation by YARD 0.5.8</title>
|
||||
<link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
|
||||
<link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
|
||||
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
relpath = '';
|
||||
if (relpath != '') relpath += '/';
|
||||
</script>
|
||||
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
||||
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
if (window.top.frames.main) document.body.className = 'frames';
|
||||
</script>
|
||||
|
||||
<div id="header">
|
||||
<div id="menu">
|
||||
|
||||
<a href="_index.html" title="Index">Index</a> »
|
||||
<span class="title">File: README</span>
|
||||
|
||||
|
||||
<div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
|
||||
</div>
|
||||
|
||||
<div id="search">
|
||||
<a id="class_list_link" href="#">Class List</a>
|
||||
<a id="method_list_link" href="#">Method List</a>
|
||||
<a id ="file_list_link" href="#">File List</a>
|
||||
</div>
|
||||
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<iframe id="search_frame"></iframe>
|
||||
|
||||
<div id="content"><div id='filecontents'><h1 id='ruby_time_extensions'>Ruby Time Extensions</h1>
|
||||
|
||||
<p>This gem extends the abilities of Ruby’s built-in Time class by building on top of what <a href='http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Time/Calculations.html'>ActiveSupport</a> already adds. Hence I must also warn that using this gem will load all of ActiveSupport at this time.</p>
|
||||
|
||||
<h2 id='installation'>Installation</h2>
|
||||
|
||||
<pre class="code"><span class='gem identifier id'>gem</span> <span class='install identifier id'>install</span> <span class='time_ext identifier id'>time_ext</span>
|
||||
</pre>
|
||||
|
||||
<h2 id='basic_usage'>Basic Usage</h2>
|
||||
|
||||
<pre class="code"><span class='require identifier id'>require</span> <span class='string val'>"time/ext"</span>
|
||||
<span class='Time constant id'>Time</span><span class='dot token'>.</span><span class='now identifier id'>now</span><span class='dot token'>.</span><span class='round identifier id'>round</span><span class='lparen token'>(</span><span class='symbol val'>:week</span><span class='rparen token'>)</span>
|
||||
<span class='comment val'>#=> Beginning of this week, or next week depending on which date is closest</span>
|
||||
</pre>
|
||||
|
||||
<h2 id='notable_methods'>Notable Methods</h2>
|
||||
|
||||
<p>The <code>round</code>, <code>floor</code>, and <code>ceil</code> methods were the main reason I created this gem. Each of them takes a unit argument, which can be one of the following: <code>:sec</code>, <code>:min</code>, <code>:hour</code>, <code>:day</code>, <code>:week</code>, <code>:month</code>, <code>:quarter</code>, and <code>:year</code>.</p>
|
||||
|
||||
<p>For more, please refer to the source code or the spec tests for now.</p>
|
||||
|
||||
<h2 id='todo'>To-Do</h2>
|
||||
|
||||
<ul>
|
||||
<li>Improve ReadMe file.</li>
|
||||
|
||||
<li>Improve documentation.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id='note_on_patchespull_requests'>Note on Patches/Pull Requests</h2>
|
||||
|
||||
<ul>
|
||||
<li>Fork the project.</li>
|
||||
|
||||
<li>Make your feature addition or bug fix.</li>
|
||||
|
||||
<li>Add tests for it. This is important so I don’t break it in a future version unintentionally.</li>
|
||||
|
||||
<li>Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)</li>
|
||||
|
||||
<li>Send me a pull request. Bonus points for topic branches.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id='license_and_copyright'>License and Copyright</h2>
|
||||
|
||||
<p>Copyright (c) 2010 Jim Myhrberg.</p>
|
||||
|
||||
<p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>
|
||||
|
||||
<p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p>
|
||||
|
||||
<p>THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></div></div>
|
||||
|
||||
<div id="footer">
|
||||
Generated on Tue Jul 27 20:08:51 2010 by
|
||||
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool">yard</a>
|
||||
0.5.8 (ruby-1.8.7).
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,38 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta name="Content-Type" content="text/html; charset=utf-8" />
|
||||
<link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" charset="utf-8" />
|
||||
<link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
|
||||
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
||||
<script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
|
||||
<base id="base_target" target="_parent" />
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
if (window.top.frames.main) {
|
||||
document.getElementById('base_target').target = 'main';
|
||||
document.body.className = 'frames';
|
||||
}
|
||||
</script>
|
||||
<div id="content">
|
||||
<h1 id="full_list_header">File List</h1>
|
||||
<div id="nav">
|
||||
<a target="_self" href="class_list.html">Classes</a> |
|
||||
<a target="_self" href="method_list.html">Methods</a> |
|
||||
<a target="_self" href="file_list.html">Files</a>
|
||||
</div>
|
||||
<div id="search">Search: <input type="text" /></div>
|
||||
|
||||
<ul id="full_list" class="files">
|
||||
|
||||
|
||||
<li class="r1"><a href="index.html" title="README">README</a></li>
|
||||
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||
<title>Documentation by YARD 0.5.8</title>
|
||||
</head>
|
||||
<frameset cols="20%,*">
|
||||
<frame name="list" src="class_list.html" />
|
||||
<frame name="main" src="index.html" />
|
||||
</frameset>
|
||||
</html>
|
||||
105
doc/index.html
105
doc/index.html
@@ -1,105 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta name="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>Documentation by YARD 0.5.8</title>
|
||||
<link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
|
||||
<link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
|
||||
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
relpath = '';
|
||||
if (relpath != '') relpath += '/';
|
||||
</script>
|
||||
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
||||
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
if (window.top.frames.main) document.body.className = 'frames';
|
||||
</script>
|
||||
|
||||
<div id="header">
|
||||
<div id="menu">
|
||||
|
||||
<a href="_index.html" title="Index">Index</a> »
|
||||
<span class="title">File: README</span>
|
||||
|
||||
|
||||
<div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
|
||||
</div>
|
||||
|
||||
<div id="search">
|
||||
<a id="class_list_link" href="#">Class List</a>
|
||||
<a id="method_list_link" href="#">Method List</a>
|
||||
<a id ="file_list_link" href="#">File List</a>
|
||||
</div>
|
||||
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<iframe id="search_frame"></iframe>
|
||||
|
||||
<div id="content"><div id='filecontents'><h1 id='ruby_time_extensions'>Ruby Time Extensions</h1>
|
||||
|
||||
<p>This gem extends the abilities of Ruby’s built-in Time class by building on top of what <a href='http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Time/Calculations.html'>ActiveSupport</a> already adds. Hence I must also warn that using this gem will load all of ActiveSupport at this time.</p>
|
||||
|
||||
<h2 id='installation'>Installation</h2>
|
||||
|
||||
<pre class="code"><span class='gem identifier id'>gem</span> <span class='install identifier id'>install</span> <span class='time_ext identifier id'>time_ext</span>
|
||||
</pre>
|
||||
|
||||
<h2 id='basic_usage'>Basic Usage</h2>
|
||||
|
||||
<pre class="code"><span class='require identifier id'>require</span> <span class='string val'>"time/ext"</span>
|
||||
<span class='Time constant id'>Time</span><span class='dot token'>.</span><span class='now identifier id'>now</span><span class='dot token'>.</span><span class='round identifier id'>round</span><span class='lparen token'>(</span><span class='symbol val'>:week</span><span class='rparen token'>)</span>
|
||||
<span class='comment val'>#=> Beginning of this week, or next week depending on which date is closest</span>
|
||||
</pre>
|
||||
|
||||
<h2 id='notable_methods'>Notable Methods</h2>
|
||||
|
||||
<p>The <code>round</code>, <code>floor</code>, and <code>ceil</code> methods were the main reason I created this gem. Each of them takes a unit argument, which can be one of the following: <code>:sec</code>, <code>:min</code>, <code>:hour</code>, <code>:day</code>, <code>:week</code>, <code>:month</code>, <code>:quarter</code>, and <code>:year</code>.</p>
|
||||
|
||||
<p>For more, please refer to the source code or the spec tests for now.</p>
|
||||
|
||||
<h2 id='todo'>To-Do</h2>
|
||||
|
||||
<ul>
|
||||
<li>Improve ReadMe file.</li>
|
||||
|
||||
<li>Improve documentation.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id='note_on_patchespull_requests'>Note on Patches/Pull Requests</h2>
|
||||
|
||||
<ul>
|
||||
<li>Fork the project.</li>
|
||||
|
||||
<li>Make your feature addition or bug fix.</li>
|
||||
|
||||
<li>Add tests for it. This is important so I don’t break it in a future version unintentionally.</li>
|
||||
|
||||
<li>Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)</li>
|
||||
|
||||
<li>Send me a pull request. Bonus points for topic branches.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id='license_and_copyright'>License and Copyright</h2>
|
||||
|
||||
<p>Copyright (c) 2010 Jim Myhrberg.</p>
|
||||
|
||||
<p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>
|
||||
|
||||
<p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p>
|
||||
|
||||
<p>THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></div></div>
|
||||
|
||||
<div id="footer">
|
||||
Generated on Tue Jul 27 20:08:51 2010 by
|
||||
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool">yard</a>
|
||||
0.5.8 (ruby-1.8.7).
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
138
doc/js/app.js
138
doc/js/app.js
@@ -1,138 +0,0 @@
|
||||
function createSourceLinks() {
|
||||
$('.method_details_list .source_code').
|
||||
before("<span class='showSource'>[<a href='#' class='toggleSource'>View source</a>]</span>");
|
||||
$('.toggleSource').toggle(function() {
|
||||
$(this).parent().next().slideDown(100);
|
||||
$(this).text("Hide source");
|
||||
},
|
||||
function() {
|
||||
$(this).parent().next().slideUp(100);
|
||||
$(this).text("View source");
|
||||
});
|
||||
}
|
||||
|
||||
function createDefineLinks() {
|
||||
var tHeight = 0;
|
||||
$('.defines').after(" <a href='#' class='toggleDefines'>more...</a>");
|
||||
$('.toggleDefines').toggle(function() {
|
||||
tHeight = $(this).parent().prev().height();
|
||||
$(this).prev().show();
|
||||
$(this).parent().prev().height($(this).parent().height());
|
||||
$(this).text("(less)");
|
||||
},
|
||||
function() {
|
||||
$(this).prev().hide();
|
||||
$(this).parent().prev().height(tHeight);
|
||||
$(this).text("more...")
|
||||
});
|
||||
}
|
||||
|
||||
function createFullTreeLinks() {
|
||||
var tHeight = 0;
|
||||
$('.inheritanceTree').toggle(function() {
|
||||
tHeight = $(this).parent().prev().height();
|
||||
$(this).prev().prev().hide();
|
||||
$(this).prev().show();
|
||||
$(this).text("(hide)");
|
||||
$(this).parent().prev().height($(this).parent().height());
|
||||
},
|
||||
function() {
|
||||
$(this).prev().prev().show();
|
||||
$(this).prev().hide();
|
||||
$(this).parent().prev().height(tHeight);
|
||||
$(this).text("show all")
|
||||
});
|
||||
}
|
||||
|
||||
function fixBoxInfoHeights() {
|
||||
$('dl.box dd.r1, dl.box dd.r2').each(function() {
|
||||
$(this).prev().height($(this).height());
|
||||
});
|
||||
}
|
||||
|
||||
function searchFrameLinks() {
|
||||
$('#method_list_link').click(function() {
|
||||
toggleSearchFrame(this, relpath + 'method_list.html');
|
||||
});
|
||||
|
||||
$('#class_list_link').click(function() {
|
||||
toggleSearchFrame(this, relpath + 'class_list.html');
|
||||
});
|
||||
|
||||
$('#file_list_link').click(function() {
|
||||
toggleSearchFrame(this, relpath + 'file_list.html');
|
||||
});
|
||||
}
|
||||
|
||||
function toggleSearchFrame(id, link) {
|
||||
var frame = $('#search_frame');
|
||||
$('#search a').removeClass('active').addClass('inactive');
|
||||
if (frame.attr('src') == link && frame.css('display') != "none") {
|
||||
frame.slideUp(100);
|
||||
$('#search a').removeClass('active inactive');
|
||||
}
|
||||
else {
|
||||
$(id).addClass('active').removeClass('inactive');
|
||||
frame.attr('src', link).slideDown(100);
|
||||
}
|
||||
}
|
||||
|
||||
function linkSummaries() {
|
||||
$('.summary_signature').click(function() {
|
||||
document.location = $(this).find('a').attr('href');
|
||||
});
|
||||
}
|
||||
|
||||
function framesInit() {
|
||||
if (window.top.frames.main) {
|
||||
document.body.className = 'frames';
|
||||
$('#menu .noframes a').attr('href', document.location);
|
||||
}
|
||||
}
|
||||
|
||||
function keyboardShortcuts() {
|
||||
if (window.top.frames.main) return;
|
||||
$(document).keypress(function(evt) {
|
||||
if (evt.altKey || evt.ctrlKey || evt.metaKey || evt.shiftKey) return;
|
||||
if (evt.originalTarget.nodeName == "INPUT" ||
|
||||
evt.originalTarget.nodeName == "TEXTAREA") return;
|
||||
switch (evt.charCode) {
|
||||
case 67: case 99: $('#class_list_link').click(); break; // 'c'
|
||||
case 77: case 109: $('#method_list_link').click(); break; // 'm'
|
||||
case 70: case 102: $('#file_list_link').click(); break; // 'f'
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function summaryToggle() {
|
||||
$('.summary_toggle').click(function() {
|
||||
$(this).text($(this).text() == "collapse" ? "expand" : "collapse");
|
||||
var next = $(this).parent().parent().next();
|
||||
if (next.hasClass('compact')) {
|
||||
next.toggle();
|
||||
next.next().toggle();
|
||||
}
|
||||
else if (next.hasClass('summary')) {
|
||||
var list = $('<ul class="summary compact" />');
|
||||
list.html(next.html());
|
||||
list.find('.summary_desc, .note').remove();
|
||||
list.find('a').each(function() {
|
||||
$(this).html($(this).find('strong').html());
|
||||
$(this).parent().html($(this)[0].outerHTML);
|
||||
});
|
||||
next.before(list);
|
||||
next.toggle();
|
||||
}
|
||||
return false;
|
||||
})
|
||||
}
|
||||
|
||||
$(framesInit);
|
||||
$(createSourceLinks);
|
||||
$(createDefineLinks);
|
||||
$(createFullTreeLinks);
|
||||
$(fixBoxInfoHeights);
|
||||
$(searchFrameLinks);
|
||||
$(linkSummaries);
|
||||
$(keyboardShortcuts);
|
||||
$(summaryToggle);
|
||||
@@ -1,117 +0,0 @@
|
||||
function fullListSearch() {
|
||||
$('#search input').keyup(function() {
|
||||
var value = this.value.toLowerCase();
|
||||
if (value == "") {
|
||||
$('#full_list').removeClass('insearch');
|
||||
$('#full_list li').each(function() {
|
||||
var link = $(this).children('a:last');
|
||||
link.text(link.text());
|
||||
});
|
||||
if (clicked) {
|
||||
clicked.parents('ul').each(function() {
|
||||
$(this).removeClass('collapsed').prev().removeClass('collapsed');
|
||||
});
|
||||
}
|
||||
highlight();
|
||||
}
|
||||
else {
|
||||
$('#full_list').addClass('insearch');
|
||||
$('#full_list li').each(function() {
|
||||
var link = $(this).children('a:last');
|
||||
var text = link.text();
|
||||
if (text.toLowerCase().indexOf(value) == -1) {
|
||||
$(this).removeClass('found');
|
||||
link.text(link.text());
|
||||
}
|
||||
else {
|
||||
$(this).css('padding-left', '10px').addClass('found');
|
||||
link.html(link.text().replace(new RegExp("(" +
|
||||
value.replace(/([\/.*+?|()\[\]{}\\])/g, "\\$1") + ")", "ig"),
|
||||
'<strong>$1</strong>'));
|
||||
}
|
||||
});
|
||||
highlight(true);
|
||||
}
|
||||
|
||||
if ($('#full_list li:visible').size() == 0) {
|
||||
$('#noresults').fadeIn();
|
||||
}
|
||||
else {
|
||||
$('#noresults').hide();
|
||||
}
|
||||
});
|
||||
|
||||
$('#search input').focus();
|
||||
$('#full_list').after("<div id='noresults'>No results were found.</div>")
|
||||
}
|
||||
|
||||
clicked = null;
|
||||
function linkList() {
|
||||
$('#full_list li, #full_list li a:last').click(function(evt) {
|
||||
if ($(this).hasClass('toggle')) return true;
|
||||
if (this.tagName.toLowerCase() == "li") {
|
||||
var toggle = $(this).children('a.toggle');
|
||||
if (toggle.size() > 0 && evt.pageX < toggle.offset().left) {
|
||||
toggle.click();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (clicked) clicked.removeClass('clicked');
|
||||
var win = window.parent;
|
||||
if (window.top.frames.main) {
|
||||
win = window.top.frames.main;
|
||||
var title = $('html head title', win.document).text();
|
||||
$('html head title', window.parent.document).text(title);
|
||||
}
|
||||
if (this.tagName.toLowerCase() == "a") {
|
||||
clicked = $(this).parent('li').addClass('clicked');
|
||||
win.location = this.href;
|
||||
}
|
||||
else {
|
||||
clicked = $(this).addClass('clicked');
|
||||
win.location = $(this).find('a:last').attr('href');
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
function collapse() {
|
||||
if (!$('#full_list').hasClass('class')) return;
|
||||
$('#full_list.class a.toggle').click(function() {
|
||||
$(this).parent().toggleClass('collapsed').next().toggleClass('collapsed');
|
||||
highlight();
|
||||
return false;
|
||||
});
|
||||
$('#full_list.class ul').each(function() {
|
||||
$(this).addClass('collapsed').prev().addClass('collapsed');
|
||||
});
|
||||
$('#full_list.class').children().removeClass('collapsed');
|
||||
highlight();
|
||||
}
|
||||
|
||||
function highlight(no_padding) {
|
||||
var n = 1;
|
||||
$('#full_list li:visible').each(function() {
|
||||
var next = n == 1 ? 2 : 1;
|
||||
$(this).removeClass("r" + next).addClass("r" + n);
|
||||
if (!no_padding && $('#full_list').hasClass('class')) {
|
||||
$(this).css('padding-left', (10 + $(this).parents('ul').size() * 15) + 'px');
|
||||
}
|
||||
n = next;
|
||||
});
|
||||
}
|
||||
|
||||
function escapeShortcut() {
|
||||
$(document).keydown(function(evt) {
|
||||
if (evt.which == 27) {
|
||||
$('#search_frame', window.top.document).slideUp(100);
|
||||
$('#search a', window.top.document).removeClass('active inactive')
|
||||
$(window.top).focus();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$(escapeShortcut);
|
||||
$(fullListSearch);
|
||||
$(linkList);
|
||||
$(collapse);
|
||||
19
doc/js/jquery.js
vendored
19
doc/js/jquery.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,291 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta name="Content-Type" content="text/html; charset=utf-8" />
|
||||
<link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" charset="utf-8" />
|
||||
<link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
|
||||
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
||||
<script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
|
||||
<base id="base_target" target="_parent" />
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
if (window.top.frames.main) {
|
||||
document.getElementById('base_target').target = 'main';
|
||||
document.body.className = 'frames';
|
||||
}
|
||||
</script>
|
||||
<div id="content">
|
||||
<h1 id="full_list_header">Method List</h1>
|
||||
<div id="nav">
|
||||
<a target="_self" href="class_list.html">Classes</a> |
|
||||
<a target="_self" href="method_list.html">Methods</a> |
|
||||
<a target="_self" href="file_list.html">Files</a>
|
||||
</div>
|
||||
<div id="search">Search: <input type="text" /></div>
|
||||
|
||||
<ul id="full_list" class="methods">
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#beginning_of_hour-instance_method" title="Time#beginning_of_hour (method)">#beginning_of_hour</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#beginning_of_minute-instance_method" title="Time#beginning_of_minute (method)">#beginning_of_minute</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#beginning_of_second-instance_method" title="Time#beginning_of_second (method)">#beginning_of_second</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#ceil-instance_method" title="Time#ceil (method)">#ceil</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#common_year_days_in_month-instance_method" title="Time#common_year_days_in_month (method)">#common_year_days_in_month</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#days_ago-instance_method" title="Time#days_ago (method)">#days_ago</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#days_into_week-instance_method" title="Time#days_into_week (method)">#days_into_week</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#days_since-instance_method" title="Time#days_since (method)">#days_since</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#end_of_hour-instance_method" title="Time#end_of_hour (method)">#end_of_hour</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#end_of_minute-instance_method" title="Time#end_of_minute (method)">#end_of_minute</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#end_of_second-instance_method" title="Time#end_of_second (method)">#end_of_second</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#floor-instance_method" title="Time#floor (method)">#floor</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#hours_ago-instance_method" title="Time#hours_ago (method)">#hours_ago</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#hours_since-instance_method" title="Time#hours_since (method)">#hours_since</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#minutes_ago-instance_method" title="Time#minutes_ago (method)">#minutes_ago</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#minutes_since-instance_method" title="Time#minutes_since (method)">#minutes_since</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#next_day-instance_method" title="Time#next_day (method)">#next_day</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#next_hour-instance_method" title="Time#next_hour (method)">#next_hour</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#next_minute-instance_method" title="Time#next_minute (method)">#next_minute</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#next_quarter-instance_method" title="Time#next_quarter (method)">#next_quarter</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#next_second-instance_method" title="Time#next_second (method)">#next_second</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#prev_day-instance_method" title="Time#prev_day (method)">#prev_day</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#prev_hour-instance_method" title="Time#prev_hour (method)">#prev_hour</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#prev_minute-instance_method" title="Time#prev_minute (method)">#prev_minute</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#prev_quarter-instance_method" title="Time#prev_quarter (method)">#prev_quarter</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#prev_second-instance_method" title="Time#prev_second (method)">#prev_second</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#prev_week-instance_method" title="Time#prev_week (method)">#prev_week</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#quarters_ago-instance_method" title="Time#quarters_ago (method)">#quarters_ago</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#quarters_since-instance_method" title="Time#quarters_since (method)">#quarters_since</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#round-instance_method" title="Time#round (method)">#round</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r1 ">
|
||||
<a href="Time.html#weeks_ago-instance_method" title="Time#weeks_ago (method)">#weeks_ago</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
<li class="r2 ">
|
||||
<a href="Time.html#weeks_since-instance_method" title="Time#weeks_since (method)">#weeks_since</a>
|
||||
|
||||
<small>Time</small>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,88 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta name="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>Top Level Namespace</title>
|
||||
<link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
|
||||
<link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
|
||||
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
relpath = '';
|
||||
if (relpath != '') relpath += '/';
|
||||
</script>
|
||||
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
||||
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
if (window.top.frames.main) document.body.className = 'frames';
|
||||
</script>
|
||||
|
||||
<div id="header">
|
||||
<div id="menu">
|
||||
|
||||
<a href="_index.html">Index</a> »
|
||||
|
||||
|
||||
<span class="title">Top Level Namespace</span>
|
||||
|
||||
|
||||
<div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
|
||||
</div>
|
||||
|
||||
<div id="search">
|
||||
<a id="class_list_link" href="#">Class List</a>
|
||||
<a id="method_list_link" href="#">Method List</a>
|
||||
<a id ="file_list_link" href="#">File List</a>
|
||||
</div>
|
||||
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<iframe id="search_frame"></iframe>
|
||||
|
||||
<div id="content"><h1>Top Level Namespace
|
||||
|
||||
|
||||
|
||||
</h1>
|
||||
|
||||
<dl class="box">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</dl>
|
||||
<div class="clear"></div>
|
||||
|
||||
<h2>Defined Under Namespace</h2>
|
||||
<p class="children">
|
||||
|
||||
|
||||
|
||||
|
||||
<strong class="classes">Classes:</strong> <a href="Time.html" title="Time (class)">Time</a>
|
||||
|
||||
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div id="footer">
|
||||
Generated on Tue Jul 27 20:08:52 2010 by
|
||||
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool">yard</a>
|
||||
0.5.8 (ruby-1.8.7).
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,3 +1,7 @@
|
||||
require 'rubygems'
|
||||
require 'active_support'
|
||||
require 'time_ext/time'
|
||||
|
||||
require 'time_ext/calculations'
|
||||
require 'time_ext/iterations'
|
||||
require 'time_ext/support'
|
||||
require 'time_ext/core_ext/time'
|
||||
require 'time_ext/core_ext/numeric'
|
||||
|
||||
193
lib/time_ext/calculations.rb
Normal file
193
lib/time_ext/calculations.rb
Normal file
@@ -0,0 +1,193 @@
|
||||
module TimeExt
|
||||
# Adds an even greater extent of calculation methods on top of those already provided by ActiveSupport.
|
||||
module Calculations
|
||||
|
||||
# Returns a new Time representing the start of the unit specified (second by default).
|
||||
def floor(unit = :sec)
|
||||
self.send("beginning_of_#{unit}")
|
||||
end
|
||||
alias :beginning_of :floor
|
||||
alias :at_beginning_of :floor
|
||||
|
||||
# Returns a new Time representing the start of the next unit specified (second by default).
|
||||
def ceil(unit = :sec)
|
||||
self.send("next_#{unit}").send("beginning_of_#{unit}")
|
||||
end
|
||||
alias :beginning_of_next :ceil
|
||||
alias :at_beginning_of_next :ceil
|
||||
|
||||
# Returns a new Time representing the start of the current or next unit specified (second by default) depending which is closest
|
||||
def round(unit = :sec)
|
||||
next_unit = self.ceil(unit)
|
||||
this_unit = self.floor(unit)
|
||||
(self - this_unit) < (next_unit - self) ? this_unit : next_unit
|
||||
end
|
||||
alias :beginning_of_closest :round
|
||||
|
||||
# Returns a new Time representing the previoius unit specified (defaults to second).
|
||||
def prev(unit = :sec)
|
||||
send("prev_#{unit}")
|
||||
end
|
||||
|
||||
# Returns a new Time representing the next unit specified (defaults to second).
|
||||
def next(unit = :sec)
|
||||
send("next_#{unit}")
|
||||
end
|
||||
|
||||
# Short-hand for seconds_ago(1).
|
||||
def prev_second
|
||||
seconds_ago(1)
|
||||
end
|
||||
alias :prev_sec :prev_second
|
||||
|
||||
# Short-hand for seconds_since(1).
|
||||
def next_second
|
||||
seconds_since(1)
|
||||
end
|
||||
alias :next_sec :next_second
|
||||
|
||||
# Short-hand for minutes_ago(1).
|
||||
def prev_minute
|
||||
minutes_ago(1)
|
||||
end
|
||||
alias :prev_min :prev_minute
|
||||
|
||||
# Short-hand for minutes_since(1).
|
||||
def next_minute
|
||||
minutes_since(1)
|
||||
end
|
||||
alias :next_min :next_minute
|
||||
|
||||
# Short-hand for hours_ago(1).
|
||||
def prev_hour
|
||||
hours_ago(1)
|
||||
end
|
||||
|
||||
# Short-hand for hours_since(1).
|
||||
def next_hour
|
||||
hours_since(1)
|
||||
end
|
||||
|
||||
# Short-hand for days_ago(1).
|
||||
def prev_day
|
||||
days_ago(1)
|
||||
end
|
||||
|
||||
# Short-hand for days_since(1).
|
||||
def next_day
|
||||
days_since(1)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the start of the given day in the previous week (default is Monday).
|
||||
def prev_week(day = :monday)
|
||||
weeks_ago(1).beginning_of_week.since(days_into_week[day].day).change(:hour => 0)
|
||||
end
|
||||
|
||||
# Short-hand for quarters_since(1).beginning_of_quarter.
|
||||
def next_quarter
|
||||
quarters_since(1).beginning_of_quarter
|
||||
end
|
||||
|
||||
# Short-hand for quarters_ago(1).beginning_of_quarter.
|
||||
def prev_quarter
|
||||
quarters_ago(1).beginning_of_quarter
|
||||
end
|
||||
|
||||
# Returns a new Time representing the time a number of specified minutes ago.
|
||||
def minutes_ago(minutes)
|
||||
ago(minutes.minutes)
|
||||
end
|
||||
alias :mins_ago :minutes_ago
|
||||
|
||||
# Returns a new Time representing the time a number of specified minutes in the future.
|
||||
def minutes_since(minutes)
|
||||
since(minutes.minutes)
|
||||
end
|
||||
alias :mins_since :minutes_since
|
||||
|
||||
# Returns a new Time representing the time a number of specified hours ago.
|
||||
def hours_ago(hours)
|
||||
ago(hours.hours)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the time a number of specified hours in the future.
|
||||
def hours_since(hours)
|
||||
since(hours.hours)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the time a number of specified days ago.
|
||||
def days_ago(days)
|
||||
ago(days.days)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the time a number of specified days in the future.
|
||||
def days_since(days)
|
||||
since(days.days)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the time a number of specified weeks ago.
|
||||
def weeks_ago(weeks)
|
||||
ago(weeks.weeks)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the time a number of specified weeks in the future.
|
||||
def weeks_since(weeks)
|
||||
since(weeks.weeks)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the time a number of specified quarters (3 months) ago.
|
||||
def quarters_ago(quarters)
|
||||
ago((quarters * 3).months)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the time a number of specified quarters (3 months) in the future.
|
||||
def quarters_since(quarters)
|
||||
since((quarters * 3).months)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the end of the unit specified (defaults to second).
|
||||
def end_of(unit = :sec)
|
||||
send("end_of_#{unit}")
|
||||
end
|
||||
|
||||
# Returns a new Time representing the start of the second, XX:XX:XX.000000 (.000000000 in ruby1.9).
|
||||
def beginning_of_second
|
||||
change(:usec => 0)
|
||||
end
|
||||
alias :beginning_of_sec :beginning_of_second
|
||||
alias :at_beginning_of_sec :beginning_of_second
|
||||
alias :at_beginning_of_second :beginning_of_second
|
||||
|
||||
# Returns a new Time representing the end of the hour, XX:XX:XX.999999 (.999999999 in ruby1.9).
|
||||
def end_of_second
|
||||
change(:usec => 999999.999)
|
||||
end
|
||||
alias :end_of_sec :end_of_second
|
||||
|
||||
# Returns a new Time representing the start of the minute (XX:XX:00).
|
||||
def beginning_of_minute
|
||||
change(:sec => 0, :usec => 0)
|
||||
end
|
||||
alias :beginning_of_min :beginning_of_minute
|
||||
alias :at_beginning_of_min :beginning_of_minute
|
||||
alias :at_beginning_of_minute :beginning_of_minute
|
||||
|
||||
# Returns a new Time representing the end of the hour, XX:XX:59.999999 (.999999999 in ruby1.9).
|
||||
def end_of_minute
|
||||
change(:sec => 59, :usec => 999999.999)
|
||||
end
|
||||
alias :end_of_min :end_of_minute
|
||||
|
||||
# Returns a new Time representing the start of the hour (XX:00:00).
|
||||
def beginning_of_hour
|
||||
change(:min => 0, :sec => 0, :usec => 0)
|
||||
end
|
||||
alias :at_beginning_of_hour :beginning_of_hour
|
||||
|
||||
# Returns a new Time representing the end of the hour, XX:59:59.999999 (.999999999 in ruby1.9).
|
||||
def end_of_hour
|
||||
change(:min => 59, :sec => 59, :usec => 999999.999)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
6
lib/time_ext/core_ext/numeric.rb
Normal file
6
lib/time_ext/core_ext/numeric.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
require 'active_support/core_ext/numeric/time' unless Numeric.new.respond_to?(:seconds) # fixes rare loading issue
|
||||
|
||||
class Numeric
|
||||
alias :sec :seconds
|
||||
alias :min :minutes
|
||||
end
|
||||
15
lib/time_ext/core_ext/time.rb
Normal file
15
lib/time_ext/core_ext/time.rb
Normal file
@@ -0,0 +1,15 @@
|
||||
require 'active_support'
|
||||
require 'active_support/time' unless Time.respond_to?(:days_in_month) # support both Active Support 2.x and 3.x
|
||||
require 'active_support/core_ext/time/calculations' unless Time.new.respond_to?(:ago) # fixes rare loading issue
|
||||
|
||||
class Time
|
||||
include TimeExt::Support
|
||||
include TimeExt::Calculations
|
||||
include TimeExt::Iterations
|
||||
|
||||
# Aliases to keep available method names to a standard pattern.
|
||||
alias :secs_ago :ago
|
||||
alias :seconds_ago :ago
|
||||
alias :secs_since :since
|
||||
alias :seconds_since :since
|
||||
end
|
||||
103
lib/time_ext/iterations.rb
Normal file
103
lib/time_ext/iterations.rb
Normal file
@@ -0,0 +1,103 @@
|
||||
module TimeExt
|
||||
# Allows you to iterate over Time objects with #each and other methods almost as if it was an Array or Hash.
|
||||
module Iterations
|
||||
|
||||
# Used by #each, #map_each and similar methods to iterate over ranges of time.
|
||||
def iterate(unit, options = {}, &block)
|
||||
options.reverse_merge!(:map_result => false, :beginning_of => false, :include_start => false, :include_end => true)
|
||||
if block_given?
|
||||
units = [:year, :month, :day, :hour, :min, :sec, :usec]
|
||||
parent_unit = units[units.index(unit)-1]
|
||||
if @of_the.nil?
|
||||
time = self.clone
|
||||
@until ||= (!parent_unit.nil?) ? self.send("#{parent_unit}s_since", 1) : self.send("#{unit}s_since", 1)
|
||||
else
|
||||
time = self.beginning_of(@of_the)
|
||||
@until = self.next(@of_the).beginning_of(@of_the)
|
||||
options.merge!(:beginning_of => true, :include_start => true, :include_end => false)
|
||||
end
|
||||
direction = (self < @until) ? :f : :b
|
||||
succ_method = (direction == :f) ? "next_#{unit}" : "prev_#{unit}"
|
||||
time = time.beginning_of(unit) if options[:beginning_of]
|
||||
time = time.send(succ_method) if !options[:include_start]
|
||||
@until = @until.prev(unit).end_of(unit) if !options[:include_end]
|
||||
results = []
|
||||
while (direction == :f && time <= @until) || (direction == :b && time >= @until)
|
||||
options[:map_result] ? results << yield(time) : yield(time)
|
||||
time = time.send(succ_method)
|
||||
end
|
||||
options[:map_result] ? results : self
|
||||
else
|
||||
add_to_chain(:iterate, unit, options)
|
||||
self
|
||||
end
|
||||
end
|
||||
|
||||
# Used togeter with #each and other iteration methods to specify end of interation.
|
||||
def until(time, &block)
|
||||
time = time.to_time if time.is_a?(::Date)
|
||||
@until = time
|
||||
return call_chain(block) if block_given?
|
||||
self
|
||||
end
|
||||
alias :till :until
|
||||
|
||||
# Used together with #each and other interation methods to specify start of iteration, and end will be current object.
|
||||
def from(time, &block)
|
||||
time = time.to_time if time.is_a?(::Date)
|
||||
method, args = @method_chain.pop if block_given?
|
||||
if !method.nil?
|
||||
time.until(self).send(method, *args, &block)
|
||||
else
|
||||
time.until(self)
|
||||
end
|
||||
end
|
||||
|
||||
# Let's you iterate over every unit specified in the #each or #map call for the specified unit.
|
||||
def of_the(unit, &block)
|
||||
@of_the = unit
|
||||
return call_chain(block) if block_given?
|
||||
self
|
||||
end
|
||||
alias :of :of_the
|
||||
|
||||
# Executes passed block for each "unit" of time specified, with a new time object for each interval passed to the block.
|
||||
def each(unit, options = {}, &block)
|
||||
iterate(unit, options.merge(:map_result => false), &block)
|
||||
end
|
||||
|
||||
# Executes passed block for each "unit" of time specified, with a new time object set to the beginning of "unit" for each interval passed to the block.
|
||||
def beginning_of_each(unit, options = {}, &block)
|
||||
iterate(unit, options.merge(:map_result => false, :beginning_of => true), &block)
|
||||
end
|
||||
|
||||
# Executes passed block for each "unit" of time specified, returning an array with the return values from the passed block.
|
||||
def map_each(unit, options = {}, &block)
|
||||
iterate(unit, options.merge(:map_result => true), &block)
|
||||
end
|
||||
|
||||
# Executes passed block for each "unit" of time specified, returning an array with the return values from passed block. Additionally the time object passed into the block is set to the beginning of specified "unit".
|
||||
def map_beginning_of_each(unit, options = {}, &block)
|
||||
iterate(unit, options.merge(:map_result => true, :beginning_of => true), &block)
|
||||
end
|
||||
|
||||
# Dynamically define convenience methods, like #each_hour instead of #each(:hour).
|
||||
[:year, :month, :day, :hour, :min, :sec].each do |unit|
|
||||
[:each, :beginning_of_each, :map_each, :map_beginning_of_each].each do |method|
|
||||
define_method "#{method}_#{unit}" do |*args, &block|
|
||||
send(method, unit, *args, &block)
|
||||
end
|
||||
class_eval { alias :"#{method}_minute" :"#{method}_min" } if unit == :min
|
||||
class_eval { alias :"#{method}_second" :"#{method}_sec" } if unit == :sec
|
||||
end
|
||||
[:of_the, :of].each do |method|
|
||||
define_method "#{method}_#{unit}" do |*args, &block|
|
||||
send(method, unit, *args, &block)
|
||||
end
|
||||
class_eval { alias :"#{method}_minute" :"#{method}_min" } if unit == :min
|
||||
class_eval { alias :"#{method}_second" :"#{method}_sec" } if unit == :sec
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
27
lib/time_ext/support.rb
Normal file
27
lib/time_ext/support.rb
Normal file
@@ -0,0 +1,27 @@
|
||||
module TimeExt
|
||||
# Provides helper methods used by TimeExt::Calculations for backwards compatibility with ActiveSupport, and method chaining helpers for TimeExt::Iterations.
|
||||
module Support
|
||||
|
||||
def days_into_week
|
||||
defined?(DAYS_INTO_WEEK) ? DAYS_INTO_WEEK : { :monday => 0, :tuesday => 1, :wednesday => 2, :thursday => 3, :friday => 4, :saturday => 5, :sunday => 6 }
|
||||
end
|
||||
|
||||
def common_year_days_in_month
|
||||
defined?(COMMON_YEAR_DAYS_IN_MONTH) ? COMMON_YEAR_DAYS_IN_MONTH : [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
||||
end
|
||||
|
||||
def add_to_chain(method, *args, &block)
|
||||
@method_chain ||= []
|
||||
@method_chain << [method.to_sym, args, block]
|
||||
end
|
||||
|
||||
def call_chain(custom_block = nil, &block)
|
||||
method, args, iblock = @method_chain.pop
|
||||
return nil if method.nil?
|
||||
iblock = custom_block if !custom_block.nil?
|
||||
method, args, iblock = yield(method, args, iblock) if block_given?
|
||||
self.send(method, *args, &iblock)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
@@ -1,191 +0,0 @@
|
||||
class Time
|
||||
|
||||
# Helper method for backwards compatibility with ActiveSupport.
|
||||
def days_into_week
|
||||
defined?(DAYS_INTO_WEEK) ? DAYS_INTO_WEEK : { :monday => 0, :tuesday => 1, :wednesday => 2, :thursday => 3, :friday => 4, :saturday => 5, :sunday => 6 }
|
||||
end
|
||||
|
||||
# Helper method for backwards compatibility with ActiveSupport.
|
||||
def common_year_days_in_month
|
||||
defined?(COMMON_YEAR_DAYS_IN_MONTH) ? COMMON_YEAR_DAYS_IN_MONTH : [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
||||
end
|
||||
|
||||
# Returns a new Time representing the start of the unit specified (second by default).
|
||||
def floor(unit = :sec)
|
||||
self.send("beginning_of_#{unit}")
|
||||
end
|
||||
alias :beginning_of :floor
|
||||
alias :at_beginning_of :floor
|
||||
|
||||
# Returns a new Time representing the start of the next unit specified (second by default).
|
||||
def ceil(unit = :sec)
|
||||
self.send("next_#{unit}").send("beginning_of_#{unit}")
|
||||
end
|
||||
alias :beginning_of_next :ceil
|
||||
alias :at_beginning_of_next :ceil
|
||||
|
||||
# Returns a new Time representing the start of the current or next unit specified (second by default) depending which is closest
|
||||
def round(unit = :sec)
|
||||
next_unit = self.ceil(unit)
|
||||
this_unit = self.floor(unit)
|
||||
(self - this_unit) < (next_unit - self) ? this_unit : next_unit
|
||||
end
|
||||
alias :beginning_of_closest :round
|
||||
|
||||
# Short-hand for seconds_ago(1).
|
||||
def prev_second
|
||||
ago(1)
|
||||
end
|
||||
alias :prev_sec :prev_second
|
||||
|
||||
# Short-hand for seconds_since(1).
|
||||
def next_second
|
||||
since(1)
|
||||
end
|
||||
alias :next_sec :next_second
|
||||
|
||||
# Short-hand for minutes_ago(1).
|
||||
def prev_minute
|
||||
minutes_ago(1)
|
||||
end
|
||||
alias :prev_min :prev_minute
|
||||
|
||||
# Short-hand for minutes_since(1).
|
||||
def next_minute
|
||||
minutes_since(1)
|
||||
end
|
||||
alias :next_min :next_minute
|
||||
|
||||
# Short-hand for hours_ago(1).
|
||||
def prev_hour
|
||||
hours_ago(1)
|
||||
end
|
||||
|
||||
# Short-hand for hours_since(1).
|
||||
def next_hour
|
||||
hours_since(1)
|
||||
end
|
||||
|
||||
# Short-hand for days_ago(1).
|
||||
def prev_day
|
||||
days_ago(1)
|
||||
end
|
||||
|
||||
# Short-hand for days_since(1).
|
||||
def next_day
|
||||
days_since(1)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the start of the given day in the previous week (default is Monday).
|
||||
def prev_week(day = :monday)
|
||||
weeks_ago(1).beginning_of_week.since(days_into_week[day].day).change(:hour => 0)
|
||||
end
|
||||
|
||||
# Short-hand for quarters_since(1).beginning_of_quarter.
|
||||
def next_quarter
|
||||
quarters_since(1).beginning_of_quarter
|
||||
end
|
||||
|
||||
# Short-hand for quarters_ago(1).beginning_of_quarter.
|
||||
def prev_quarter
|
||||
quarters_ago(1).beginning_of_quarter
|
||||
end
|
||||
|
||||
# Aliases to keep available method names to a standard pattern.
|
||||
alias :secs_ago :ago
|
||||
alias :seconds_ago :ago
|
||||
alias :secs_since :since
|
||||
alias :seconds_since :since
|
||||
|
||||
# Returns a new Time representing the time a number of specified minutes ago.
|
||||
def minutes_ago(minutes)
|
||||
ago(minutes.minutes)
|
||||
end
|
||||
alias :mins_ago :minutes_ago
|
||||
|
||||
# Returns a new Time representing the time a number of specified minutes in the future.
|
||||
def minutes_since(minutes)
|
||||
since(minutes.minutes)
|
||||
end
|
||||
alias :mins_since :minutes_since
|
||||
|
||||
# Returns a new Time representing the time a number of specified hours ago.
|
||||
def hours_ago(hours)
|
||||
ago(hours.hours)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the time a number of specified hours in the future.
|
||||
def hours_since(hours)
|
||||
since(hours.hours)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the time a number of specified days ago.
|
||||
def days_ago(days)
|
||||
ago(days.days)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the time a number of specified days in the future.
|
||||
def days_since(days)
|
||||
since(days.days)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the time a number of specified weeks ago.
|
||||
def weeks_ago(weeks)
|
||||
ago(weeks.weeks)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the time a number of specified weeks in the future.
|
||||
def weeks_since(weeks)
|
||||
since(weeks.weeks)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the time a number of specified quarters (3 months) ago.
|
||||
def quarters_ago(quarters)
|
||||
ago((quarters * 3).months)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the time a number of specified quarters (3 months) in the future.
|
||||
def quarters_since(quarters)
|
||||
since((quarters * 3).months)
|
||||
end
|
||||
|
||||
# Returns a new Time representing the start of the second, XX:XX:XX.000000 (.000000000 in ruby1.9).
|
||||
def beginning_of_second
|
||||
change(:usec => 0)
|
||||
end
|
||||
alias :beginning_of_sec :beginning_of_second
|
||||
alias :at_beginning_of_sec :beginning_of_second
|
||||
alias :at_beginning_of_second :beginning_of_second
|
||||
|
||||
# Returns a new Time representing the end of the hour, XX:XX:XX.999999 (.999999999 in ruby1.9).
|
||||
def end_of_second
|
||||
change(:usec => 999999.999)
|
||||
end
|
||||
alias :end_of_sec :end_of_second
|
||||
|
||||
# Returns a new Time representing the start of the minute (XX:XX:00).
|
||||
def beginning_of_minute
|
||||
change(:sec => 0, :usec => 0)
|
||||
end
|
||||
alias :beginning_of_min :beginning_of_minute
|
||||
alias :at_beginning_of_min :beginning_of_minute
|
||||
alias :at_beginning_of_minute :beginning_of_minute
|
||||
|
||||
# Returns a new Time representing the end of the hour, XX:XX:59.999999 (.999999999 in ruby1.9).
|
||||
def end_of_minute
|
||||
change(:sec => 59, :usec => 999999.999)
|
||||
end
|
||||
alias :end_of_min :end_of_minute
|
||||
|
||||
# Returns a new Time representing the start of the hour (XX:00:00).
|
||||
def beginning_of_hour
|
||||
change(:min => 0, :sec => 0, :usec => 0)
|
||||
end
|
||||
alias :at_beginning_of_hour :beginning_of_hour
|
||||
|
||||
# Returns a new Time representing the end of the hour, XX:59:59.999999 (.999999999 in ruby1.9).
|
||||
def end_of_hour
|
||||
change(:min => 59, :sec => 59, :usec => 999999.999)
|
||||
end
|
||||
|
||||
end
|
||||
3
lib/time_ext/version.rb
Normal file
3
lib/time_ext/version.rb
Normal file
@@ -0,0 +1,3 @@
|
||||
module TimeExt
|
||||
VERSION = "0.2.9"
|
||||
end
|
||||
19
spec/core_ext_spec.rb
Normal file
19
spec/core_ext_spec.rb
Normal file
@@ -0,0 +1,19 @@
|
||||
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
||||
|
||||
describe "Core Extensions" do
|
||||
|
||||
it "should alias Numeric class methods" do
|
||||
number = 1
|
||||
number.sec.should == number.second
|
||||
number.min.should == number.minute
|
||||
end
|
||||
|
||||
it "should alias Time instance methods" do
|
||||
time = Time.now
|
||||
time.secs_ago(10).should == time.ago(10)
|
||||
time.seconds_ago(10).should == time.ago(10)
|
||||
time.secs_since(10).should == time.since(10)
|
||||
time.seconds_since(10).should == time.since(10)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,2 +0,0 @@
|
||||
--format specdoc
|
||||
--color
|
||||
@@ -1,9 +1,6 @@
|
||||
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
||||
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
||||
require 'time_ext'
|
||||
require 'spec'
|
||||
require 'spec/autorun'
|
||||
|
||||
Spec::Runner.configure do |config|
|
||||
|
||||
end
|
||||
require 'time_ext'
|
||||
require 'rspec'
|
||||
require 'rspec/autorun'
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
||||
|
||||
describe "TimeExt" do
|
||||
describe "Time Calculations" do
|
||||
|
||||
before(:each) do
|
||||
@time = Time.local(2010, 8, 28, 15, 57, 17, 78430)
|
||||
97
spec/time_iterations_spec.rb
Normal file
97
spec/time_iterations_spec.rb
Normal file
@@ -0,0 +1,97 @@
|
||||
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
||||
|
||||
describe "Time Iterations" do
|
||||
|
||||
before(:each) do
|
||||
@now = Time.now
|
||||
end
|
||||
|
||||
it "should iterate over time objects with #each" do
|
||||
times = []
|
||||
result = @now.each(:hour) { |time| times << time }
|
||||
times.should have(24).items
|
||||
times.should == (1..24).map { |i| @now + i.hours }
|
||||
result.should == @now
|
||||
end
|
||||
|
||||
it "should iterate over time objects with #beginning_of_each" do
|
||||
times = []
|
||||
result = @now.beginning_of_each_hour { |time| times << time }
|
||||
times.should have(24).items
|
||||
times.should == (1..24).map { |i| @now.beginning_of_hour + i.hours }
|
||||
result.should == @now
|
||||
end
|
||||
|
||||
it "should iterate over time objects with #map_each" do
|
||||
result = @now.map_each_hour { |time| time }
|
||||
result.should have(24).items
|
||||
result.should == (1..24).map { |i| @now + i.hours }
|
||||
end
|
||||
|
||||
it "should iterate over time objects with #map_beginning_of_each" do
|
||||
result = @now.map_beginning_of_each(:hour) { |time| time }
|
||||
result.should have(24).items
|
||||
result.should == (1..24).map { |i| @now.beginning_of_hour + i.hours }
|
||||
end
|
||||
|
||||
it "should iterate over time objects with #each and #until via method chaining" do
|
||||
match = (1..6).map { |i| @now + i.hours }
|
||||
|
||||
times = []
|
||||
result = @now.each(:hour).until(@now + 6.hours) { |time| times << time }
|
||||
times.should == match
|
||||
result.should == @now
|
||||
|
||||
times = []
|
||||
result = @now.until(@now + 6.hours).each_hour { |time| times << time }
|
||||
times.should == match
|
||||
result.should == @now
|
||||
end
|
||||
|
||||
it "should iterate over time objects with #map_each and #until via method chaining" do
|
||||
match = (1..6).map { |i| @now + i.hours }
|
||||
@now.map_each_hour.until(@now + 6.hours) { |time| time }.should == match
|
||||
@now.until(@now + 6.hours).map_each(:hour) { |time| time }.should == match
|
||||
end
|
||||
|
||||
it "should iterate over time objects backwards with #until set in the past" do
|
||||
match = (1..6).map { |i| @now - i.hours }
|
||||
@now.map_each_hour.until(@now - 6.hours) { |time| time }.should == match
|
||||
@now.until(@now - 6.hours).map_each(:hour) { |time| time }.should == match
|
||||
end
|
||||
|
||||
it "should iterate over time objects with #map_each and #from via method chaining" do
|
||||
match = (1..6).map { |i| @now + i.hours }
|
||||
(@now + 6.hours).map_each_hour.from(@now) { |time| time }.should == match
|
||||
(@now + 6.hours).from(@now).map_each(:hour) { |time| time }.should == match
|
||||
end
|
||||
|
||||
it "should iterate over time objects with #map_each and #of_the via method chaining" do
|
||||
match = (0..23).map { |i| ((@now - (@now.hour).hours) + i.hours).beginning_of_hour }
|
||||
@now.map_each_hour.of_the(:day) { |time| time }.should == match
|
||||
@now.map_each_hour.of_the_day { |time| time }.should == match
|
||||
match = @now.beginning_of_month.map_beginning_of_each_hour(:include_start => true, :include_end => false).until(@now.next_month.beginning_of_month) { |time| time }
|
||||
@now.map_each_hour.of_the(:month) { |time| time }.should == match
|
||||
end
|
||||
|
||||
it "should iterate and respect the include_start and include_end options" do
|
||||
match = (1..6).map { |i| @now + i.hours }
|
||||
@now.map_each_hour.until(@now + 6.hours) { |time| time }.should == match
|
||||
match = (1..6).map { |i| @now + i.hours }
|
||||
@now.map_each_hour(:include_end => true).until(@now + 6.hours) { |time| time }.should == match
|
||||
@now.map_each_hour(:include_start => false).until(@now + 6.hours) { |time| time }.should == match
|
||||
match = (0..6).map { |i| @now + i.hours }
|
||||
@now.map_each_hour(:include_start => true).until(@now + 6.hours) { |time| time }.should == match
|
||||
match = (0..5).map { |i| @now + i.hours }
|
||||
@now.map_each_hour(:include_start => true, :include_end => false).until(@now + 6.hours) { |time| time }.should == match
|
||||
match = (0..6).map { |i| @now + i.hours }
|
||||
@now.map_each_hour(:include_start => true, :include_end => true).until(@now + 6.hours) { |time| time }.should == match
|
||||
end
|
||||
|
||||
it "should iterate and respect the beginning_of option" do
|
||||
match = (1..6).map { |i| @now.beginning_of_hour + i.hours }
|
||||
@now.map_beginning_of_each_hour.until(@now.beginning_of_hour + 6.hours) { |time| time }.should == match
|
||||
@now.map_each_hour(:beginning_of => true).until(@now.beginning_of_hour + 6.hours) { |time| time }.should == match
|
||||
end
|
||||
|
||||
end
|
||||
29
time_ext.gemspec
Normal file
29
time_ext.gemspec
Normal file
@@ -0,0 +1,29 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
$:.push File.expand_path("../lib", __FILE__)
|
||||
require "time_ext/version"
|
||||
|
||||
Gem::Specification.new do |s|
|
||||
s.name = "time_ext"
|
||||
s.version = TimeExt::VERSION
|
||||
s.platform = Gem::Platform::RUBY
|
||||
s.authors = ["Jim Myhrberg"]
|
||||
s.email = ["contact@jimeh.me"]
|
||||
s.homepage = "http://github.com/jimeh/time_ext"
|
||||
s.summary = "Extends the abilities of Ruby's built-in Time class by building on top of ActiveSupport."
|
||||
s.description = "Extends the abilities of Ruby's built-in Time class by building on top of ActiveSupport."
|
||||
|
||||
s.rubyforge_project = "time_ext"
|
||||
|
||||
s.files = `git ls-files`.split("\n")
|
||||
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
||||
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
||||
s.require_paths = ["lib"]
|
||||
|
||||
s.add_runtime_dependency 'activesupport', '>= 2.3.2'
|
||||
s.add_runtime_dependency 'i18n', '>= 0.4.2'
|
||||
|
||||
s.add_development_dependency 'rake', '>= 0.8.7'
|
||||
s.add_development_dependency 'rspec', '>= 2.1.0'
|
||||
s.add_development_dependency 'yard', '>= 0.6.3'
|
||||
s.add_development_dependency 'ruby-debug'
|
||||
end
|
||||
Reference in New Issue
Block a user