commit code
This commit is contained in:
parent
2973ba261d
commit
b9ce23aba9
|
@ -0,0 +1,5 @@
|
|||
module tulpa.dev/Xe/jsonfeed
|
||||
|
||||
go 1.14
|
||||
|
||||
require github.com/stretchr/testify v1.6.1
|
|
@ -0,0 +1,10 @@
|
|||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
@ -0,0 +1,73 @@
|
|||
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
// file, You can obtain one at http://mozilla.org/MPL/2.0/
|
||||
|
||||
package jsonfeed
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"io"
|
||||
"time"
|
||||
)
|
||||
|
||||
const CurrentVersion = "https://jsonfeed.org/version/1"
|
||||
|
||||
type Item struct {
|
||||
ID string `json:"id"`
|
||||
URL string `json:"url"`
|
||||
ExternalURL string `json:"external_url"`
|
||||
Title string `json:"title"`
|
||||
ContentHTML string `json:"content_html"`
|
||||
ContentText string `json:"content_text"`
|
||||
Summary string `json:"summary"`
|
||||
Image string `json:"image"`
|
||||
BannerImage string `json:"banner_image"`
|
||||
DatePublished time.Time `json:"date_published"`
|
||||
DateModified time.Time `json:"date_modified"`
|
||||
Author Author `json:"author"`
|
||||
Tags []string `json:"tags"`
|
||||
}
|
||||
|
||||
type Author struct {
|
||||
Name string `json:"name"`
|
||||
URL string `json:"url"`
|
||||
Avatar string `json:"avatar"`
|
||||
}
|
||||
|
||||
type Hub struct {
|
||||
Type string `json:"type"`
|
||||
URL string `json:"url"`
|
||||
}
|
||||
|
||||
type Attachment struct {
|
||||
URL string `json:"url"`
|
||||
MIMEType string `json:"mime_type"`
|
||||
Title string `json:"title"`
|
||||
SizeInBytes int64 `json:"size_in_bytes"`
|
||||
DurationInSeconds int64 `json:"duration_in_seconds"`
|
||||
}
|
||||
|
||||
type Feed struct {
|
||||
Version string `json:"version"`
|
||||
Title string `json:"title"`
|
||||
HomePageURL string `json:"home_page_url"`
|
||||
FeedURL string `json:"feed_url"`
|
||||
Description string `json:"description"`
|
||||
UserComment string `json:"user_comment"`
|
||||
NextURL string `json:"next_url"`
|
||||
Icon string `json:"icon"`
|
||||
Favicon string `json:"favicon"`
|
||||
Author Author `json:"author"`
|
||||
Expired bool `json:"expired"`
|
||||
Hubs []Hub `json:"hubs"`
|
||||
Items []Item `json:"items"`
|
||||
}
|
||||
|
||||
func Parse(r io.Reader) (Feed, error) {
|
||||
var feed Feed
|
||||
decoder := json.NewDecoder(r)
|
||||
if err := decoder.Decode(&feed); err != nil {
|
||||
return Feed{}, err
|
||||
}
|
||||
return feed, nil
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
// file, You can obtain one at http://mozilla.org/MPL/2.0/
|
||||
|
||||
package jsonfeed
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestParseSimple(t *testing.T) {
|
||||
r, err := os.Open("testdata/feed.json")
|
||||
assert.NoError(t, err, "Could not open testdata/feed.json")
|
||||
|
||||
feed, err := Parse(r)
|
||||
assert.NoError(t, err, "Could not parse testdata/feed.json")
|
||||
|
||||
assert.Equal(t, "https://jsonfeed.org/version/1", feed.Version)
|
||||
assert.Equal(t, "JSON Feed", feed.Title)
|
||||
assert.Equal(t, "JSON Feed is a ...", feed.Description)
|
||||
assert.Equal(t, "https://jsonfeed.org/", feed.HomePageURL)
|
||||
assert.Equal(t, "https://jsonfeed.org/feed.json", feed.FeedURL)
|
||||
assert.Equal(t, "This feed allows ...", feed.UserComment)
|
||||
assert.Equal(t, "https://jsonfeed.org/graphics/icon.png", feed.Favicon)
|
||||
assert.Equal(t, "Brent Simmons and Manton Reece", feed.Author.Name)
|
||||
|
||||
assert.Equal(t, 1, len(feed.Items))
|
||||
|
||||
assert.Equal(t, "https://jsonfeed.org/2017/05/17/announcing_json_feed", feed.Items[0].ID)
|
||||
assert.Equal(t, "https://jsonfeed.org/2017/05/17/announcing_json_feed", feed.Items[0].URL)
|
||||
assert.Equal(t, "Announcing JSON Feed", feed.Items[0].Title)
|
||||
assert.Equal(t, "<p>We ...", feed.Items[0].ContentHTML)
|
||||
|
||||
datePublished, err := time.Parse("2006-01-02T15:04:05-07:00", "2017-05-17T08:02:12-07:00")
|
||||
assert.NoError(t, err, "Could not parse timestamp")
|
||||
|
||||
assert.Equal(t, datePublished, feed.Items[0].DatePublished)
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"version": "https://jsonfeed.org/version/1",
|
||||
"title": "JSON Feed",
|
||||
"description": "JSON Feed is a ...",
|
||||
"home_page_url": "https://jsonfeed.org/",
|
||||
"feed_url": "https://jsonfeed.org/feed.json",
|
||||
"user_comment": "This feed allows ...",
|
||||
"favicon": "https://jsonfeed.org/graphics/icon.png",
|
||||
"author": {
|
||||
"name": "Brent Simmons and Manton Reece"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"id": "https://jsonfeed.org/2017/05/17/announcing_json_feed",
|
||||
"url": "https://jsonfeed.org/2017/05/17/announcing_json_feed",
|
||||
"title": "Announcing JSON Feed",
|
||||
"content_html": "<p>We ...",
|
||||
"date_published": "2017-05-17T08:02:12-07:00"
|
||||
}
|
||||
]
|
||||
}
|
Loading…
Reference in New Issue