Merge pull request #35 from noahcampbell/master - hugo - [fork] hugo port for 9front
 (HTM) git clone git@git.drkhsh.at/hugo.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit ec1a3a8db90cc0d7c08dae28f3426a287bcc0b77
 (DIR) parent 17aafb39ddd04a443994b3cb605970070b274377
 (HTM) Author: Steve Francia <steve.francia@gmail.com>
       Date:   Mon, 12 Aug 2013 14:43:56 -0700
       
       Merge pull request #35 from noahcampbell/master
       
       Address the time parsing issue.
       Diffstat:
         M .travis.yml                         |       6 +++---
         M hugolib/helpers.go                  |      33 +++++++++++++++++++++++--------
         A hugolib/page_time_integration_test… |     127 +++++++++++++++++++++++++++++++
       
       3 files changed, 155 insertions(+), 11 deletions(-)
       ---
 (DIR) diff --git a/.travis.yml b/.travis.yml
       @@ -1,3 +1,3 @@
       -language: go
       -go:
       -  - 1.1
       +language: go
       +go:
       +  - 1.1
 (DIR) diff --git a/hugolib/helpers.go b/hugolib/helpers.go
       @@ -15,6 +15,7 @@ package hugolib
        
        import (
                "bytes"
       +        "errors"
                "fmt"
                "github.com/kr/pretty"
                "html/template"
       @@ -63,18 +64,34 @@ func Error(str string, a ...interface{}) {
        
        func interfaceToStringToDate(i interface{}) time.Time {
                s := interfaceToString(i)
       -        d, e := time.Parse("02 Jan 06 15:04 MST", s)
        
       -        if e != nil {
       -                d, e = time.Parse("2006-01-02", s)
       +        if d, e := parseDateWith(s, []string{
       +                time.RFC3339,
       +                time.RFC1123Z,
       +                time.RFC1123,
       +                time.RFC822Z,
       +                time.RFC822,
       +                time.ANSIC,
       +                time.UnixDate,
       +                time.RubyDate,
       +                "2006-01-02 15:04:05Z07:00",
       +                "02 Jan 06 15:04 MST",
       +                "2006-01-02",
       +                "02 Jan 2006",
       +        }); e == nil {
       +                return d
                }
        
       -        if e != nil {
       -                d, e = time.Parse("02 Jan 06", s)
       -        }
       -
       -        return d
       +        return time.Unix(0, 0)
       +}
        
       +func parseDateWith(s string, dates []string) (d time.Time, e error) {
       +        for _, dateType := range dates {
       +                if d, e = time.Parse(dateType, s); e == nil {
       +                        return
       +                }
       +        }
       +        return d, errors.New(fmt.Sprintf("Unable to parse date: %s", s))
        }
        
        func interfaceToBool(i interface{}) bool {
 (DIR) diff --git a/hugolib/page_time_integration_test.go b/hugolib/page_time_integration_test.go
       @@ -0,0 +1,127 @@
       +package hugolib
       +
       +import (
       +        "fmt"
       +        "os"
       +        "strings"
       +        "testing"
       +        "time"
       +)
       +
       +var PAGE_WITH_INVALID_DATE = `---
       +date: 2010-05-02_15:29:31+08:00
       +---
       +Page With Invalid Date (replace T with _ for RFC 3339)`
       +
       +var PAGE_WITH_DATE_RFC3339 = `---
       +date: 2010-05-02T15:29:31+08:00
       +---
       +Page With Date RFC3339`
       +
       +var PAGE_WITH_DATE_RFC3339_NO_T = `---
       +date: 2010-05-02 15:29:31+08:00
       +---
       +Page With Date RFC3339_NO_T`
       +
       +var PAGE_WITH_DATE_RFC1123 = `---
       +date: Sun, 02 May 2010 15:29:31 PST
       +---
       +Page With Date RFC1123`
       +
       +var PAGE_WITH_DATE_RFC1123Z = `---
       +date: Sun, 02 May 2010 15:29:31 +0800
       +---
       +Page With Date RFC1123Z`
       +
       +var PAGE_WITH_DATE_RFC822 = `---
       +date: 02 May 10 15:29 PST
       +---
       +Page With Date RFC822`
       +
       +var PAGE_WITH_DATE_RFC822Z = `---
       +date: 02 May 10 15:29 +0800
       +---
       +Page With Date RFC822Z`
       +
       +var PAGE_WITH_DATE_ANSIC = `---
       +date: Sun May 2 15:29:31 2010
       +---
       +Page With Date ANSIC`
       +
       +var PAGE_WITH_DATE_UnixDate = `---
       +date: Sun May 2 15:29:31 PST 2010
       +---
       +Page With Date UnixDate`
       +
       +var PAGE_WITH_DATE_RubyDate = `---
       +date: Sun May 02 15:29:31 +0800 2010
       +---
       +Page With Date RubyDate`
       +
       +var PAGE_WITH_DATE_HugoYearNumeric = `---
       +date: 2010-05-02
       +---
       +Page With Date HugoYearNumeric`
       +
       +var PAGE_WITH_DATE_HugoYear = `---
       +date: 02 May 2010
       +---
       +Page With Date HugoYear`
       +
       +var PAGE_WITH_DATE_HugoLong = `---
       +date: 02 May 2010 15:29 PST
       +---
       +Page With Date HugoLong`
       +
       +func TestDegenerateDateFrontMatter(t *testing.T) {
       +        p, _ := ReadFrom(strings.NewReader(PAGE_WITH_INVALID_DATE), "page/with/invalid/date")
       +        if p.Date != time.Unix(0, 0) {
       +                t.Fatalf("Date should be set to computer epoch.  Got: %s", p.Date)
       +        }
       +}
       +
       +func TestParsingDateInFrontMatter(t *testing.T) {
       +        tests := []struct {
       +                buf string
       +                dt  string
       +        }{
       +                {PAGE_WITH_DATE_RFC3339, "2010-05-02T15:29:31+08:00"},
       +                {PAGE_WITH_DATE_RFC3339_NO_T, "2010-05-02T15:29:31+08:00"},
       +                {PAGE_WITH_DATE_RFC1123Z, "2010-05-02T15:29:31+08:00"},
       +                {PAGE_WITH_DATE_RFC822Z, "2010-05-02T15:29:00+08:00"},
       +                {PAGE_WITH_DATE_ANSIC, "2010-05-02T15:29:31Z"},
       +                {PAGE_WITH_DATE_RubyDate, "2010-05-02T15:29:31+08:00"},
       +                {PAGE_WITH_DATE_HugoYearNumeric, "2010-05-02T00:00:00Z"},
       +                {PAGE_WITH_DATE_HugoYear, "2010-05-02T00:00:00Z"},
       +        }
       +
       +        tzShortCodeTests := []struct {
       +                buf string
       +                dt  string
       +        }{
       +                {PAGE_WITH_DATE_RFC1123, "2010-05-02T15:29:31-08:00"},
       +                {PAGE_WITH_DATE_RFC822, "2010-05-02T15:29:00-08:00Z"},
       +                {PAGE_WITH_DATE_UnixDate, "2010-05-02T15:29:31-08:00"},
       +                {PAGE_WITH_DATE_HugoLong, "2010-05-02T15:21:00+08:00"},
       +        }
       +
       +        if _, err := time.LoadLocation("PST"); err == nil {
       +                tests = append(tests, tzShortCodeTests...)
       +        } else {
       +                fmt.Fprintf(os.Stderr, "Skipping shortname timezone tests.\n")
       +        }
       +
       +        for _, test := range tests {
       +                dt, e := time.Parse(time.RFC3339, test.dt)
       +                if e != nil {
       +                        t.Fatalf("Unable to parse date time (RFC3339) for running the test: %s", e)
       +                }
       +                p, err := ReadFrom(strings.NewReader(test.buf), "page/with/date")
       +                if err != nil {
       +                        t.Fatalf("Expected to be able to parse page.")
       +                }
       +                if !dt.Equal(p.Date) {
       +                        t.Errorf("Date does not equal frontmatter:\n%s\nExpecting: %s\n      Got: %s. Diff: %s\n internal: %#v\n           %#v", test.buf, dt, p.Date, dt.Sub(p.Date), dt, p.Date)
       +                }
       +        }
       +}