gadgeto 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +9 -0
- data/Gemfile +9 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +69 -0
- data/Rakefile +42 -0
- data/VERSION +1 -0
- data/gadgeto.gemspec +68 -0
- data/lib/gadgeto/dslable.rb +161 -0
- data/lib/gadgeto/email/validators.rb +9 -0
- data/lib/gadgeto/email.rb +22 -0
- data/lib/gadgeto/sanitize_filename.rb +16 -0
- data/lib/gadgeto/time_of_day.rb +142 -0
- data/lib/gadgeto.rb +0 -0
- data/spec/lib/gadgeto/dslable_spec.rb +58 -0
- data/spec/lib/gadgeto/email_spec.rb +11 -0
- data/spec/lib/gadgeto/sanitize_filename_spec.rb +29 -0
- data/spec/lib/gadgeto/time_of_day_spec.rb +105 -0
- data/spec/spec_helper.rb +4 -0
- data/test/helper.rb +18 -0
- data/test/test_gadgeto.rb +7 -0
- metadata +115 -0
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 Robert Gogolok, Matthias Zirnstein
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
= Gadgeto
|
2
|
+
|
3
|
+
Collection of ruby code snippets.
|
4
|
+
|
5
|
+
{<img src="https://secure.travis-ci.org/avarteqgmbh/gadgeto.png" />}[http://travis-ci.org/avarteqgmbh/gadgeto]
|
6
|
+
|
7
|
+
== Gadgeto::Dslable
|
8
|
+
|
9
|
+
class Foo
|
10
|
+
include Gadgeto::Dslable
|
11
|
+
include Gadgeto::Dslable::Display
|
12
|
+
|
13
|
+
dslable_method :item, :key, '*arguments'
|
14
|
+
|
15
|
+
|
16
|
+
def inspect
|
17
|
+
attributes[:key]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
f = Foo.new
|
22
|
+
|
23
|
+
|
24
|
+
f.draw do
|
25
|
+
item 'home', :baem => :bum do
|
26
|
+
item 'terms'
|
27
|
+
item 'imprint'
|
28
|
+
end
|
29
|
+
|
30
|
+
item 'products' do
|
31
|
+
item 'kitchen' do
|
32
|
+
item 'forks'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
f.display :items
|
38
|
+
f.items[0].attributes[:key] #=> "home"
|
39
|
+
|
40
|
+
== Gadgeto::Email
|
41
|
+
|
42
|
+
Gadgeto::Email.valid?("user@example.com") #=> true
|
43
|
+
Gadgeto::Email.valid?("user+name@example.com") #=> true
|
44
|
+
|
45
|
+
== Gadgeto::TimeOfDay
|
46
|
+
|
47
|
+
t = Gadgeto::TimeOfDay.new("08:30") #=> 08:00
|
48
|
+
t.hour #=> 8
|
49
|
+
t.minute #=> 30
|
50
|
+
t.to_i #=> 480
|
51
|
+
t.add_minutes(30) #=> 09:00
|
52
|
+
|
53
|
+
t1 = Gadgeto::TimeOfDay.new("08:30") #=> 08:30
|
54
|
+
t2 = Gadgeto::TimeOfDay.new("09:30") #=> 09:30
|
55
|
+
t1 < t2 #=> true
|
56
|
+
t1 > t2 #=> false
|
57
|
+
t1.minutes_till(t2) #=> 60
|
58
|
+
t1 == t2 #=> false
|
59
|
+
|
60
|
+
== Gadgeto::SanitizeFilename (Module)
|
61
|
+
|
62
|
+
obj = Object.new
|
63
|
+
obj.extend(Gadgeto::SanitizeFilename)
|
64
|
+
obj.sanitize_filename("foo bar.zip") #=> "foo_bar.zip"
|
65
|
+
|
66
|
+
== Copyright
|
67
|
+
|
68
|
+
Copyright (c) 2012 Robert Gogolok, Matthias Zirnstein. See LICENSE.txt for
|
69
|
+
further details.
|
data/Rakefile
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'rspec/core/rake_task'
|
15
|
+
RSpec::Core::RakeTask.new(:spec)
|
16
|
+
|
17
|
+
require 'jeweler'
|
18
|
+
Jeweler::Tasks.new do |gem|
|
19
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
20
|
+
gem.name = "gadgeto"
|
21
|
+
gem.homepage = "http://github.com/avarteqgmbh/gadgeto"
|
22
|
+
gem.license = "MIT"
|
23
|
+
gem.summary = %Q{collection of useful code snippets}
|
24
|
+
gem.description = %Q{collection of useful code snippets}
|
25
|
+
gem.email = "rgogolok@avarteq.de"
|
26
|
+
gem.authors = ["Robert Gogolok", "Matthias Zirnstein"]
|
27
|
+
# dependencies defined in Gemfile
|
28
|
+
end
|
29
|
+
Jeweler::RubygemsDotOrgTasks.new
|
30
|
+
|
31
|
+
|
32
|
+
task :default => :spec
|
33
|
+
|
34
|
+
require 'rdoc/task'
|
35
|
+
Rake::RDocTask.new do |rdoc|
|
36
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
37
|
+
|
38
|
+
rdoc.rdoc_dir = 'rdoc'
|
39
|
+
rdoc.title = "gadgeto #{version}"
|
40
|
+
rdoc.rdoc_files.include('README*')
|
41
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
42
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.0
|
data/gadgeto.gemspec
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "gadgeto"
|
8
|
+
s.version = "0.0.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Robert Gogolok", "Matthias Zirnstein"]
|
12
|
+
s.date = "2012-01-06"
|
13
|
+
s.description = "collection of useful code snippets"
|
14
|
+
s.email = "rgogolok@avarteq.de"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".travis.yml",
|
21
|
+
"Gemfile",
|
22
|
+
"LICENSE.txt",
|
23
|
+
"README.rdoc",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION",
|
26
|
+
"gadgeto.gemspec",
|
27
|
+
"lib/gadgeto.rb",
|
28
|
+
"lib/gadgeto/dslable.rb",
|
29
|
+
"lib/gadgeto/email.rb",
|
30
|
+
"lib/gadgeto/email/validators.rb",
|
31
|
+
"lib/gadgeto/sanitize_filename.rb",
|
32
|
+
"lib/gadgeto/time_of_day.rb",
|
33
|
+
"spec/lib/gadgeto/dslable_spec.rb",
|
34
|
+
"spec/lib/gadgeto/email_spec.rb",
|
35
|
+
"spec/lib/gadgeto/sanitize_filename_spec.rb",
|
36
|
+
"spec/lib/gadgeto/time_of_day_spec.rb",
|
37
|
+
"spec/spec_helper.rb",
|
38
|
+
"test/helper.rb",
|
39
|
+
"test/test_gadgeto.rb"
|
40
|
+
]
|
41
|
+
s.homepage = "http://github.com/avarteqgmbh/gadgeto"
|
42
|
+
s.licenses = ["MIT"]
|
43
|
+
s.require_paths = ["lib"]
|
44
|
+
s.rubygems_version = "1.8.10"
|
45
|
+
s.summary = "collection of useful code snippets"
|
46
|
+
|
47
|
+
if s.respond_to? :specification_version then
|
48
|
+
s.specification_version = 3
|
49
|
+
|
50
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
51
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
52
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
53
|
+
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
54
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
55
|
+
else
|
56
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
57
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
58
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
59
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
60
|
+
end
|
61
|
+
else
|
62
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
63
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
64
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
65
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
@@ -0,0 +1,161 @@
|
|
1
|
+
|
2
|
+
module Gadgeto
|
3
|
+
#
|
4
|
+
# class Foo
|
5
|
+
# include Dslable
|
6
|
+
# include Dslable::Display
|
7
|
+
#
|
8
|
+
# dslable_method :item, :key, '*arguments'
|
9
|
+
#
|
10
|
+
#
|
11
|
+
# def inspect
|
12
|
+
# attributes[:key]
|
13
|
+
# end
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# f = Foo.new
|
17
|
+
#
|
18
|
+
#
|
19
|
+
# f.draw do
|
20
|
+
# item 'Startseite', :baem => :bum do
|
21
|
+
# item 'terms'
|
22
|
+
# item 'imprint'
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# item 'Praemien' do
|
26
|
+
# item 'Kueche' do
|
27
|
+
# item 'Toepfe'
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# f.display :items
|
33
|
+
module Dslable
|
34
|
+
|
35
|
+
def self.included(base)
|
36
|
+
base.extend ClassMethods
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.extended(base)
|
40
|
+
class << base
|
41
|
+
self.extend ClassMethods
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module Display
|
46
|
+
module InstanceMethods
|
47
|
+
self.instance_eval do
|
48
|
+
self.class_eval <<-RUBY
|
49
|
+
|
50
|
+
def display(storage, level = 0, &block)
|
51
|
+
send(storage).each do |i|
|
52
|
+
if block
|
53
|
+
block.call i, level
|
54
|
+
else
|
55
|
+
puts '%s%s' % [' ' * level, i.inspect]
|
56
|
+
end
|
57
|
+
|
58
|
+
i.display storage, level + 1, &block if i.items.size > 0
|
59
|
+
end
|
60
|
+
|
61
|
+
return nil
|
62
|
+
end
|
63
|
+
RUBY
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
include InstanceMethods
|
68
|
+
end
|
69
|
+
|
70
|
+
module ClassMethods
|
71
|
+
def dslable_method(method, *args)
|
72
|
+
self.instance_eval do
|
73
|
+
|
74
|
+
stored_at = method.to_s + 's' # pluralize with ActiveSupport
|
75
|
+
|
76
|
+
# method_params: key, *arguments, options = {}
|
77
|
+
# method_values_set: i.name = name
|
78
|
+
# method_setters_getters: def key, def arguments, def options
|
79
|
+
|
80
|
+
method_params, method_values_set, method_accessors = [], [], []
|
81
|
+
|
82
|
+
args.each do |arg|
|
83
|
+
unless [String, Symbol, Hash].include? arg.class
|
84
|
+
raise ArgumentError, 'allowed arguments are Symbols, Strings and Hashes'
|
85
|
+
end
|
86
|
+
|
87
|
+
method_params << (arg.is_a?(Hash) ? arg.to_a : [arg]).flatten.join(' = ')
|
88
|
+
|
89
|
+
arg_name = (arg.is_a?(Hash) ? arg.keys.first : arg).to_s.gsub('*', '')
|
90
|
+
|
91
|
+
method_values_set << arg_name
|
92
|
+
method_accessors << arg_name
|
93
|
+
end
|
94
|
+
|
95
|
+
method_params = method_params.join(', ')
|
96
|
+
|
97
|
+
method_values_set = method_values_set.map do |p|
|
98
|
+
'i.%s = %s' % [p, p]
|
99
|
+
end.join(';')
|
100
|
+
|
101
|
+
method_accessors = method_accessors.map do |p|
|
102
|
+
"def #{p}; read_attribute(:#{p}); end;" + "def #{p}=(v); write_attribute(:#{p}, v); end;"
|
103
|
+
end.join
|
104
|
+
|
105
|
+
self.class_eval <<-RUBY
|
106
|
+
|
107
|
+
#{method_accessors}
|
108
|
+
|
109
|
+
def draw(code = nil, &block)
|
110
|
+
i = self.class.new
|
111
|
+
|
112
|
+
if code
|
113
|
+
i.instance_eval code
|
114
|
+
else
|
115
|
+
i.instance_eval &block
|
116
|
+
end
|
117
|
+
|
118
|
+
@#{stored_at} = i.#{stored_at}
|
119
|
+
return nil
|
120
|
+
end
|
121
|
+
|
122
|
+
def #{method.to_s}(#{method_params}, &block)
|
123
|
+
i = self.class.new
|
124
|
+
#{method_values_set}
|
125
|
+
|
126
|
+
i.instance_eval &block if block
|
127
|
+
|
128
|
+
self.#{stored_at} << i
|
129
|
+
end
|
130
|
+
|
131
|
+
def #{stored_at}
|
132
|
+
@#{stored_at} ||= []
|
133
|
+
end
|
134
|
+
|
135
|
+
def #{stored_at}=(v)
|
136
|
+
@#{stored_at} = v
|
137
|
+
end
|
138
|
+
|
139
|
+
def attributes
|
140
|
+
@attributes ||= {}
|
141
|
+
end
|
142
|
+
|
143
|
+
def attributes=(a)
|
144
|
+
@attributes = a
|
145
|
+
end
|
146
|
+
|
147
|
+
def read_attribute(n)
|
148
|
+
attributes[n]
|
149
|
+
end
|
150
|
+
|
151
|
+
def write_attribute(n, v)
|
152
|
+
attributes[n] = v
|
153
|
+
end
|
154
|
+
|
155
|
+
RUBY
|
156
|
+
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '/email/validators')
|
2
|
+
|
3
|
+
module Gadgeto
|
4
|
+
class Email
|
5
|
+
include Email::Validators
|
6
|
+
|
7
|
+
class << self
|
8
|
+
def valid?(object)
|
9
|
+
o = new object
|
10
|
+
o.valid?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(email)
|
15
|
+
@email = email
|
16
|
+
end
|
17
|
+
|
18
|
+
def valid?
|
19
|
+
email? @email
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Gadgeto
|
2
|
+
module SanitizeFilename
|
3
|
+
|
4
|
+
def sanitize_filename(filename)
|
5
|
+
return filename unless filename
|
6
|
+
|
7
|
+
filename.strip.tap do |fn|
|
8
|
+
# get only the filename
|
9
|
+
fn.gsub! /^.*(\\|\/)/, ''
|
10
|
+
|
11
|
+
fn.gsub! /[^A-Za-z0-9\.\-]/, '_'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
module Gadgeto
|
2
|
+
# A +TimeOfDay+ represents the time of day.
|
3
|
+
#
|
4
|
+
# Limitation: 24 hours only.
|
5
|
+
class TimeOfDay
|
6
|
+
|
7
|
+
class InvalidTimeOfDayFormat < ::Exception # :nodoc:
|
8
|
+
end
|
9
|
+
|
10
|
+
class TimeOfDayOutOfRange < ::Exception # :nodoc:
|
11
|
+
end
|
12
|
+
|
13
|
+
ONE_HOUR_IN_MINUTES = 60 # :nodoc:
|
14
|
+
HOURS_ONE_DAY = 24 # :nodoc:
|
15
|
+
|
16
|
+
attr_reader :hour, :minute
|
17
|
+
|
18
|
+
# Creates a new TimeOfDay object.
|
19
|
+
#
|
20
|
+
# TimeOfDay.new("08:00") #=> 08:00
|
21
|
+
# TimeOfDay.new("x8:00") #=> raises InvalidTimeOfDayFormat
|
22
|
+
#
|
23
|
+
def initialize(time_of_day)
|
24
|
+
match = /^([0-2]?\d):([0-5]\d)$/.match(time_of_day)
|
25
|
+
raise InvalidTimeOfDayFormat if match.nil?
|
26
|
+
@hour = match[1].to_i
|
27
|
+
@minute = match[2].to_i
|
28
|
+
raise InvalidTimeOfDayFormat if (@hour > HOURS_ONE_DAY) || (@hour == HOURS_ONE_DAY && @minute > 0)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Returns the hour component.
|
32
|
+
#
|
33
|
+
# t = TimeOfDay.new("08:00") #=> 08:00
|
34
|
+
# t.hour #=> 8
|
35
|
+
def hour
|
36
|
+
@hour
|
37
|
+
end
|
38
|
+
|
39
|
+
# Returns the hour component.
|
40
|
+
#
|
41
|
+
# t = TimeOfDay.new("08:03") #=> 08:00
|
42
|
+
# t.minute #=> 3
|
43
|
+
def minute
|
44
|
+
@minute
|
45
|
+
end
|
46
|
+
|
47
|
+
# Adds the given +minutes+ to +self+.
|
48
|
+
#
|
49
|
+
# t = TimeOfDay.new("08:00") #=> 08:00
|
50
|
+
# t.add_minutes(60) #=> 09:00
|
51
|
+
#
|
52
|
+
# t = TimeOfDay.new("23:50") #=> 08:00
|
53
|
+
# t.add_minutes(20) #=> 00:10
|
54
|
+
def add_minutes(minutes)
|
55
|
+
new_minutes = @minute + minutes
|
56
|
+
hours_to_add = (@minute + minutes) / 60
|
57
|
+
new_hour = @hour + hours_to_add
|
58
|
+
|
59
|
+
@hour = new_hour % HOURS_ONE_DAY
|
60
|
+
@minute = new_minutes % ONE_HOUR_IN_MINUTES
|
61
|
+
|
62
|
+
self
|
63
|
+
end
|
64
|
+
|
65
|
+
# Returns string representing time of day.
|
66
|
+
#
|
67
|
+
# TimeOfDay.new("08:00").to_s #=> "08:00"
|
68
|
+
def to_s
|
69
|
+
"#{hour.to_s.rjust(2, '0')}:#{minute.to_s.rjust(2, '0')}"
|
70
|
+
end
|
71
|
+
|
72
|
+
# Returns time of day in minutes.
|
73
|
+
#
|
74
|
+
# TimeOfDay.new("02:07") #=> 127
|
75
|
+
def to_i
|
76
|
+
hour * 60 + minute
|
77
|
+
end
|
78
|
+
|
79
|
+
# Returns +true+ if +self+ precedes +other+.
|
80
|
+
#
|
81
|
+
# TimeOfDay.new("08:00") < TimeOfDay.new("09:00:) #=> true
|
82
|
+
def <(other)
|
83
|
+
return true if self.hour < other.hour
|
84
|
+
return false if self.hour > other.hour
|
85
|
+
|
86
|
+
self.minute < other.minute
|
87
|
+
end
|
88
|
+
|
89
|
+
# Returns +true+ if +self+ follows +other+.
|
90
|
+
#
|
91
|
+
# TimeOfDay.new("09:00") < TimeOfDay.new("08:00:) #=> true
|
92
|
+
def >(other)
|
93
|
+
return true if self.hour > other.hour
|
94
|
+
return false if self.hour < other.hour
|
95
|
+
|
96
|
+
self.minute > other.minute
|
97
|
+
end
|
98
|
+
|
99
|
+
# Returns true if +self+ is equal to +other+.
|
100
|
+
#
|
101
|
+
# TimeOfDay.new("08:00") == TimeOfDay.new("08:00") #=> true
|
102
|
+
def ==(other)
|
103
|
+
self.hour == other.hour && self.minute == other.minute
|
104
|
+
end
|
105
|
+
|
106
|
+
# Returns difference in minutes between +self+ and +other+.
|
107
|
+
#
|
108
|
+
# TimeOfDay.new("08:00").minutes_till(TimeOfDay.new("09:00")) #=> 60
|
109
|
+
# TimeOfDay.new("23:00").minutes_till(TimeOfDay.new("01:00")) #=> 120
|
110
|
+
#
|
111
|
+
# TimeOfDay.new("23:00").minutes_till(TimeOfDay.new("01:00"), :overflow => false) #=> raises TimeOfDayOutOfRange
|
112
|
+
def minutes_till(other, options = {})
|
113
|
+
options[:overflow] = true if options[:overflow].nil?
|
114
|
+
|
115
|
+
if options[:overflow]
|
116
|
+
if self > other
|
117
|
+
(self.minutes_till(TimeOfDay.new("24:00"))) + other.to_i
|
118
|
+
else
|
119
|
+
other.to_i - self.to_i
|
120
|
+
end
|
121
|
+
else
|
122
|
+
raise TimeOfDayOutOfRange if self > other
|
123
|
+
other.to_i - self.to_i
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# Returns +true+ if +time_of_day+ represents time of day.
|
128
|
+
#
|
129
|
+
# TimeOfDay.valid?("08:00") #=> true
|
130
|
+
def self.valid?(time_of_day)
|
131
|
+
begin
|
132
|
+
val = TimeOfDay.new(time_of_day)
|
133
|
+
true
|
134
|
+
rescue InvalidTimeOfDayFormat, TimeOfDayOutOfRange
|
135
|
+
false
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
alias :inspect :to_s
|
140
|
+
|
141
|
+
end
|
142
|
+
end
|
data/lib/gadgeto.rb
ADDED
File without changes
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require File.join(File.dirname(__FILE__), '../../../lib/gadgeto/dslable')
|
3
|
+
|
4
|
+
class DslableDummy
|
5
|
+
include Gadgeto::Dslable
|
6
|
+
|
7
|
+
dslable_method :item, :key, "*args"
|
8
|
+
end
|
9
|
+
|
10
|
+
describe Gadgeto::Dslable do
|
11
|
+
|
12
|
+
it "should define a class method dslable_method if extended" do
|
13
|
+
o = Object.new
|
14
|
+
o.extend(Gadgeto::Dslable)
|
15
|
+
o_metaclass = class << o; self; end
|
16
|
+
|
17
|
+
o_metaclass.respond_to?(:dslable_method).should be_true
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should define a class method dslable_method if included" do
|
21
|
+
DslableDummy.respond_to?(:dslable_method).should be_true
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should define an instance method draw" do
|
25
|
+
o = DslableDummy.new
|
26
|
+
o.respond_to?(:draw).should be_true
|
27
|
+
end
|
28
|
+
|
29
|
+
context "" do
|
30
|
+
|
31
|
+
let (:o) {DslableDummy.new}
|
32
|
+
|
33
|
+
before(:each) do
|
34
|
+
o.draw do
|
35
|
+
item "item1" do
|
36
|
+
|
37
|
+
item "item1.1" do
|
38
|
+
item "item1.1.1", 3, "hello world"
|
39
|
+
item "item1.1.2"
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
item "item2"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it { o.items.size.should == 2 }
|
49
|
+
it { o.items[0].class.should == DslableDummy }
|
50
|
+
|
51
|
+
|
52
|
+
it { o.items[0].items[0].items[0].attributes[:args].size.should == 2 }
|
53
|
+
it { o.items[0].items[0].items[0].attributes[:args][1].should == "hello world" }
|
54
|
+
|
55
|
+
it { o.items[0].items[0].items[1].attributes[:key].should == "item1.1.2" }
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require File.join(File.dirname(__FILE__), '../../../lib/gadgeto/email')
|
3
|
+
|
4
|
+
describe Gadgeto::Email do
|
5
|
+
|
6
|
+
it { Gadgeto::Email.valid?("user@example.com").should be_true }
|
7
|
+
it { Gadgeto::Email.valid?("user+name@example.com").should be_true }
|
8
|
+
|
9
|
+
it { Gadgeto::Email.valid?("userexample.com").should be_false }
|
10
|
+
|
11
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require File.join(File.dirname(__FILE__), '../../../lib/gadgeto/sanitize_filename')
|
3
|
+
|
4
|
+
|
5
|
+
describe Gadgeto::SanitizeFilename do
|
6
|
+
|
7
|
+
class DummyClass
|
8
|
+
include Gadgeto::SanitizeFilename
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'filename' do
|
12
|
+
|
13
|
+
subject { DummyClass.new }
|
14
|
+
|
15
|
+
it { subject.sanitize_filename('/home/foo/bar').should == 'bar'}
|
16
|
+
it { subject.sanitize_filename('\\bar').should == 'bar'}
|
17
|
+
|
18
|
+
context "stripping" do
|
19
|
+
it { subject.sanitize_filename('foo bar').should == 'foo_bar'}
|
20
|
+
it { subject.sanitize_filename(' foobar ').should == 'foobar'}
|
21
|
+
end
|
22
|
+
|
23
|
+
context "remove special characters" do
|
24
|
+
it { subject.sanitize_filename(',bar').should == '_bar'}
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require File.join(File.dirname(__FILE__), '../../../lib/gadgeto/time_of_day')
|
3
|
+
|
4
|
+
describe Gadgeto::TimeOfDay do
|
5
|
+
|
6
|
+
describe "new" do
|
7
|
+
|
8
|
+
it "should require an argument" do
|
9
|
+
expect { Gadgeto::TimeOfDay.new }.to raise_exception
|
10
|
+
end
|
11
|
+
|
12
|
+
it { expect{ Gadgeto::TimeOfDay.new("0730") }.to raise_error(Gadgeto::TimeOfDay::InvalidTimeOfDayFormat) }
|
13
|
+
it { expect{ Gadgeto::TimeOfDay.new("a:30") }.to raise_error(Gadgeto::TimeOfDay::InvalidTimeOfDayFormat) }
|
14
|
+
it { expect{ Gadgeto::TimeOfDay.new("-1:30") }.to raise_error(Gadgeto::TimeOfDay::InvalidTimeOfDayFormat) }
|
15
|
+
it { expect{ Gadgeto::TimeOfDay.new("+1:30") }.to raise_error(Gadgeto::TimeOfDay::InvalidTimeOfDayFormat) }
|
16
|
+
it { expect{ Gadgeto::TimeOfDay.new("a1:30") }.to raise_error(Gadgeto::TimeOfDay::InvalidTimeOfDayFormat) }
|
17
|
+
it { expect{ Gadgeto::TimeOfDay.new("01:x") }.to raise_error(Gadgeto::TimeOfDay::InvalidTimeOfDayFormat) }
|
18
|
+
it { expect{ Gadgeto::TimeOfDay.new("01:3") }.to raise_error(Gadgeto::TimeOfDay::InvalidTimeOfDayFormat) }
|
19
|
+
it { expect{ Gadgeto::TimeOfDay.new("30:00") }.to raise_error(Gadgeto::TimeOfDay::InvalidTimeOfDayFormat) }
|
20
|
+
it { expect{ Gadgeto::TimeOfDay.new("01:70") }.to raise_error(Gadgeto::TimeOfDay::InvalidTimeOfDayFormat) }
|
21
|
+
it { expect{ Gadgeto::TimeOfDay.new("01:61") }.to raise_error(Gadgeto::TimeOfDay::InvalidTimeOfDayFormat) }
|
22
|
+
it { expect{ Gadgeto::TimeOfDay.new("25:00") }.to raise_error(Gadgeto::TimeOfDay::InvalidTimeOfDayFormat) }
|
23
|
+
it { expect{ Gadgeto::TimeOfDay.new("24:01") }.to raise_error(Gadgeto::TimeOfDay::InvalidTimeOfDayFormat) }
|
24
|
+
|
25
|
+
it { expect{ Gadgeto::TimeOfDay.new("24:00") }.not_to raise_error }
|
26
|
+
it { expect{ Gadgeto::TimeOfDay.new("08:13") }.not_to raise_error }
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
describe "to_s" do
|
31
|
+
it "should return string representation by default" do
|
32
|
+
Gadgeto::TimeOfDay.new("08:30").to_s.should == "08:30"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "to_i" do
|
37
|
+
context "should return time of day converted in minutes" do
|
38
|
+
it { Gadgeto::TimeOfDay.new("00:00").to_i.should == 0 }
|
39
|
+
it { Gadgeto::TimeOfDay.new("08:00").to_i.should == (8 * 60) }
|
40
|
+
it { Gadgeto::TimeOfDay.new("08:13").to_i.should == (8 * 60 + 13) }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "hour" do
|
45
|
+
it { Gadgeto::TimeOfDay.new("08:30").hour.should == 8 }
|
46
|
+
it { Gadgeto::TimeOfDay.new("8:30").hour.should == 8 }
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "minute" do
|
50
|
+
it { Gadgeto::TimeOfDay.new("08:37").minute.should == 37 }
|
51
|
+
it { Gadgeto::TimeOfDay.new("08:07").minute.should == 7 }
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "add_minutes" do
|
55
|
+
it { Gadgeto::TimeOfDay.new("08:30").add_minutes(7).to_s.should == "08:37" }
|
56
|
+
it { Gadgeto::TimeOfDay.new("08:59").add_minutes(1).to_s.should == "09:00" }
|
57
|
+
it { Gadgeto::TimeOfDay.new("08:00").add_minutes(135).to_s.should == "10:15" }
|
58
|
+
|
59
|
+
it { Gadgeto::TimeOfDay.new("23:59").add_minutes(1).to_s.should == "00:00" }
|
60
|
+
it { Gadgeto::TimeOfDay.new("23:59").add_minutes(2).to_s.should == "00:01" }
|
61
|
+
it { Gadgeto::TimeOfDay.new("23:59").add_minutes(120).to_s.should == "01:59" }
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "self.valid?" do
|
66
|
+
it { expect { Gadgeto::TimeOfDay.valid? }.to raise_error }
|
67
|
+
it { Gadgeto::TimeOfDay.valid?("08:07").should be_true }
|
68
|
+
it { Gadgeto::TimeOfDay.valid?("08:70").should be_false }
|
69
|
+
it { Gadgeto::TimeOfDay.valid?("x8:30").should be_false }
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "operator <" do
|
73
|
+
it { (Gadgeto::TimeOfDay.new("08:00") < Gadgeto::TimeOfDay.new("08:01")).should be_true }
|
74
|
+
it { (Gadgeto::TimeOfDay.new("08:01") < Gadgeto::TimeOfDay.new("08:00")).should be_false }
|
75
|
+
it { (Gadgeto::TimeOfDay.new("08:00") < Gadgeto::TimeOfDay.new("08:00")).should be_false }
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "operator >" do
|
79
|
+
it { (Gadgeto::TimeOfDay.new("08:01") > Gadgeto::TimeOfDay.new("08:00")).should be_true }
|
80
|
+
it { (Gadgeto::TimeOfDay.new("08:00") > Gadgeto::TimeOfDay.new("08:01")).should be_false }
|
81
|
+
it { (Gadgeto::TimeOfDay.new("08:11") > Gadgeto::TimeOfDay.new("08:11")).should be_false }
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "operator ==" do
|
85
|
+
it { (Gadgeto::TimeOfDay.new("08:13") == Gadgeto::TimeOfDay.new("08:13")).should be_true }
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "till" do
|
89
|
+
|
90
|
+
it { Gadgeto::TimeOfDay.new("00:00").minutes_till(Gadgeto::TimeOfDay.new("00:00")).should == 0 }
|
91
|
+
it { Gadgeto::TimeOfDay.new("00:00").minutes_till(Gadgeto::TimeOfDay.new("00:13")).should == 13 }
|
92
|
+
it { Gadgeto::TimeOfDay.new("08:15").minutes_till(Gadgeto::TimeOfDay.new("10:00")).should == 105 }
|
93
|
+
|
94
|
+
context "allow overflow" do
|
95
|
+
it { Gadgeto::TimeOfDay.new("23:00").minutes_till(Gadgeto::TimeOfDay.new("01:00")).should == 120 }
|
96
|
+
end
|
97
|
+
|
98
|
+
context "do not allow overflow" do
|
99
|
+
it { expect { Gadgeto::TimeOfDay.new("23:00").minutes_till(Gadgeto::TimeOfDay.new("01:00"), :overflow => false)}.to raise_error }
|
100
|
+
it { Gadgeto::TimeOfDay.new("23:00").minutes_till(Gadgeto::TimeOfDay.new("23:15"), :overflow => false).should == 15 }
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/test/helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'test/unit'
|
11
|
+
require 'shoulda'
|
12
|
+
|
13
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
14
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
15
|
+
require 'gadgeto'
|
16
|
+
|
17
|
+
class Test::Unit::TestCase
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gadgeto
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Robert Gogolok
|
9
|
+
- Matthias Zirnstein
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2012-01-06 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: jeweler
|
17
|
+
requirement: &70348239824400 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.6.4
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *70348239824400
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rake
|
28
|
+
requirement: &70348239823560 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *70348239823560
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: simplecov
|
39
|
+
requirement: &70348239822400 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
type: :development
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *70348239822400
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: rspec
|
50
|
+
requirement: &70348239821180 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *70348239821180
|
59
|
+
description: collection of useful code snippets
|
60
|
+
email: rgogolok@avarteq.de
|
61
|
+
executables: []
|
62
|
+
extensions: []
|
63
|
+
extra_rdoc_files:
|
64
|
+
- LICENSE.txt
|
65
|
+
- README.rdoc
|
66
|
+
files:
|
67
|
+
- .travis.yml
|
68
|
+
- Gemfile
|
69
|
+
- LICENSE.txt
|
70
|
+
- README.rdoc
|
71
|
+
- Rakefile
|
72
|
+
- VERSION
|
73
|
+
- gadgeto.gemspec
|
74
|
+
- lib/gadgeto.rb
|
75
|
+
- lib/gadgeto/dslable.rb
|
76
|
+
- lib/gadgeto/email.rb
|
77
|
+
- lib/gadgeto/email/validators.rb
|
78
|
+
- lib/gadgeto/sanitize_filename.rb
|
79
|
+
- lib/gadgeto/time_of_day.rb
|
80
|
+
- spec/lib/gadgeto/dslable_spec.rb
|
81
|
+
- spec/lib/gadgeto/email_spec.rb
|
82
|
+
- spec/lib/gadgeto/sanitize_filename_spec.rb
|
83
|
+
- spec/lib/gadgeto/time_of_day_spec.rb
|
84
|
+
- spec/spec_helper.rb
|
85
|
+
- test/helper.rb
|
86
|
+
- test/test_gadgeto.rb
|
87
|
+
homepage: http://github.com/avarteqgmbh/gadgeto
|
88
|
+
licenses:
|
89
|
+
- MIT
|
90
|
+
post_install_message:
|
91
|
+
rdoc_options: []
|
92
|
+
require_paths:
|
93
|
+
- lib
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ! '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
segments:
|
101
|
+
- 0
|
102
|
+
hash: 1775889944675506510
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
requirements: []
|
110
|
+
rubyforge_project:
|
111
|
+
rubygems_version: 1.8.10
|
112
|
+
signing_key:
|
113
|
+
specification_version: 3
|
114
|
+
summary: collection of useful code snippets
|
115
|
+
test_files: []
|