contentful_rails 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +158 -0
- data/Rakefile +6 -12
- data/app/controllers/contentful_rails/webhooks_controller.rb +1 -0
- data/lib/contentful_rails/engine.rb +4 -0
- data/lib/contentful_rails/preview.rb +3 -1
- data/lib/contentful_rails/version.rb +1 -1
- metadata +12 -19
- data/test/contentful_rails_test.rb +0 -7
- data/test/dummy/Rakefile +0 -2
- data/test/integration/navigation_test.rb +0 -10
- data/test/test_helper.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0f7d55ee8546d4eed5140bb1768923d8bc6861b
|
4
|
+
data.tar.gz: c0616573406f91822b3d3ee04d5138625498497a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bae8ca92a8774946ed40da840af9815059925c9c0f386d0fe23cddb514d6b4ca3906822c07b003826a213b60bc41e7e27881062bba4efd963bed45319ea2629b
|
7
|
+
data.tar.gz: a934378c344537923460d5f96ee2328fe57ec49d316136eb4c6eaf5763fbed085574cccb121107bd929b1b1327b3550ecf7db5759ddf7d8035c9d0fdc52af1e1
|
data/README.md
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
# Contentful Rails
|
2
|
+
|
3
|
+
A collection of useful things to help make it easier to integrate Contentful into your Rails app.
|
4
|
+
It includes view helpers, a Webhook handler, caching, and a Rails Engine to hook it all together.
|
5
|
+
|
6
|
+
This is a work in progress. It relies on the contentful_model gem (http://github.com/contentful/contentful_model)
|
7
|
+
|
8
|
+
## What is Contentful?
|
9
|
+
|
10
|
+
[Contentful](https://www.contentful.com) is a content management platform for web applications, mobile apps and connected devices. It allows you to create, edit & manage content in the cloud and publish it anywhere via powerful API. Contentful offers tools for managing editorial teams and enabling cooperation between organizations.
|
11
|
+
|
12
|
+
# Configuration
|
13
|
+
ContentfulRails accepts a block for configuration. Best done in a Rails initializer.
|
14
|
+
|
15
|
+
```
|
16
|
+
ContentfulRails.configure do |config|
|
17
|
+
config.authenticate_webhooks = true # false here would allow the webhooks to process without basic auth
|
18
|
+
config.webhooks_username = "a basic auth username"
|
19
|
+
config.webhooks_password = "a basic auth password"
|
20
|
+
config.access_token = "your access token"
|
21
|
+
config.preview_access_token = "your preview access token"
|
22
|
+
config.management_token = "your management access token"
|
23
|
+
config.space = "your space ID"
|
24
|
+
config.contentful_options = "hash of options"
|
25
|
+
end
|
26
|
+
```
|
27
|
+
|
28
|
+
Note that you _don't_ have to separately configure ContentfulModel - adding the access tokens / space ID / options here will
|
29
|
+
pass to ContentfulModel in an initializer in the Rails engine.
|
30
|
+
|
31
|
+
The default is to authenticate the webhooks; probably a smart move to host on an HTTPS endpoint too.
|
32
|
+
|
33
|
+
### Entry Mapping
|
34
|
+
|
35
|
+
By default, ContentfulRails will try to define your `entry_mapping` configuration for you. It does this by iterating through
|
36
|
+
the descendents of the base class `ContentfulModel::Base` during initialization. In order to ensure these classes are
|
37
|
+
loaded by this time, it will call `eager_load!` for the entire application. If this is not desired, you can set the
|
38
|
+
`eager_load_entry_mapping` config to false set your entry mapping manually by setting the entry_mapping config
|
39
|
+
as [described here](https://github.com/contentful/contentful.rb#custom-resource-classes).
|
40
|
+
|
41
|
+
|
42
|
+
```
|
43
|
+
ContentfulRails.configure do |config|
|
44
|
+
...
|
45
|
+
config.eager_load_entry_mapping = false
|
46
|
+
config.contentful_options = {
|
47
|
+
entry_mapping: {
|
48
|
+
'article' => Article,
|
49
|
+
...
|
50
|
+
}
|
51
|
+
}
|
52
|
+
end
|
53
|
+
```
|
54
|
+
|
55
|
+
**Note:** If you do not define the entry mapping in your configuration, the webhook cache expiration will likely not work as expected
|
56
|
+
|
57
|
+
# Allowing 'Russian Doll' style caching on Entries
|
58
|
+
The issue with 'Russian Doll' caching in Rails is that it requires a hit on the database to check the `updated_at` timestamp of an object.
|
59
|
+
|
60
|
+
This is obviously expensive when the object is called over an API. So this gem wraps caches `updated_at` locally, and checks that first on subsequent calls.
|
61
|
+
|
62
|
+
```
|
63
|
+
Foo.updated_at #returns a timestamp from cache, or from the API if no cache exists
|
64
|
+
```
|
65
|
+
|
66
|
+
# Webhooks Endpoint
|
67
|
+
If there's a new version of an entry we need to expire the timestamp from the cache.
|
68
|
+
|
69
|
+
This gem includes a controller endpoint for Contentful to POST back to.
|
70
|
+
|
71
|
+
To make use of this in your app:
|
72
|
+
|
73
|
+
## routes.rb
|
74
|
+
Mount the ContentfulRails engine at your preferred url:
|
75
|
+
|
76
|
+
```
|
77
|
+
mount ContentfulRails::Engine => '/contentful' #feel free to choose a different endpoint name
|
78
|
+
```
|
79
|
+
|
80
|
+
This will give you 2 routes:
|
81
|
+
|
82
|
+
`/contentful/webhooks` - the URL for contentful to post back to.
|
83
|
+
`/contentful/webhooks/debug` - a development-only URL to check you have mounted the engine properly :-)
|
84
|
+
|
85
|
+
## What the webhook handler does
|
86
|
+
At the moment all this does is delete the timestamp cache entry, which means that a subsequent call to `updated_at` calls the API.
|
87
|
+
|
88
|
+
# View Helpers
|
89
|
+
Contentful has a [really nice url-based image manipulation API](https://www.contentful.com/blog/2014/08/14/do-more-with-images-on-contentful-platform/).
|
90
|
+
|
91
|
+
To take advantage of this, there's a custom Redcarpet renderer which allows you to pass the image parameters you want into the call to a `parse_markdown()` method.
|
92
|
+
|
93
|
+
In your application_controller.rb:
|
94
|
+
|
95
|
+
```
|
96
|
+
helper ContentfulRails::MarkdownHelper
|
97
|
+
```
|
98
|
+
|
99
|
+
This allows you to call `parse_markdown(@your_markdown)` and get HTML. *Note* that out of the box, the `parse_markdown()` is really permissive and allows you to put HTML in the Contentful markdown fields. This might not be what you want.
|
100
|
+
|
101
|
+
## Manipulating images
|
102
|
+
To manipulate images which are referenced in your markdown, you can pass the following into the `parse_markdown()` call.
|
103
|
+
|
104
|
+
```
|
105
|
+
parse_markdown(@your_markdown, image_options: {width: 1024, height: 1024})
|
106
|
+
```
|
107
|
+
|
108
|
+
The `image_options` parameter takes the following options (some are mutually exclusive. Read the [instructions here](https://www.contentful.com/blog/2014/08/14/do-more-with-images-on-contentful-platform/)):
|
109
|
+
|
110
|
+
* `:width`
|
111
|
+
* `:height`
|
112
|
+
* `:fit`
|
113
|
+
* `:focus`
|
114
|
+
* `:corner_radius`
|
115
|
+
* `:quality`
|
116
|
+
|
117
|
+
## Subclassing the MarkdownRenderer class
|
118
|
+
Sometimes you might want to apply some specific class, markup or similar to an html entity when it's being processed. [With RedCarpet that's dead easy](https://github.com/vmg/redcarpet#and-you-can-even-cook-your-own).
|
119
|
+
|
120
|
+
Just subclass the `ContentfulRails::MarkdownRenderer` class, and call any methods you need.
|
121
|
+
|
122
|
+
```
|
123
|
+
class MyRenderer < ContentfulRails::MarkdownRenderer
|
124
|
+
# If you want to pass options into your renderer, you need to overload initialize()
|
125
|
+
def initialize(opts)
|
126
|
+
@options = opts
|
127
|
+
super
|
128
|
+
end
|
129
|
+
|
130
|
+
# If you want to do something special with links:
|
131
|
+
def link(link,title,content)
|
132
|
+
# Add a class name to all links, for example
|
133
|
+
class_name = "my-link-class-name"
|
134
|
+
content_tag(:a, content, href: link, title: title, class: class_name)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
```
|
138
|
+
|
139
|
+
You can overload any methods exposed in RedCarpet.
|
140
|
+
|
141
|
+
# To Do
|
142
|
+
Some things would be nice to do:
|
143
|
+
|
144
|
+
* Tests :-)
|
145
|
+
* Make caching the timestamp optional in the configuration
|
146
|
+
* Implement a method on ContentfulModel to simulate a parent-child relationship, so we can invalidate caches for parent items
|
147
|
+
|
148
|
+
|
149
|
+
# Licence
|
150
|
+
Licence is MIT. Please see MIT-LICENCE in this repo.
|
151
|
+
|
152
|
+
# Contributing
|
153
|
+
Please feel free to contribute!
|
154
|
+
|
155
|
+
* Fork this repo
|
156
|
+
* Make your changes
|
157
|
+
* Commit
|
158
|
+
* Create a PR
|
data/Rakefile
CHANGED
@@ -6,27 +6,21 @@ end
|
|
6
6
|
|
7
7
|
require 'rdoc/task'
|
8
8
|
|
9
|
+
require File.expand_path('../spec/dummy/config/application', __FILE__)
|
10
|
+
|
9
11
|
RDoc::Task.new(:rdoc) do |rdoc|
|
10
12
|
rdoc.rdoc_dir = 'rdoc'
|
11
13
|
rdoc.title = 'ContentfulRails'
|
12
14
|
rdoc.options << '--line-numbers'
|
13
|
-
rdoc.rdoc_files.include('README.
|
15
|
+
rdoc.rdoc_files.include('README.md')
|
14
16
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
17
|
end
|
16
18
|
|
17
|
-
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
18
|
-
load 'rails/tasks/engine.rake'
|
19
19
|
|
20
20
|
Bundler::GemHelper.install_tasks
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
Rake::TestTask.new(:test) do |t|
|
25
|
-
t.libs << 'lib'
|
26
|
-
t.libs << 'test'
|
27
|
-
t.pattern = 'test/**/*_test.rb'
|
28
|
-
t.verbose = false
|
29
|
-
end
|
22
|
+
Rails.application.load_tasks
|
30
23
|
|
24
|
+
task(:default).clear
|
25
|
+
task default: :spec
|
31
26
|
|
32
|
-
task default: :test
|
@@ -5,6 +5,7 @@ class ContentfulRails::WebhooksController < ActionController::Base
|
|
5
5
|
http_basic_authenticate_with name: ContentfulRails.configuration.webhooks_username,
|
6
6
|
password: ContentfulRails.configuration.webhooks_password
|
7
7
|
end
|
8
|
+
|
8
9
|
params = [:verify_authenticity_token, {:only => [:create], raise: false}]
|
9
10
|
if Rails::VERSION::MAJOR > 4
|
10
11
|
skip_before_action *params
|
@@ -5,7 +5,9 @@ module ContentfulRails
|
|
5
5
|
included do
|
6
6
|
before_action :check_preview_domain
|
7
7
|
after_action :remove_preview_cache
|
8
|
-
|
8
|
+
if respond_to?(:helper_method)
|
9
|
+
helper_method :preview?
|
10
|
+
end
|
9
11
|
end
|
10
12
|
# Check whether the subdomain being presented is the preview domain.
|
11
13
|
# If so, set ContentfulModel to use the preview API, and request a username / password
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: contentful_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Error Creative Studio
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: '4.2'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: '4.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: contentful_model
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: '0.2'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: '0.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: redcarpet
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -60,6 +60,7 @@ extensions: []
|
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
62
|
- MIT-LICENSE
|
63
|
+
- README.md
|
63
64
|
- Rakefile
|
64
65
|
- app/controllers/contentful_rails/webhooks_controller.rb
|
65
66
|
- app/helpers/contentful_rails/markdown_helper.rb
|
@@ -74,10 +75,6 @@ files:
|
|
74
75
|
- lib/contentful_rails/sluggable.rb
|
75
76
|
- lib/contentful_rails/version.rb
|
76
77
|
- lib/tasks/contentful_rails_tasks.rake
|
77
|
-
- test/contentful_rails_test.rb
|
78
|
-
- test/dummy/Rakefile
|
79
|
-
- test/integration/navigation_test.rb
|
80
|
-
- test/test_helper.rb
|
81
78
|
homepage: https://github.com/errorstudio/contentful_rails
|
82
79
|
licenses:
|
83
80
|
- MIT
|
@@ -102,8 +99,4 @@ rubygems_version: 2.5.1
|
|
102
99
|
signing_key:
|
103
100
|
specification_version: 4
|
104
101
|
summary: A gem to help with hooking Contentful into your Rails application
|
105
|
-
test_files:
|
106
|
-
- test/contentful_rails_test.rb
|
107
|
-
- test/dummy/Rakefile
|
108
|
-
- test/integration/navigation_test.rb
|
109
|
-
- test/test_helper.rb
|
102
|
+
test_files: []
|
data/test/dummy/Rakefile
DELETED
data/test/test_helper.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# Configure Rails Environment
|
2
|
-
ENV["RAILS_ENV"] = "test"
|
3
|
-
|
4
|
-
require File.expand_path("../../test/dummy/config/environment.rb", __FILE__)
|
5
|
-
ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
|
6
|
-
require "rails/test_help"
|
7
|
-
|
8
|
-
Rails.backtrace_cleaner.remove_silencers!
|
9
|
-
|
10
|
-
# Load support files
|
11
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
12
|
-
|
13
|
-
# Load fixtures from the engine
|
14
|
-
if ActiveSupport::TestCase.method_defined?(:fixture_path=)
|
15
|
-
ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
|
16
|
-
end
|