Fixing time parsing issue for times without zone

This commit is contained in:
Sam Lown 2010-08-18 19:36:01 +02:00
parent 626f997ff1
commit dad386d8c9
7 changed files with 30 additions and 10 deletions

View file

@ -1,5 +1,4 @@
--colour --colour
--format --format
progress progress
--loadby
mtime mtime

View file

@ -31,6 +31,7 @@ begin
gemspec.add_dependency("activesupport", ">= 2.3.5") gemspec.add_dependency("activesupport", ">= 2.3.5")
gemspec.add_dependency("activemodel", ">= 3.0.0.beta4") gemspec.add_dependency("activemodel", ">= 3.0.0.beta4")
gemspec.add_dependency("tzinfo", ">= 0.3.22") gemspec.add_dependency("tzinfo", ">= 0.3.22")
gemspec.add_development_dependency('rspec', '>= 2.0.0.beta.19')
gemspec.version = CouchRest::Model::VERSION gemspec.version = CouchRest::Model::VERSION
gemspec.date = Time.now.strftime("%Y-%m-%d") gemspec.date = Time.now.strftime("%Y-%m-%d")
gemspec.require_path = "lib" gemspec.require_path = "lib"

View file

@ -9,7 +9,7 @@ Gem::Specification.new do |s|
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
s.authors = ["J. Chris Anderson", "Matt Aimonetti", "Marcos Tapajos", "Will Leinweber", "Sam Lown"] s.authors = ["J. Chris Anderson", "Matt Aimonetti", "Marcos Tapajos", "Will Leinweber", "Sam Lown"]
s.date = %q{2010-08-11} s.date = %q{2010-08-18}
s.description = %q{CouchRest Model provides aditional features to the standard CouchRest Document class such as properties, view designs, associations, callbacks, typecasting and validations.} s.description = %q{CouchRest Model provides aditional features to the standard CouchRest Document class such as properties, view designs, associations, callbacks, typecasting and validations.}
s.email = %q{jchris@apache.org} s.email = %q{jchris@apache.org}
s.extra_rdoc_files = [ s.extra_rdoc_files = [
@ -133,12 +133,14 @@ Gem::Specification.new do |s|
s.add_runtime_dependency(%q<activesupport>, [">= 2.3.5"]) s.add_runtime_dependency(%q<activesupport>, [">= 2.3.5"])
s.add_runtime_dependency(%q<activemodel>, [">= 3.0.0.beta4"]) s.add_runtime_dependency(%q<activemodel>, [">= 3.0.0.beta4"])
s.add_runtime_dependency(%q<tzinfo>, [">= 0.3.22"]) s.add_runtime_dependency(%q<tzinfo>, [">= 0.3.22"])
s.add_development_dependency(%q<rspec>, [">= 2.0.0.beta.19"])
else else
s.add_dependency(%q<couchrest>, [">= 1.0.0"]) s.add_dependency(%q<couchrest>, [">= 1.0.0"])
s.add_dependency(%q<mime-types>, [">= 1.15"]) s.add_dependency(%q<mime-types>, [">= 1.15"])
s.add_dependency(%q<activesupport>, [">= 2.3.5"]) s.add_dependency(%q<activesupport>, [">= 2.3.5"])
s.add_dependency(%q<activemodel>, [">= 3.0.0.beta4"]) s.add_dependency(%q<activemodel>, [">= 3.0.0.beta4"])
s.add_dependency(%q<tzinfo>, [">= 0.3.22"]) s.add_dependency(%q<tzinfo>, [">= 0.3.22"])
s.add_dependency(%q<rspec>, [">= 2.0.0.beta.19"])
end end
else else
s.add_dependency(%q<couchrest>, [">= 1.0.0"]) s.add_dependency(%q<couchrest>, [">= 1.0.0"])
@ -146,6 +148,7 @@ Gem::Specification.new do |s|
s.add_dependency(%q<activesupport>, [">= 2.3.5"]) s.add_dependency(%q<activesupport>, [">= 2.3.5"])
s.add_dependency(%q<activemodel>, [">= 3.0.0.beta4"]) s.add_dependency(%q<activemodel>, [">= 3.0.0.beta4"])
s.add_dependency(%q<tzinfo>, [">= 0.3.22"]) s.add_dependency(%q<tzinfo>, [">= 0.3.22"])
s.add_dependency(%q<rspec>, [">= 2.0.0.beta.19"])
end end
end end

View file

@ -5,6 +5,8 @@
* Minor enhancements * Minor enhancements
* Raise error on adding objects to "collection_of" without an id * Raise error on adding objects to "collection_of" without an id
* Allow mixing of protected and accessible properties. Any unspecified properties are now assumed to be protected by default * Allow mixing of protected and accessible properties. Any unspecified properties are now assumed to be protected by default
* Parsing times without zone
* Using latest rspec (2.0.0.beta.19)
== CouchRest Model 1.0.0.beta7 == CouchRest Model 1.0.0.beta7

View file

@ -1,19 +1,23 @@
class Time class Time
# returns a local time value much faster than Time.parse # returns a local time value much faster than Time.parse
def self.mktime_with_offset(string) def self.mktime_with_offset(string)
string =~ /(\d{4})[\-|\/](\d{2})[\-|\/](\d{2})[T|\s](\d{2}):(\d{2}):(\d{2})([\+|\s|\-])*(\d{2}):?(\d{2})/ string =~ /(\d{4})[\-|\/](\d{2})[\-|\/](\d{2})[T|\s](\d{2}):(\d{2}):(\d{2})(([\+|\s|\-])*(\d{2}):?(\d{2}))?/
# $1 = year # $1 = year
# $2 = month # $2 = month
# $3 = day # $3 = day
# $4 = hours # $4 = hours
# $5 = minutes # $5 = minutes
# $6 = seconds # $6 = seconds
# $7 = time zone direction # $8 = time zone direction
# $8 = tz difference # $9 = tz difference
# utc time with wrong TZ info: # utc time with wrong TZ info:
time = mktime($1, RFC2822_MONTH_NAME[$2.to_i - 1], $3, $4, $5, $6, $7) time = mktime($1, RFC2822_MONTH_NAME[$2.to_i - 1], $3, $4, $5, $6)
tz_difference = ("#{$7 == '-' ? '+' : '-'}#{$8}".to_i * 3600) if ($7)
tz_difference = ("#{$8 == '-' ? '+' : '-'}#{$9}".to_i * 3600)
time + tz_difference + zone_offset(time.zone) time + tz_difference + zone_offset(time.zone)
else
time
end
end end
end end
@ -128,6 +132,7 @@ module CouchRest
rescue ArgumentError rescue ArgumentError
value value
rescue TypeError rescue TypeError
# After failures, resort to normal time parse
value value
end end

View file

@ -571,6 +571,16 @@ describe "Model properties" do
@course['ends_at'].min.should eql(t.min) @course['ends_at'].min.should eql(t.min)
@course['ends_at'].sec.should eql(t.sec) @course['ends_at'].sec.should eql(t.sec)
end end
it 'parses the string without offset' do
t = Time.now
@course.ends_at = t.strftime("%Y-%m-%d %H:%M:%S")
@course['ends_at'].year.should eql(t.year)
@course['ends_at'].month.should eql(t.month)
@course['ends_at'].day.should eql(t.day)
@course['ends_at'].hour.should eql(t.hour)
@course['ends_at'].min.should eql(t.min)
@course['ends_at'].sec.should eql(t.sec)
end
end end
it 'does not typecast non-time values' do it 'does not typecast non-time values' do

View file

@ -1,5 +1,5 @@
require "rubygems" require "rubygems"
require "spec" # Satisfies Autotest and anyone else not using the Rake tasks require "rspec" # Satisfies Autotest and anyone else not using the Rake tasks
require File.join(File.dirname(__FILE__), '..','lib','couchrest_model') require File.join(File.dirname(__FILE__), '..','lib','couchrest_model')
# check the following file to see how to use the spec'd features. # check the following file to see how to use the spec'd features.
@ -24,7 +24,7 @@ def reset_test_db!
DB DB
end end
Spec::Runner.configure do |config| RSpec.configure do |config|
config.before(:all) { reset_test_db! } config.before(:all) { reset_test_db! }
config.after(:all) do config.after(:all) do