mongoid_time_field 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 675c1a0fb1ddddd399518a3984b3575f5203186e
4
+ data.tar.gz: 254095769b5f2c6cb8b67889d2e9e7aea3211c05
5
+ SHA512:
6
+ metadata.gz: 54b63521baaccff3b95eb6d7075d6ae58e0e342ea95c87d710a380a439c8adfa7af5983e1ce7fd15279bbb9692afc1a6b0fa0b2eef05f001984251541d0c4182
7
+ data.tar.gz: 93944c906019a1a619b3cc77fd35f592112f7b9645d0b46da9c1402d563e84c5c72da52b84eb41e865db67335f5d6277a9cf43962c018c8d12149e1bbf6205c0
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ time_field
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.0.0-p195
data/Gemfile CHANGED
@@ -1,12 +1,4 @@
1
- source "http://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
- gem 'mongoid'
4
-
5
- group :development do
6
- gem "rspec", "~> 2.8.0"
7
- gem "rdoc", "~> 3.12"
8
- gem "bundler", "~> 1.0.0"
9
- gem "jeweler", "~> 1.8.3"
10
- gem "simplecov", '>= 0.4.0', :require => false
11
- gem "database_cleaner"
12
- end
3
+ # Specify your gem's dependencies in mongoid_time_field.gemspec
4
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,56 +1,52 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ mongoid_time_field (0.2.1)
5
+ mongoid (>= 3.0.0)
6
+
1
7
  GEM
2
- remote: http://rubygems.org/
8
+ remote: https://rubygems.org/
3
9
  specs:
4
- activemodel (3.2.2)
5
- activesupport (= 3.2.2)
10
+ activemodel (3.2.13)
11
+ activesupport (= 3.2.13)
6
12
  builder (~> 3.0.0)
7
- activesupport (3.2.2)
8
- i18n (~> 0.6)
13
+ activesupport (3.2.13)
14
+ i18n (= 0.6.1)
9
15
  multi_json (~> 1.0)
10
- bson (1.6.1)
11
- builder (3.0.0)
12
- database_cleaner (0.7.1)
13
- diff-lcs (1.1.3)
14
- git (1.2.5)
15
- i18n (0.6.0)
16
- jeweler (1.8.3)
17
- bundler (~> 1.0)
18
- git (>= 1.2.5)
19
- rake
20
- rdoc
21
- json (1.6.5)
22
- mongo (1.6.1)
23
- bson (~> 1.6.1)
24
- mongoid (2.4.6)
25
- activemodel (~> 3.1)
26
- mongo (~> 1.3)
16
+ builder (3.0.4)
17
+ database_cleaner (1.0.1)
18
+ diff-lcs (1.2.4)
19
+ i18n (0.6.1)
20
+ mongoid (3.1.4)
21
+ activemodel (~> 3.2)
22
+ moped (~> 1.4)
23
+ origin (~> 1.0)
27
24
  tzinfo (~> 0.3.22)
28
- multi_json (1.1.0)
29
- rake (0.9.2.2)
30
- rdoc (3.12)
31
- json (~> 1.4)
32
- rspec (2.8.0)
33
- rspec-core (~> 2.8.0)
34
- rspec-expectations (~> 2.8.0)
35
- rspec-mocks (~> 2.8.0)
36
- rspec-core (2.8.0)
37
- rspec-expectations (2.8.0)
38
- diff-lcs (~> 1.1.2)
39
- rspec-mocks (2.8.0)
40
- simplecov (0.6.1)
25
+ moped (1.5.0)
26
+ multi_json (1.7.6)
27
+ origin (1.1.0)
28
+ rake (10.0.4)
29
+ rspec (2.13.0)
30
+ rspec-core (~> 2.13.0)
31
+ rspec-expectations (~> 2.13.0)
32
+ rspec-mocks (~> 2.13.0)
33
+ rspec-core (2.13.1)
34
+ rspec-expectations (2.13.0)
35
+ diff-lcs (>= 1.1.3, < 2.0)
36
+ rspec-mocks (2.13.1)
37
+ simplecov (0.7.1)
41
38
  multi_json (~> 1.0)
42
- simplecov-html (~> 0.5.3)
43
- simplecov-html (0.5.3)
44
- tzinfo (0.3.32)
39
+ simplecov-html (~> 0.7.1)
40
+ simplecov-html (0.7.1)
41
+ tzinfo (0.3.37)
45
42
 
46
43
  PLATFORMS
47
44
  ruby
48
45
 
49
46
  DEPENDENCIES
50
- bundler (~> 1.0.0)
47
+ bundler
51
48
  database_cleaner
52
- jeweler (~> 1.8.3)
53
- mongoid
54
- rdoc (~> 3.12)
55
- rspec (~> 2.8.0)
56
- simplecov (>= 0.4.0)
49
+ mongoid_time_field!
50
+ rake
51
+ rspec
52
+ simplecov
data/LICENSE.txt CHANGED
@@ -1,4 +1,6 @@
1
- Copyright (c) 2012 glebtv
1
+ Copyright (c) 2013 glebtv
2
+
3
+ MIT License
2
4
 
3
5
  Permission is hereby granted, free of charge, to any person obtaining
4
6
  a copy of this software and associated documentation files (the
data/README.rdoc CHANGED
@@ -7,21 +7,18 @@ Simple gem to store minutes+seconds or hours+minutes in one integer field in mon
7
7
  Include the gem in your Gemfile
8
8
 
9
9
  gem 'mongoid_time_field'
10
-
10
+
11
11
  == Usage
12
12
 
13
13
  class DummyTime
14
14
  include Mongoid::Document
15
- include Mongoid::TimeField
16
-
17
- field :description
18
-
19
- time_field :open, :close
20
15
 
16
+ field :worktime, type: TimeField.new(format: 'HH:MM')
17
+ field :time_of_day, type: TimeField.new(format: 'HH:MM:SS')
18
+ field :duration, type: TimeField.new(format: 'mm:SS')
21
19
  end
22
-
23
- All time values are converted and stored in mongodb as seconds.
24
20
 
21
+ All time values are converted and stored in mongodb as seconds.
25
22
 
26
23
  == Contributing to mongoid_time_field
27
24
 
@@ -35,6 +32,5 @@ All time values are converted and stored in mongodb as seconds.
35
32
 
36
33
  == Copyright
37
34
 
38
- Copyright (c) 2012 glebtv. See LICENSE.txt for
39
- further details.
35
+ Copyright (c) 2012-2013 glebtv. See LICENSE.txt for further details.
40
36
 
data/Rakefile CHANGED
@@ -1,49 +1 @@
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 'jeweler'
15
- Jeweler::Tasks.new do |gem|
16
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
- gem.name = "mongoid_time_field"
18
- gem.homepage = "http://github.com/glebtv/mongoid_time_field"
19
- gem.license = "MIT"
20
- gem.summary = %Q{hh:mm or mm:ss time field for mongoid}
21
- gem.description = %Q{hh:mm or mm:ss time field for mongoid}
22
- gem.email = "glebtv@gmail.com"
23
- gem.authors = ["glebtv"]
24
- # dependencies defined in Gemfile
25
- end
26
- Jeweler::RubygemsDotOrgTasks.new
27
-
28
- require 'rspec/core'
29
- require 'rspec/core/rake_task'
30
- RSpec::Core::RakeTask.new(:spec) do |spec|
31
- spec.pattern = FileList['spec/**/*_spec.rb']
32
- end
33
-
34
- RSpec::Core::RakeTask.new(:rcov) do |spec|
35
- spec.pattern = 'spec/**/*_spec.rb'
36
- spec.rcov = true
37
- end
38
-
39
- task :default => :spec
40
-
41
- require 'rdoc/task'
42
- Rake::RDocTask.new do |rdoc|
43
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
44
-
45
- rdoc.rdoc_dir = 'rdoc'
46
- rdoc.title = "mongoid_time_field #{version}"
47
- rdoc.rdoc_files.include('README*')
48
- rdoc.rdoc_files.include('lib/**/*.rb')
49
- end
1
+ require "bundler/gem_tasks"
@@ -1,57 +1,10 @@
1
+ require "mongoid_time_field/version"
2
+ require "mongoid_time_field/time_field"
3
+
1
4
  module Mongoid
2
5
  module TimeField
3
6
  extend ActiveSupport::Concern
4
- module ClassMethods
5
- def time_field(*columns)
6
- [columns].flatten.each do |name|
7
- attr = name.to_sym
8
- name_minutes = (name.to_s + '_minutes').to_sym
9
-
10
- field attr, type: Integer
11
-
12
- define_method(name) do
13
- minutes = read_attribute(attr)
14
- if minutes.nil?
15
- nil
16
- else
17
- hours = (minutes / 60).to_i
18
- sprintf("%d:%02d", hours, (minutes - 60 * hours))
19
- end
20
- end
21
-
22
- define_method("#{name}=") do |value|
23
- if value.blank?
24
- write_attribute(attr, nil)
25
- nil
26
- else
27
- hours, minutes = value.split(/:/)
28
- val = minutes.to_i + (hours.to_i * 60)
29
- write_attribute(attr, val)
30
- value
31
- end
32
- end
33
-
34
- define_method(name_minutes) do
35
- minutes = read_attribute(attr)
36
- if minutes.nil?
37
- nil
38
- else
39
- minutes
40
- end
41
- end
42
-
43
- define_method("#{name_minutes}=") do |value|
44
- if value.blank?
45
- write_attribute(attr, nil)
46
- nil
47
- else
48
- write_attribute(attr, value.to_i)
49
- value.to_i
50
- end
51
- end
52
-
53
- end
54
- end
55
- end
7
+ autoload :ClassMethods, 'mongoid_time_field/class_methods'
8
+ autoload :Value, 'mongoid_time_field/value'
56
9
  end
57
10
  end
@@ -0,0 +1,24 @@
1
+ module Mongoid::TimeField
2
+ module ClassMethods
3
+ # @deprecated
4
+ def time_field(*columns)
5
+ [columns].flatten.each do |name|
6
+ attr = name.to_sym
7
+ name_minutes = (name.to_s + '_minutes').to_sym
8
+
9
+ field attr, type: TimeField.new(format: 'mm:SS')
10
+
11
+ # we treat minutes as seconds for compatibility with v0.1.0
12
+ # TODO: Remove this later
13
+ define_method(name_minutes) do
14
+ v = send(attr)
15
+ v.nil? ? nil : v.seconds
16
+ end
17
+
18
+ define_method("#{name_minutes}=") do |value|
19
+ send(name.to_s + '=', Mongoid::TimeField::Value.new(value))
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,68 @@
1
+ class TimeField
2
+ def initialize(options = {})
3
+ @options = options
4
+
5
+ @options[:format] = 'mm:SS' unless options[:format]
6
+ @options[:regexp] = build_regexp(options[:format]) unless options[:regexp]
7
+ end
8
+
9
+ def build_regexp(format)
10
+ s = '^' + Regexp.escape(format) + '$'
11
+ s.gsub!(':', ':?')
12
+ s.gsub!('-', '-?')
13
+ s.gsub!('_', '_?')
14
+
15
+ s.gsub!('HH', '(?<h>\d*?)')
16
+ s.gsub!('hh', '(?<h>\d*?)')
17
+ s.gsub!('MM', '(?<m>\d*)')
18
+ s.gsub!('mm', '(?<m>\d*)')
19
+ s.gsub!('SS', '(?<s>\d*)')
20
+ Regexp.new(s)
21
+ end
22
+
23
+ def parse(value)
24
+ if value.blank?
25
+ nil
26
+ else
27
+ match = @options[:regexp].match(value)
28
+ seconds = 0
29
+ names = match.names
30
+
31
+ seconds += match['s'].to_i if names.include?('s')
32
+ seconds += match['m'].to_i * 60 if names.include?('m')
33
+ seconds += match['h'].to_i * 3600 if names.include?('h')
34
+
35
+ Mongoid::TimeField::Value.new(seconds, @options)
36
+ end
37
+ end
38
+
39
+ # Get the object as it was stored in the database, and instantiate
40
+ # this custom class from it.
41
+ def demongoize(object)
42
+ if object.nil?
43
+ nil
44
+ else
45
+ Mongoid::TimeField::Value.new(object, @options)
46
+ end
47
+ end
48
+
49
+ # Takes any possible object and converts it to how it would be
50
+ # stored in the database.
51
+ def mongoize(object)
52
+ case object
53
+ when Mongoid::TimeField::Value then object.mongoize
54
+ when String then parse(object).mongoize
55
+ else object
56
+ end
57
+ end
58
+
59
+ # Converts the object that was supplied to a criteria and converts it
60
+ # into a database friendly form.
61
+ def evolve(object)
62
+ case object
63
+ when String then parse(object).mongoize
64
+ when Mongoid::TimeField::Value then object.mongoize
65
+ else object
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,77 @@
1
+ module Mongoid::TimeField
2
+ class Value
3
+ attr_accessor :seconds
4
+
5
+ def initialize(seconds, options = {})
6
+ if seconds.blank?
7
+ @seconds = nil
8
+ else
9
+ @seconds = seconds
10
+ end
11
+
12
+ @options = options
13
+ end
14
+
15
+ def to_s
16
+ # @seconds.nil? ? nil : Time.at(@seconds).utc.strftime(@options[:strftime])
17
+
18
+ if @seconds.nil?
19
+ nil
20
+ else
21
+ format = @options[:format]
22
+
23
+ fm, ss = @seconds.divmod(60)
24
+ hh, mm = fm.divmod(60)
25
+
26
+ if format.match(/hh/i).nil?
27
+ replaces = {
28
+ 'mm' => fm,
29
+ 'MM' => fm.to_s.rjust(2, '0'),
30
+ 'SS' => ss.to_s.rjust(2, '0'),
31
+ }
32
+ format.gsub(/(mm|MM|SS)/) do |match|
33
+ replaces[match]
34
+ end
35
+ else
36
+ replaces = {
37
+ 'hh' => hh,
38
+ 'HH' => hh.to_s.rjust(2, '0'),
39
+ 'mm' => mm,
40
+ 'MM' => mm.to_s.rjust(2, '0'),
41
+ 'SS' => ss.to_s.rjust(2, '0'),
42
+ }
43
+ format.gsub(/(hh|HH|mm|MM|SS)/) do |match|
44
+ replaces[match]
45
+ end
46
+ end
47
+ end
48
+ end
49
+ alias_method :to_str, :to_s
50
+
51
+ def minutes
52
+ @seconds / 60
53
+ end
54
+
55
+ def mongoize
56
+ @seconds
57
+ end
58
+
59
+ def inspect
60
+ '"' + to_s + '"'
61
+ end
62
+
63
+ def coerce(something)
64
+ [self, something]
65
+ end
66
+
67
+ def ==(something)
68
+ if seconds === something
69
+ true
70
+ elsif to_s === something
71
+ true
72
+ else
73
+ false
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,3 @@
1
+ module MongoidTimeField
2
+ VERSION = "0.2.1"
3
+ end
@@ -1,71 +1,28 @@
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 -*-
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mongoid_time_field/version'
5
5
 
6
- Gem::Specification.new do |s|
7
- s.name = "mongoid_time_field"
8
- s.version = "0.1.0"
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "mongoid_time_field"
8
+ spec.version = MongoidTimeField::VERSION
9
+ spec.authors = ["glebtv"]
10
+ spec.email = ["glebtv@gmail.com"]
11
+ spec.description = %q{Time field (stored as integer with no date) for Mongoid}
12
+ spec.summary = %q{Time field for Mongoid}
13
+ spec.homepage = "http://github.com/glebtv/mongoid_time_field"
14
+ spec.license = "MIT"
9
15
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["glebtv"]
12
- s.date = "2012-03-18"
13
- s.description = "hh:mm or mm:ss time field for mongoid"
14
- s.email = "glebtv@gmail.com"
15
- s.extra_rdoc_files = [
16
- "LICENSE.txt",
17
- "README.rdoc"
18
- ]
19
- s.files = [
20
- ".document",
21
- ".rspec",
22
- ".rvmrc",
23
- "Gemfile",
24
- "Gemfile.lock",
25
- "LICENSE.txt",
26
- "README.rdoc",
27
- "Rakefile",
28
- "VERSION",
29
- "lib/mongoid_time_field.rb",
30
- "mongoid_time_field.gemspec",
31
- "spec/spec_helper.rb",
32
- "spec/support/dummy_time.rb",
33
- "spec/time_spec.rb"
34
- ]
35
- s.homepage = "http://github.com/glebtv/mongoid_time_field"
36
- s.licenses = ["MIT"]
37
- s.require_paths = ["lib"]
38
- s.rubygems_version = "1.8.15"
39
- s.summary = "hh:mm or mm:ss time field for mongoid"
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
40
20
 
41
- if s.respond_to? :specification_version then
42
- s.specification_version = 3
21
+ spec.add_runtime_dependency 'mongoid', [">= 3.0.0"]
43
22
 
44
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
45
- s.add_runtime_dependency(%q<mongoid>, [">= 0"])
46
- s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
47
- s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
48
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
49
- s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
50
- s.add_development_dependency(%q<simplecov>, [">= 0.4.0"])
51
- s.add_development_dependency(%q<database_cleaner>, [">= 0"])
52
- else
53
- s.add_dependency(%q<mongoid>, [">= 0"])
54
- s.add_dependency(%q<rspec>, ["~> 2.8.0"])
55
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
56
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
57
- s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
58
- s.add_dependency(%q<simplecov>, [">= 0.4.0"])
59
- s.add_dependency(%q<database_cleaner>, [">= 0"])
60
- end
61
- else
62
- s.add_dependency(%q<mongoid>, [">= 0"])
63
- s.add_dependency(%q<rspec>, ["~> 2.8.0"])
64
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
65
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
66
- s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
67
- s.add_dependency(%q<simplecov>, [">= 0.4.0"])
68
- s.add_dependency(%q<database_cleaner>, [">= 0"])
69
- end
23
+ spec.add_development_dependency "bundler"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency 'rspec'
26
+ spec.add_development_dependency 'simplecov'
27
+ spec.add_development_dependency 'database_cleaner'
70
28
  end
71
-
data/spec/spec_helper.rb CHANGED
@@ -14,10 +14,10 @@ require 'mongoid_time_field'
14
14
  # in ./support/ and its subdirectories.
15
15
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
16
16
 
17
-
18
-
19
- Mongoid.config.master = Mongo::Connection.new.db("mongoid_time_field_test")
20
- Mongoid.logger = Logger.new($stdout)
17
+ Mongoid.configure do |config|
18
+ ENV["MONGOID_ENV"] = "test"
19
+ Mongoid.load!("spec/support/mongoid.yml")
20
+ end
21
21
 
22
22
  DatabaseCleaner.orm = "mongoid"
23
23
 
@@ -0,0 +1,7 @@
1
+ class DummyDuration
2
+ include Mongoid::Document
3
+
4
+ field :description
5
+
6
+ field :duration, type: TimeField.new(format: 'MM:SS')
7
+ end
@@ -1,9 +1,8 @@
1
1
  class DummyTime
2
2
  include Mongoid::Document
3
3
  include Mongoid::TimeField
4
-
4
+
5
5
  field :description
6
-
7
- time_field :open, :close
8
6
 
7
+ time_field :open, :close
9
8
  end
@@ -0,0 +1,12 @@
1
+ class DummyV2
2
+ include Mongoid::Document
3
+
4
+ field :description
5
+
6
+ field :open, type: TimeField.new(format: "hh:MM")
7
+ field :close, type: TimeField.new(format: 'hh:MM')
8
+
9
+ field :worktime, type: TimeField.new(format: 'HH:MM')
10
+ field :time_of_day, type: TimeField.new(format: 'HH:MM:SS')
11
+ field :duration, type: TimeField.new(format: 'mm:SS')
12
+ end
@@ -0,0 +1,8 @@
1
+ test:
2
+ sessions:
3
+ default:
4
+ database: mongoid_time_field
5
+ hosts:
6
+ - localhost:27017
7
+ options:
8
+ consistency: :strong
@@ -1,22 +1,24 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mongoid::TimeField do
4
-
4
+
5
5
  describe 'when persisting a document with a TimeField datatype' do
6
-
6
+
7
7
  it 'should be persisted normally' do
8
8
  dummy = DummyTime.new
9
9
  dummy.open = '10:00'
10
10
  dummy.save.should eq true
11
11
  end
12
-
12
+
13
13
  it 'should fix bad time values' do
14
14
  dummy = DummyTime.new
15
15
  dummy.open = '10:61'
16
16
  dummy.save.should eq true
17
+
18
+ dummy = DummyTime.first
17
19
  dummy.open.should eq '11:01'
18
20
  end
19
-
21
+
20
22
  it 'should handle blank values set as time' do
21
23
  dummy = DummyTime.new
22
24
  dummy.open = ''
@@ -32,19 +34,19 @@ describe Mongoid::TimeField do
32
34
  dummy.open.should be_nil
33
35
  dummy.open_minutes.should be_nil
34
36
  end
35
-
37
+
36
38
  end
37
-
39
+
38
40
  describe 'when accessing a document from the datastore with a TimeField datatype' do
39
41
  before(:each) do
40
42
  DummyTime.create(:description => "Test", :open => '12:34')
41
43
  end
42
-
44
+
43
45
  it 'should have a time field value that matches the TimeField value that was initially persisted' do
44
46
  dummy = DummyTime.first
45
47
  dummy.open.should eq '12:34'
46
48
  end
47
-
49
+
48
50
  it 'should have a minutes field value equal to what was initially persisted as time' do
49
51
  dummy = DummyTime.first
50
52
  dummy.open_minutes.should eq 754
@@ -55,24 +57,24 @@ describe Mongoid::TimeField do
55
57
  before(:each) do
56
58
  DummyTime.create(:description => "Test", :open_minutes => 754)
57
59
  end
58
-
60
+
59
61
  it 'should have a time field value that matches the TimeField value that was initially persisted' do
60
62
  dummy = DummyTime.first
61
63
  dummy.open.should eq '12:34'
62
64
  end
63
-
65
+
64
66
  it 'should have a minutes field value equal to what was initially persisted as time' do
65
67
  dummy = DummyTime.first
66
68
  dummy.open_minutes.should eq 754
67
69
  end
68
70
  end
69
71
 
70
-
72
+
71
73
  describe 'when accessing a document from the datastore with a TimeField datatype and empty value' do
72
74
  before(:each) do
73
75
  DummyTime.create(:description => "Test")
74
76
  end
75
-
77
+
76
78
  it 'should have a TimeField value of 0' do
77
79
  dummy = DummyTime.first
78
80
  dummy.open.should be_nil
@@ -83,7 +85,7 @@ describe Mongoid::TimeField do
83
85
  before(:each) do
84
86
  DummyTime.create(description: "Test", open: '1:23', close: '2:33')
85
87
  end
86
-
88
+
87
89
  it 'should have correct TimeField value for field 1' do
88
90
  dummy = DummyTime.first
89
91
  dummy.open.should eq '1:23'
data/spec/v2_spec.rb ADDED
@@ -0,0 +1,175 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongoid::TimeField do
4
+ describe 'compatibility with v0.1.0' do
5
+ it 'should store minutes as seconds' do
6
+ dummy = DummyTime.new
7
+ dummy.open = '10:00'
8
+ dummy.save.should eq true
9
+ dummy.open_minutes.should eq 600
10
+
11
+ dummy = DummyTime.first
12
+ dummy.read_attribute(:open).should eq 600
13
+ dummy.open_minutes.should eq 600
14
+ end
15
+ end
16
+
17
+ describe 'datatype' do
18
+
19
+ it 'is persisted normally' do
20
+ dummy = DummyV2.new
21
+ dummy.open = '10:00'
22
+ dummy.save.should eq true
23
+ end
24
+
25
+ it 'allows querying' do
26
+ DummyV2.create!(open: '10:00')
27
+ second = DummyV2.create!(open: '10:05')
28
+ last = DummyV2.create!(open: '11:00')
29
+ DummyV2.where(open: {'$gt' => 10 * 3600 + 5 * 60 }).count.should eq 1
30
+ DummyV2.where(open: {'$gt' => '10:05'}).count.should eq 1
31
+ DummyV2.where(open: '10:05').first.id.should eq second.id
32
+ DummyV2.where(open: '11:00').first.id.should eq last.id
33
+ DummyV2.where(open: last.open).first.id.should eq last.id
34
+ end
35
+
36
+ it 'has proper inspect' do
37
+ dummy = DummyV2.new
38
+ dummy.open = '10:00'
39
+ dummy.open.inspect.should eq '"10:00"'
40
+ end
41
+
42
+ it 'allows setting seconds' do
43
+ dummy = DummyV2.new
44
+ dummy.open = 20 * 60
45
+ dummy.open.should eq '0:20'
46
+ end
47
+
48
+ it 'has proper comparsion and coercion for strings and integers' do
49
+ dummy = DummyV2.new
50
+ dummy.open = '10:00'
51
+ (dummy.open == '10:00').should be_true
52
+ (dummy.open == (10*60*60)).should be_true
53
+ (dummy.open == (10*60*60 + 1)).should be_false
54
+ ('10:00' == dummy.open).should be_true
55
+ ((10*60*60) == dummy.open).should be_true
56
+ ((10*60*60 + 1) == dummy.open).should be_false
57
+ end
58
+
59
+ it 'fixes bad time values' do
60
+ dummy = DummyV2.new
61
+ dummy.open = '10:61'
62
+ dummy.save.should eq true
63
+ dummy.open.should eq '11:01'
64
+ end
65
+
66
+ it 'handles blank values set as time' do
67
+ dummy = DummyV2.new
68
+ dummy.open = ''
69
+ dummy.save.should eq true
70
+ dummy.open.should be_nil
71
+ end
72
+ end
73
+
74
+ describe 'loading from DB' do
75
+ before(:each) do
76
+ DummyV2.create(:description => "Test", :open => '12:34')
77
+ end
78
+
79
+ it 'has same value' do
80
+ dummy = DummyV2.first
81
+ dummy.open.should eq '12:34'
82
+ end
83
+
84
+ it 'has proper minutes and seconds' do
85
+ dummy = DummyV2.first
86
+ dummy.open.minutes.should eq 754
87
+ dummy.open.seconds.should eq (754*60)
88
+ end
89
+ end
90
+
91
+ describe 'empty value' do
92
+ before(:each) do
93
+ DummyV2.create(:description => "Test")
94
+ end
95
+
96
+ it 'should have a TimeField value of 0' do
97
+ dummy = DummyV2.first
98
+ dummy.open.should be_nil
99
+ end
100
+ end
101
+
102
+ describe 'multiple' do
103
+ before(:each) do
104
+ DummyV2.create(description: "Test", open: '1:23', close: '2:33')
105
+ end
106
+
107
+ it 'should have correct TimeField value for field 1' do
108
+ dummy = DummyV2.first
109
+ dummy.open.should eq '1:23'
110
+ end
111
+ it 'should have correct TimeField value for field 2' do
112
+ dummy = DummyV2.first
113
+ dummy.close.should eq '2:33'
114
+ end
115
+ end
116
+
117
+ describe 'formats' do
118
+ it 'works with HH:MM' do
119
+ dummy = DummyV2.new
120
+ dummy.worktime = '1:00'
121
+ dummy.save.should eq true
122
+ dummy.worktime.should eq '01:00'
123
+ end
124
+
125
+ it 'works with HH:MM:SS' do
126
+ dummy = DummyV2.new
127
+ dummy.time_of_day = '1:00'
128
+ dummy.save.should eq true
129
+ dummy.time_of_day.should eq '00:01:00'
130
+ dummy.time_of_day.seconds.should eq 60
131
+ dummy.time_of_day.minutes.should eq 1
132
+ end
133
+
134
+ it 'works with mm:SS' do
135
+ dummy = DummyV2.new
136
+ dummy.duration = '1:00'
137
+ dummy.save.should eq true
138
+ dummy.duration.should eq '1:00'
139
+ dummy.duration.seconds.should eq 60
140
+ dummy.duration.minutes.should eq 1
141
+ end
142
+
143
+ it 'mm:SS handles more minutes' do
144
+ dummy = DummyV2.new
145
+ dummy.duration = '120:00'
146
+ dummy.save.should eq true
147
+ dummy.duration.should eq '120:00'
148
+ dummy.duration.seconds.should eq (120 * 60)
149
+ dummy.duration.minutes.should eq 120
150
+ end
151
+
152
+ it 'HH:MM handles more hours' do
153
+ dummy = DummyV2.new
154
+ dummy.worktime = '121:00'
155
+ dummy.save.should eq true
156
+ dummy.worktime.should eq '121:00'
157
+ end
158
+
159
+ it 'HH:MM:SS handles more hours' do
160
+ dummy = DummyV2.new
161
+ dummy.time_of_day = '120:00:00'
162
+ dummy.save.should eq true
163
+ dummy.time_of_day.should eq '120:00:00'
164
+ dummy.time_of_day.minutes.should eq (120 * 60)
165
+ end
166
+
167
+ it 'HH:MM:SS normalizes' do
168
+ dummy = DummyV2.new
169
+ dummy.time_of_day = '1:70:00'
170
+ dummy.save.should eq true
171
+ dummy.time_of_day.should eq '02:10:00'
172
+ dummy.time_of_day.minutes.should eq (130)
173
+ end
174
+ end
175
+ end
metadata CHANGED
@@ -1,141 +1,157 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid_time_field
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- prerelease:
4
+ version: 0.2.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - glebtv
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-03-18 00:00:00.000000000 Z
11
+ date: 2013-06-07 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: mongoid
16
- requirement: &75414110 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
- version: '0'
19
+ version: 3.0.0
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *75414110
25
- - !ruby/object:Gem::Dependency
26
- name: rspec
27
- requirement: &75429980 !ruby/object:Gem::Requirement
28
- none: false
22
+ version_requirements: !ruby/object:Gem::Requirement
29
23
  requirements:
30
- - - ~>
24
+ - - '>='
31
25
  - !ruby/object:Gem::Version
32
- version: 2.8.0
33
- type: :development
34
- prerelease: false
35
- version_requirements: *75429980
26
+ version: 3.0.0
36
27
  - !ruby/object:Gem::Dependency
37
- name: rdoc
38
- requirement: &75429360 !ruby/object:Gem::Requirement
39
- none: false
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
40
30
  requirements:
41
- - - ~>
31
+ - - '>='
42
32
  - !ruby/object:Gem::Version
43
- version: '3.12'
33
+ version: '0'
44
34
  type: :development
45
35
  prerelease: false
46
- version_requirements: *75429360
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
47
41
  - !ruby/object:Gem::Dependency
48
- name: bundler
49
- requirement: &75428920 !ruby/object:Gem::Requirement
50
- none: false
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
51
44
  requirements:
52
- - - ~>
45
+ - - '>='
53
46
  - !ruby/object:Gem::Version
54
- version: 1.0.0
47
+ version: '0'
55
48
  type: :development
56
49
  prerelease: false
57
- version_requirements: *75428920
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
58
55
  - !ruby/object:Gem::Dependency
59
- name: jeweler
60
- requirement: &75428470 !ruby/object:Gem::Requirement
61
- none: false
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
62
58
  requirements:
63
- - - ~>
59
+ - - '>='
64
60
  - !ruby/object:Gem::Version
65
- version: 1.8.3
61
+ version: '0'
66
62
  type: :development
67
63
  prerelease: false
68
- version_requirements: *75428470
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
- requirement: &75427890 !ruby/object:Gem::Requirement
72
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
73
72
  requirements:
74
- - - ! '>='
73
+ - - '>='
75
74
  - !ruby/object:Gem::Version
76
- version: 0.4.0
75
+ version: '0'
77
76
  type: :development
78
77
  prerelease: false
79
- version_requirements: *75427890
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
80
83
  - !ruby/object:Gem::Dependency
81
84
  name: database_cleaner
82
- requirement: &75427470 !ruby/object:Gem::Requirement
83
- none: false
85
+ requirement: !ruby/object:Gem::Requirement
84
86
  requirements:
85
- - - ! '>='
87
+ - - '>='
86
88
  - !ruby/object:Gem::Version
87
89
  version: '0'
88
90
  type: :development
89
91
  prerelease: false
90
- version_requirements: *75427470
91
- description: hh:mm or mm:ss time field for mongoid
92
- email: glebtv@gmail.com
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Time field (stored as integer with no date) for Mongoid
98
+ email:
99
+ - glebtv@gmail.com
93
100
  executables: []
94
101
  extensions: []
95
- extra_rdoc_files:
96
- - LICENSE.txt
97
- - README.rdoc
102
+ extra_rdoc_files: []
98
103
  files:
99
- - .document
104
+ - .gitignore
100
105
  - .rspec
101
- - .rvmrc
106
+ - .ruby-gemset
107
+ - .ruby-version
102
108
  - Gemfile
103
109
  - Gemfile.lock
104
110
  - LICENSE.txt
105
111
  - README.rdoc
106
112
  - Rakefile
107
- - VERSION
108
113
  - lib/mongoid_time_field.rb
114
+ - lib/mongoid_time_field/class_methods.rb
115
+ - lib/mongoid_time_field/time_field.rb
116
+ - lib/mongoid_time_field/value.rb
117
+ - lib/mongoid_time_field/version.rb
109
118
  - mongoid_time_field.gemspec
110
119
  - spec/spec_helper.rb
120
+ - spec/support/dummy_duration.rb
111
121
  - spec/support/dummy_time.rb
112
- - spec/time_spec.rb
122
+ - spec/support/dummy_v2.rb
123
+ - spec/support/mongoid.yml
124
+ - spec/v1_spec.rb
125
+ - spec/v2_spec.rb
113
126
  homepage: http://github.com/glebtv/mongoid_time_field
114
127
  licenses:
115
128
  - MIT
129
+ metadata: {}
116
130
  post_install_message:
117
131
  rdoc_options: []
118
132
  require_paths:
119
133
  - lib
120
134
  required_ruby_version: !ruby/object:Gem::Requirement
121
- none: false
122
135
  requirements:
123
- - - ! '>='
136
+ - - '>='
124
137
  - !ruby/object:Gem::Version
125
138
  version: '0'
126
- segments:
127
- - 0
128
- hash: -523699249
129
139
  required_rubygems_version: !ruby/object:Gem::Requirement
130
- none: false
131
140
  requirements:
132
- - - ! '>='
141
+ - - '>='
133
142
  - !ruby/object:Gem::Version
134
143
  version: '0'
135
144
  requirements: []
136
145
  rubyforge_project:
137
- rubygems_version: 1.8.15
146
+ rubygems_version: 2.0.3
138
147
  signing_key:
139
- specification_version: 3
140
- summary: hh:mm or mm:ss time field for mongoid
141
- test_files: []
148
+ specification_version: 4
149
+ summary: Time field for Mongoid
150
+ test_files:
151
+ - spec/spec_helper.rb
152
+ - spec/support/dummy_duration.rb
153
+ - spec/support/dummy_time.rb
154
+ - spec/support/dummy_v2.rb
155
+ - spec/support/mongoid.yml
156
+ - spec/v1_spec.rb
157
+ - spec/v2_spec.rb
data/.document DELETED
@@ -1,5 +0,0 @@
1
- lib/**/*.rb
2
- bin/*
3
- -
4
- features/**/*.feature
5
- LICENSE.txt
data/.rvmrc DELETED
@@ -1 +0,0 @@
1
- rvm use ruby-1.9.3-p125@timefield --create
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.1.0