buttercms 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/Rakefile +37 -1
- data/app/controllers/buttercms/blog_controller.rb +33 -25
- data/buttercms.gemspec +2 -0
- data/lib/buttercms/version.rb +1 -1
- data/test/buttercms_test.rb +204 -4
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/images/.keep +0 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/controllers/concerns/.keep +0 -0
- data/test/dummy/app/helpers/application_helper.rb +5 -0
- data/test/dummy/app/mailers/.keep +0 -0
- data/test/dummy/app/models/.keep +0 -0
- data/test/dummy/app/models/concerns/.keep +0 -0
- data/test/dummy/app/views/blog/_pagers.html.erb +13 -0
- data/test/dummy/app/views/blog/_post.html.erb +22 -0
- data/test/dummy/app/views/blog/author.html.erb +3 -0
- data/test/dummy/app/views/blog/category.html.erb +3 -0
- data/test/dummy/app/views/blog/home.html.erb +5 -0
- data/test/dummy/app/views/blog/post.html.erb +76 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/butter.rb +13 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/lib/assets/.keep +0 -0
- data/test/dummy/log/.keep +0 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- metadata +130 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb1cc49cec49263c6cc7235b04bd6374e0b71ed3
|
4
|
+
data.tar.gz: e58a86c5bba9639451a2506ebf9104b5de94df0d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4ff507582245843ff9f4ef7791aca1a9e1a1e570e7e1a392132055c8079cd96998699874dd6adcb79b3ae0c0a57fd47b6297bc7d771a08e25b5c11447349b50
|
7
|
+
data.tar.gz: 2a677b384a44964f6e86112a8daef94e99e670027bdcff04734fdc07ad9a3fa7d98f92aa9d837c230bdc22e30fd4ec8977779af510197eac18e06dda8c3a73ac
|
data/.gitignore
CHANGED
data/Rakefile
CHANGED
@@ -1 +1,37 @@
|
|
1
|
-
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'Buttercms'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
19
|
+
|
20
|
+
|
21
|
+
load 'rails/tasks/statistics.rake'
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
Bundler::GemHelper.install_tasks
|
26
|
+
|
27
|
+
require 'rake/testtask'
|
28
|
+
|
29
|
+
Rake::TestTask.new(:test) do |t|
|
30
|
+
t.libs << 'lib'
|
31
|
+
t.libs << 'test'
|
32
|
+
t.pattern = 'test/**/*_test.rb'
|
33
|
+
t.verbose = false
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
task default: :test
|
@@ -1,47 +1,36 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'rest-client'
|
3
3
|
|
4
|
-
|
5
4
|
module Buttercms
|
6
5
|
|
7
|
-
API_URL = 'https://buttercms.com/api/'
|
8
|
-
|
9
6
|
class Error < StandardError
|
10
7
|
end
|
11
8
|
|
9
|
+
|
12
10
|
class ConnectionError < Error
|
13
11
|
def message
|
14
12
|
"Unable to connect to ButterCms. Please double check your internet connection."
|
15
13
|
end
|
16
14
|
end
|
17
15
|
|
16
|
+
|
18
17
|
class TokenError < Error
|
19
18
|
def message
|
20
19
|
"This token has not been registered. Please register one @ https://buttercms.com/api_token/"
|
21
20
|
end
|
22
21
|
end
|
23
22
|
|
23
|
+
|
24
24
|
class InvalidResponseError < Error
|
25
25
|
def message
|
26
26
|
"An error occured retrieving blog. Please try again later."
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
class BlogController < ApplicationController
|
31
|
-
layout :get_butter_layout
|
32
|
-
helper Rails.application.helpers
|
33
|
-
helper Buttercms::ApplicationHelper
|
34
|
-
|
35
|
-
def get_butter_layout
|
36
|
-
if defined? Buttercms.configuration
|
37
|
-
if !Buttercms.configuration.layout.nil?
|
38
|
-
return Buttercms.configuration.layout
|
39
|
-
end
|
40
|
-
end
|
41
30
|
|
42
|
-
|
43
|
-
|
44
|
-
|
31
|
+
# Thin wrapper around RestClient for talking to Butter API
|
32
|
+
module API
|
33
|
+
API_URL = 'https://buttercms.com/api/'
|
45
34
|
|
46
35
|
def butter_not_found
|
47
36
|
raise ActionController::RoutingError.new('Not Found')
|
@@ -62,7 +51,7 @@ module Buttercms
|
|
62
51
|
begin
|
63
52
|
# Get the content. If it takes longer than 10 seconds timeout.
|
64
53
|
# TODO(jlumetta): Make :timeout configurable.
|
65
|
-
response = RestClient.get path, {:Authorization => "Token #{get_butter_token}", :timeout => 10}
|
54
|
+
response = RestClient.get "#{API_URL}#{path}", {:Authorization => "Token #{get_butter_token}", :timeout => 10}
|
66
55
|
rescue SocketError => e
|
67
56
|
raise Buttercms::ConnectionError
|
68
57
|
rescue => e
|
@@ -77,9 +66,28 @@ module Buttercms
|
|
77
66
|
raise Buttercms::InvalidResponseError
|
78
67
|
end
|
79
68
|
end
|
80
|
-
|
81
69
|
return response
|
82
70
|
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
class BlogController < ApplicationController
|
75
|
+
include Buttercms::API
|
76
|
+
|
77
|
+
layout :get_butter_layout
|
78
|
+
helper Rails.application.helpers
|
79
|
+
helper Buttercms::ApplicationHelper
|
80
|
+
|
81
|
+
def get_butter_layout
|
82
|
+
if defined? Buttercms.configuration
|
83
|
+
if !Buttercms.configuration.layout.nil?
|
84
|
+
return Buttercms.configuration.layout
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Default to the included layout.
|
89
|
+
return "buttercms/application"
|
90
|
+
end
|
83
91
|
|
84
92
|
def butter_home
|
85
93
|
# Check for pagination
|
@@ -89,7 +97,7 @@ module Buttercms
|
|
89
97
|
page_param = ''
|
90
98
|
end
|
91
99
|
|
92
|
-
response = make_butter_request("
|
100
|
+
response = make_butter_request("posts/#{page_param}")
|
93
101
|
response_json = JSON.parse(response)
|
94
102
|
@next_page = response_json['next_page']
|
95
103
|
@previous_page = response_json['previous_page']
|
@@ -99,14 +107,14 @@ module Buttercms
|
|
99
107
|
end
|
100
108
|
|
101
109
|
def butter_post
|
102
|
-
response = make_butter_request("
|
110
|
+
response = make_butter_request("posts/#{params[:slug]}")
|
103
111
|
@post = JSON.parse(response)
|
104
112
|
|
105
113
|
render template: "blog/post"
|
106
114
|
end
|
107
115
|
|
108
116
|
def butter_author
|
109
|
-
response = make_butter_request("
|
117
|
+
response = make_butter_request("authors/#{params[:author_slug]}")
|
110
118
|
response_json = JSON.parse(response)
|
111
119
|
@first_name = response_json['first_name']
|
112
120
|
@last_name = response_json['last_name']
|
@@ -117,7 +125,7 @@ module Buttercms
|
|
117
125
|
end
|
118
126
|
|
119
127
|
def butter_category
|
120
|
-
response = make_butter_request("
|
128
|
+
response = make_butter_request("categories/#{params[:category_slug]}")
|
121
129
|
response_json = JSON.parse(response)
|
122
130
|
@name = response_json['name']
|
123
131
|
@recent_posts = response_json['recent_posts']
|
@@ -127,7 +135,7 @@ module Buttercms
|
|
127
135
|
|
128
136
|
|
129
137
|
def butter_feed
|
130
|
-
response = make_butter_request("
|
138
|
+
response = make_butter_request("posts/")
|
131
139
|
response_json = JSON.parse(response)
|
132
140
|
@recent_posts = response_json['results']
|
133
141
|
respond_to do |format|
|
@@ -137,7 +145,7 @@ module Buttercms
|
|
137
145
|
end
|
138
146
|
|
139
147
|
def butter_sitemap
|
140
|
-
response = make_butter_request("
|
148
|
+
response = make_butter_request("sitemap/")
|
141
149
|
response_json = JSON.parse(response)
|
142
150
|
@recent_posts = response_json
|
143
151
|
end
|
data/buttercms.gemspec
CHANGED
data/lib/buttercms/version.rb
CHANGED
data/test/buttercms_test.rb
CHANGED
@@ -1,7 +1,207 @@
|
|
1
1
|
require 'test_helper'
|
2
|
+
require 'rest-client'
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
4
|
+
module Buttercms
|
5
|
+
class ButtercmsApiTest < ActiveSupport::TestCase
|
6
|
+
API_URL = 'https://buttercms.com/api/'
|
7
|
+
TEST_TOKEN = '6e9f14b48892b00079604c24c7c64a6a987456cf'
|
8
|
+
|
9
|
+
test "truth" do
|
10
|
+
assert_kind_of Module, Buttercms
|
11
|
+
end
|
12
|
+
|
13
|
+
test "API returns list of most recent posts in expected format" do
|
14
|
+
response = RestClient.get "#{API_URL}posts/", {:Authorization => "Token #{TEST_TOKEN}", :timeout => 10}
|
15
|
+
response_json = JSON.parse(response)
|
16
|
+
|
17
|
+
# Test the top level JSON structure
|
18
|
+
assert_equal response_json['next_page'], nil
|
19
|
+
assert_equal response_json['previous_page'], nil
|
20
|
+
assert_equal response_json['results'].length, 1
|
21
|
+
|
22
|
+
# Test the JSON structure of the post itself.
|
23
|
+
post = response_json['results'][0]
|
24
|
+
assert_equal post['id'], 101
|
25
|
+
assert_equal post['url'], 'http://www.example.com/blog/this-is-a-blog-post'
|
26
|
+
assert_equal post['created'], '06/12/2015'
|
27
|
+
assert_equal post['published'], '06/12/2015'
|
28
|
+
assert_equal post['slug'], 'this-is-a-blog-post'
|
29
|
+
assert_equal post['title'], 'This is a blog post'
|
30
|
+
assert_equal post['body'], '<p class="">This is a blog post to test the API.</p>'
|
31
|
+
assert_equal post['summary'], 'This is a blog post to test the API.'
|
32
|
+
assert_equal post['featured_image'], ''
|
33
|
+
assert_equal post['status'], 'published'
|
34
|
+
|
35
|
+
author = post['author']
|
36
|
+
assert_equal author['first_name'], 'API'
|
37
|
+
assert_equal author['last_name'], 'Test'
|
38
|
+
assert_equal author['email'], 'apitest@buttercms.com'
|
39
|
+
assert_equal author['slug'], 'api-test'
|
40
|
+
|
41
|
+
categories = post['categories']
|
42
|
+
assert_equal categories.length, 1
|
43
|
+
assert_equal categories[0]['name'], 'test category'
|
44
|
+
assert_equal categories[0]['slug'], 'test-category'
|
45
|
+
end
|
46
|
+
|
47
|
+
test "API returns details for a specific post based on slug" do
|
48
|
+
response = RestClient.get "#{API_URL}posts/this-is-a-blog-post", {:Authorization => "Token #{TEST_TOKEN}", :timeout => 10}
|
49
|
+
response_json = JSON.parse(response)
|
50
|
+
|
51
|
+
# Test the JSON structure of the post itself and ensure it's at the top level of the response body.
|
52
|
+
post = response_json
|
53
|
+
assert_equal post['id'], 101
|
54
|
+
assert_equal post['url'], 'http://www.example.com/blog/this-is-a-blog-post'
|
55
|
+
assert_equal post['created'], '06/12/2015'
|
56
|
+
assert_equal post['published'], '06/12/2015'
|
57
|
+
assert_equal post['slug'], 'this-is-a-blog-post'
|
58
|
+
assert_equal post['title'], 'This is a blog post'
|
59
|
+
assert_equal post['body'], '<p class="">This is a blog post to test the API.</p>'
|
60
|
+
assert_equal post['summary'], 'This is a blog post to test the API.'
|
61
|
+
assert_equal post['featured_image'], ''
|
62
|
+
assert_equal post['status'], 'published'
|
63
|
+
|
64
|
+
author = post['author']
|
65
|
+
assert_equal author['first_name'], 'API'
|
66
|
+
assert_equal author['last_name'], 'Test'
|
67
|
+
assert_equal author['email'], 'apitest@buttercms.com'
|
68
|
+
assert_equal author['slug'], 'api-test'
|
69
|
+
|
70
|
+
categories = post['categories']
|
71
|
+
assert_equal categories.length, 1
|
72
|
+
assert_equal categories[0]['name'], 'test category'
|
73
|
+
assert_equal categories[0]['slug'], 'test-category'
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
test "API returns details for a specific author based on slug" do
|
78
|
+
response = RestClient.get "#{API_URL}authors/api-test", {:Authorization => "Token #{TEST_TOKEN}", :timeout => 10}
|
79
|
+
response_json = JSON.parse(response)
|
80
|
+
|
81
|
+
# Ensure the author information is at the top level of the response.
|
82
|
+
author = response_json
|
83
|
+
assert_equal author['first_name'], 'API'
|
84
|
+
assert_equal author['last_name'], 'Test'
|
85
|
+
assert_equal author['email'], 'apitest@buttercms.com'
|
86
|
+
assert_equal author['slug'], 'api-test'
|
87
|
+
|
88
|
+
# Ensure we get all of their posts in the format we expect.
|
89
|
+
recent_posts = author['recent_posts']
|
90
|
+
assert_equal recent_posts.length, 1
|
91
|
+
|
92
|
+
post = recent_posts[0]
|
93
|
+
assert_equal post['id'], 101
|
94
|
+
assert_equal post['url'], 'http://www.example.com/blog/this-is-a-blog-post'
|
95
|
+
assert_equal post['created'], '06/12/2015'
|
96
|
+
assert_equal post['published'], '06/12/2015'
|
97
|
+
assert_equal post['slug'], 'this-is-a-blog-post'
|
98
|
+
assert_equal post['title'], 'This is a blog post'
|
99
|
+
assert_equal post['body'], '<p class="">This is a blog post to test the API.</p>'
|
100
|
+
assert_equal post['summary'], 'This is a blog post to test the API.'
|
101
|
+
assert_equal post['featured_image'], ''
|
102
|
+
assert_equal post['status'], 'published'
|
103
|
+
|
104
|
+
categories = post['categories']
|
105
|
+
assert_equal categories.length, 1
|
106
|
+
assert_equal categories[0]['name'], 'test category'
|
107
|
+
assert_equal categories[0]['slug'], 'test-category'
|
108
|
+
end
|
109
|
+
|
110
|
+
test "API returns details for a specific category based on slug" do
|
111
|
+
response = RestClient.get "#{API_URL}categories/test-category", {:Authorization => "Token #{TEST_TOKEN}", :timeout => 10}
|
112
|
+
response_json = JSON.parse(response)
|
113
|
+
|
114
|
+
# Ensure the author information is at the top level of the response.
|
115
|
+
category = response_json
|
116
|
+
assert_equal category['name'], 'test category'
|
117
|
+
assert_equal category['slug'], 'test-category'
|
118
|
+
|
119
|
+
# Ensure we get all of their posts in the format we expect.
|
120
|
+
recent_posts = category['recent_posts']
|
121
|
+
assert_equal recent_posts.length, 1
|
122
|
+
|
123
|
+
post = recent_posts[0]
|
124
|
+
assert_equal post['id'], 101
|
125
|
+
assert_equal post['url'], 'http://www.example.com/blog/this-is-a-blog-post'
|
126
|
+
assert_equal post['created'], '06/12/2015'
|
127
|
+
assert_equal post['published'], '06/12/2015'
|
128
|
+
assert_equal post['slug'], 'this-is-a-blog-post'
|
129
|
+
assert_equal post['title'], 'This is a blog post'
|
130
|
+
assert_equal post['body'], '<p class="">This is a blog post to test the API.</p>'
|
131
|
+
assert_equal post['summary'], 'This is a blog post to test the API.'
|
132
|
+
assert_equal post['featured_image'], ''
|
133
|
+
assert_equal post['status'], 'published'
|
134
|
+
end
|
135
|
+
|
136
|
+
test "API returns sitemap for blog" do
|
137
|
+
response = RestClient.get "#{API_URL}sitemap", {:Authorization => "Token #{TEST_TOKEN}", :timeout => 10}
|
138
|
+
response_json = JSON.parse(response)
|
139
|
+
|
140
|
+
assert_equal response_json.length, 1
|
141
|
+
|
142
|
+
sitemap_entry = response_json[0]
|
143
|
+
assert_equal sitemap_entry['url'], 'http://www.example.com/blog/this-is-a-blog-post'
|
144
|
+
assert_equal sitemap_entry['slug'], 'this-is-a-blog-post'
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
|
150
|
+
class BlogControllerTest < ActionController::TestCase
|
151
|
+
setup do
|
152
|
+
@routes = Engine.routes
|
153
|
+
end
|
154
|
+
|
155
|
+
test "should get blog home and it should have recent_posts defined" do
|
156
|
+
get "butter_home"
|
157
|
+
assert_response :success
|
158
|
+
assert_not_nil assigns(:recent_posts)
|
159
|
+
end
|
160
|
+
|
161
|
+
test "should get blog post and it should have post defined" do
|
162
|
+
get("butter_post", {'slug' => 'this-is-a-blog-post'})
|
163
|
+
assert_response :success
|
164
|
+
assert_not_nil assigns(:post)
|
165
|
+
end
|
166
|
+
|
167
|
+
test "should get author page" do
|
168
|
+
get("butter_author", {'author_slug' => 'api-test'})
|
169
|
+
assert_response :success
|
170
|
+
assert_not_nil assigns(:first_name)
|
171
|
+
assert_not_nil assigns(:last_name)
|
172
|
+
assert_not_nil assigns(:email)
|
173
|
+
assert_not_nil assigns(:recent_posts)
|
174
|
+
end
|
175
|
+
|
176
|
+
test "should get category page" do
|
177
|
+
get("butter_category", {'category_slug' => 'test-category'})
|
178
|
+
assert_response :success
|
179
|
+
assert_not_nil assigns(:name)
|
180
|
+
assert_not_nil assigns(:recent_posts)
|
181
|
+
end
|
182
|
+
|
183
|
+
test "sitemap should return xml" do
|
184
|
+
get("butter_sitemap", {'format' => 'xml'})
|
185
|
+
assert_select 'loc', "http://www.example.com/blog/this-is-a-blog-post"
|
186
|
+
end
|
187
|
+
|
188
|
+
test "atom feed should return xml" do
|
189
|
+
get("butter_feed", {'format' => 'atom'})
|
190
|
+
assert_select 'title', "This is a blog post"
|
191
|
+
end
|
192
|
+
|
193
|
+
test "rss feed should return xml" do
|
194
|
+
get("butter_feed", {'format' => 'rss'})
|
195
|
+
assert_select 'title', "This is a blog post"
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
# Ensure that the blog has access to the host application's helpers.
|
200
|
+
class ApplicationHelperTest < ActionView::TestCase
|
201
|
+
include ApplicationHelper
|
202
|
+
|
203
|
+
test "should return the blog title" do
|
204
|
+
assert_equal blog_title_helper, 'This is the Blog Title'
|
205
|
+
end
|
6
206
|
end
|
7
|
-
end
|
207
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
== README
|
2
|
+
|
3
|
+
This README would normally document whatever steps are necessary to get the
|
4
|
+
application up and running.
|
5
|
+
|
6
|
+
Things you may want to cover:
|
7
|
+
|
8
|
+
* Ruby version
|
9
|
+
|
10
|
+
* System dependencies
|
11
|
+
|
12
|
+
* Configuration
|
13
|
+
|
14
|
+
* Database creation
|
15
|
+
|
16
|
+
* Database initialization
|
17
|
+
|
18
|
+
* How to run the test suite
|
19
|
+
|
20
|
+
* Services (job queues, cache servers, search engines, etc.)
|
21
|
+
|
22
|
+
* Deployment instructions
|
23
|
+
|
24
|
+
* ...
|
25
|
+
|
26
|
+
|
27
|
+
Please feel free to use a different markup language if you do not plan to run
|
28
|
+
<tt>rake doc:app</tt>.
|