From 7b47edff14fc6c542aa8d4567c395886caa1dc1d Mon Sep 17 00:00:00 2001 From: Joe Bivins Date: Sun, 4 Mar 2012 13:34:27 -0500 Subject: [PATCH] Move date parsing to a helper. --- .../javascripts/app/helpers/date_formatter.js | 35 +++++++++++++++++++ public/javascripts/app/models/photo.js | 4 +-- public/javascripts/app/models/post.js | 26 +------------- .../app/helpers/date_formatter_spec.js | 33 +++++++++++++++++ spec/javascripts/app/views/post_view_spec.js | 8 ----- 5 files changed, 71 insertions(+), 35 deletions(-) create mode 100644 public/javascripts/app/helpers/date_formatter.js create mode 100644 spec/javascripts/app/helpers/date_formatter_spec.js diff --git a/public/javascripts/app/helpers/date_formatter.js b/public/javascripts/app/helpers/date_formatter.js new file mode 100644 index 000000000..dbcb005b6 --- /dev/null +++ b/public/javascripts/app/helpers/date_formatter.js @@ -0,0 +1,35 @@ +(function(){ + var dateFormatter = function dateFormatter() { + + }; + + dateFormatter.parse = function(date_string) { + var timestamp = new Date(date_string).getTime(); + + if (isNaN(timestamp)) { + timestamp = dateFormatter.parseISO8601UTC(date_string); + } + + return timestamp; + }, + + dateFormatter.parseISO8601UTC = function(date_string) { + var iso8601_utc_pattern = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(.(\d{3}))?Z$/; + var time_components = date_string.match(iso8601_utc_pattern); + var timestamp = 0; + + if (time_components != null) { + if (time_components[8] == undefined) { + time_components[8] = 0; + } + + timestamp = Date.UTC(time_components[1], time_components[2] - 1, time_components[3], + time_components[4], time_components[5], time_components[6], + time_components[8]); + } + + return timestamp; + }, + + app.helpers.dateFormatter = dateFormatter; +})(); diff --git a/public/javascripts/app/models/photo.js b/public/javascripts/app/models/photo.js index 05b4a3c1e..cefbb0e1d 100644 --- a/public/javascripts/app/models/photo.js +++ b/public/javascripts/app/models/photo.js @@ -8,7 +8,7 @@ app.models.Photo = Backbone.Model.extend({ }, timeOf: function(field) { - return new Date(this.get(field)) /1000; + return app.helpers.dateFormatter.parse(this.get(field)) / 1000; }, -}); \ No newline at end of file +}); diff --git a/public/javascripts/app/models/post.js b/public/javascripts/app/models/post.js index df3abb01e..a5beb5ecd 100644 --- a/public/javascripts/app/models/post.js +++ b/public/javascripts/app/models/post.js @@ -21,31 +21,7 @@ app.models.Post = Backbone.Model.extend({ }, timeOf: function(field) { - var timestamp = new Date(this.get(field)) /1000; - - if (isNaN(timestamp)) { - timestamp = this.legacyTimeOf(field); - } - - return timestamp; - }, - - legacyTimeOf: function(field) { - var iso8601_utc_pattern = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(.(\d{3}))?Z$/; - var time_components = this.get(field).match(iso8601_utc_pattern); - var timestamp = 0; - - if (time_components != null) { - if (time_components[8] == undefined) { - time_components[8] = 0; - } - - timestamp = Date.UTC(time_components[1], time_components[2] - 1, time_components[3], - time_components[4], time_components[5], time_components[6], - time_components[8]); - } - - return timestamp /1000; + return app.helpers.dateFormatter.parse(this.get(field)) / 1000; }, createReshareUrl : "/reshares", diff --git a/spec/javascripts/app/helpers/date_formatter_spec.js b/spec/javascripts/app/helpers/date_formatter_spec.js new file mode 100644 index 000000000..9d317a108 --- /dev/null +++ b/spec/javascripts/app/helpers/date_formatter_spec.js @@ -0,0 +1,33 @@ +describe("app.helpers.dateFormatter", function(){ + + beforeEach(function(){ + this.statusMessage = factory.post(); + this.formatter = app.helpers.dateFormatter; + }) + + describe("parse", function(){ + context("modern web browsers", function(){ + it ("supports ISO 8601 UTC dates", function(){ + var timestamp = new Date(this.statusMessage.get("created_at")).getTime(); + expect(this.formatter.parse(this.statusMessage.get("created_at"))).toEqual(timestamp); + }) + }) + + context("legacy web browsers", function(){ + it("supports ISO 8601 UTC dates", function(){ + var timestamp = new Date(this.statusMessage.get("created_at")).getTime(); + + expect(this.formatter.parseISO8601UTC(this.statusMessage.get("created_at"))).toEqual(timestamp); + }) + }) + + context("status messages", function(){ + it("uses ISO 8601 UTC dates", function(){ + var iso8601_utc_pattern = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(.(\d{3}))?Z$/; + + expect(iso8601_utc_pattern.test(this.statusMessage.get("created_at"))).toBe(true); + }) + }) + }) + +}) diff --git a/spec/javascripts/app/views/post_view_spec.js b/spec/javascripts/app/views/post_view_spec.js index 17080155a..9eb66d9a2 100644 --- a/spec/javascripts/app/views/post_view_spec.js +++ b/spec/javascripts/app/views/post_view_spec.js @@ -119,13 +119,5 @@ describe("app.views.Post", function(){ }) }) - context("legacy browsers", function(){ - it("supports iso8501 utc timestamps", function(){ - var timestamp = new Date(this.statusMessage.get("created_at")) /1000; - - expect(this.statusMessage.legacyTimeOf("created_at")).toEqual(timestamp); - }) - }) - }) });