Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding Atom feed #59

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion app/controllers/api/v1/places_controller.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
class Api::V1::PlacesController < Api::V1::BaseController
def index
render json: Place.displayable
respond_to do |format|
format.json { render json: Place.displayable }
format.atom { @places_items = Place.displayable.order('updated_at DESC') }
end
end

def show
Expand Down
37 changes: 37 additions & 0 deletions app/views/api/v1/places/index.atom.builder
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
def place_to_html_description(place)
def format_entry(name, value)
i18n_name = I18n.t("simple_form.labels.place.#{name}")
displayed_value = (name == 'kind' ? I18n.t("kinds.codes.#{value}") : value)
"<b>#{i18n_name} :</b> #{displayed_value}"
end
text_entries = place.attributes
.slice('kind', 'street', 'zip_code', 'city', 'description', 'owner_name')
.reject { |k, v| v.nil? }
.map { |name, value| format_entry(name, value) }
twitname = place.twitter_name
twitter_entry = format_entry('twitter_name', "<a href='https://twitter.com/#{twitname}'>@#{twitname}</a>") unless !twitname
url_entry = format_entry('url', "<a href='#{place.url}'>#{place.url}</a>") unless !place.url
logo_img = "<img src='#{place.logo_url}' alt='#{place.name} logo'>" unless !place.logo_url
direct_link = "<a href='/#/place/#{place.id}'>#{I18n.t 'feed.link_to_map_marker'}</a>"
[
logo_img,
*text_entries,
url_entry,
twitter_entry,
direct_link,
].compact.join '<br>'
end

atom_feed language: (I18n.locale == :fr ? 'fr-FR' : 'en-US') do |feed|
feed.title I18n.t 'feed.title'
feed.updated @places_items.first.updated_at unless @places_items.empty?
@places_items.each do |place_item|
feed.entry( place_item ) do |entry|
entry.title place_item.name
entry.content place_to_html_description(place_item), type: 'html'
entry.author do |author|
author.name place_item.owner_name
end
end
end
end
1 change: 1 addition & 0 deletions app/views/layouts/application.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ places_count = Place.displayable.count

<%= stylesheet_link_tag 'application' %>
<%= csrf_meta_tags %>
<%= auto_discovery_link_tag :atom, "/feed" %>
</head>

<body>
Expand Down
3 changes: 3 additions & 0 deletions config/locales/app.en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,6 @@ en:
owner_email: Your email
place_update:
<<: *place
feed:
title: Last added places
link_to_map_marker: Link to map marker
3 changes: 3 additions & 0 deletions config/locales/app.fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,6 @@ fr:
owner_email: Votre adresse email
place_update:
<<: *place
feed:
title: Derniers lieux ajoutés
link_to_map_marker: Lien vers le marqueur sur la carte
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,6 @@
end
end

get '/feed', to: 'api/v1/places#index', defaults: { format: 'atom' }
get '*path', to: 'places#index'
end
32 changes: 32 additions & 0 deletions spec/features/a_user_can_subscribe_to_the_place_feed_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
require 'rails_helper'

feature 'A user view the places Atom feed' do
scenario 'there is a link to the map marker in the feed item description' do
create(:place, :active)

visit '/feed'

expect(find(:xpath, '//feed/entry[1]/content').text).to include(t('feed.link_to_map_marker'))
end

scenario 'when several places exist, they have different "updated" times' do
create(:place, :active, updated_at: 3.days.ago)
create(:place, :active)

visit '/feed'

expect(find(:xpath, '//feed/entry[1]/updated').text).to_not eq(find(:xpath, '//feed/entry[2]/updated').text)
end

scenario 'when several places exist, they are ordered chronologically' do
create(:place, :active, name: 'Newest place')
create(:place, :active, name: 'Another place', updated_at: 3.days.ago)
create(:place, :active, name: 'Oldest place', updated_at: 3.months.ago)

visit '/feed'

expect(find(:xpath, '//feed/entry[1]/title').text).to eq('Newest place')
expect(find(:xpath, '//feed/entry[2]/title').text).to eq('Another place')
expect(find(:xpath, '//feed/entry[3]/title').text).to eq('Oldest place')
end
end
2 changes: 1 addition & 1 deletion spec/fixtures/csv/valid.csv
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
name;kind;street;zip_code;city;url;latitude;longitude;twitter_name;logo_url;description;owner_name;owner_email
Craftsmen;company;25 rue Lenepveu;49000;Angers;http://craftsmen.io;47.472041;-0.551269;craftsmenhq;;;;
Craftsmen Angers;company;25 rue Lenepveu;49100;Angers;http://craftsmen.io;47.472041;-0.551269;craftsmenhq;https://pbs.twimg.com/profile_images/425256684244566016/N0wcdLyQ_400x400.jpeg;Webdesign studio;Sébastien Charrier;sebastien@craftsmen.io
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't be needed if using factories instead of fixtures.