middleman-headless 0.3.5 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5de691702df171e1d91948bc6f390f7ae83aea39
4
- data.tar.gz: 4334d46621814749bf57780b7a92f24f15294a9b
3
+ metadata.gz: 02fde3f80d8802e683bcfd98cc2aaa59c49d668a
4
+ data.tar.gz: 33dfef11c36b4a22fa09e9aa8fe866c7343ff01b
5
5
  SHA512:
6
- metadata.gz: 6424dab2df2aa3a64a7e87b5298abc7bcc7d48f0bd067b7859f6cf8a3db77f529d4ef1163d3e1264a5fc3b604cd81eecb72b6cfde5e44a467be36a2d1b3a5517
7
- data.tar.gz: ff1eac0b5345627a770a63dbf913087b11cbb0382221a89b7455dc7cbe4887e38f8197d3f3241caa58a517e19864ec806d42aafaed1ee1a96bb64debea9c4ec6
6
+ metadata.gz: a784d489c4ba026ec11f067b3858a4df3e29d1eae05065c5b2c18c4bfb96e2b31022a663dd44886c6219ce6087b3b796d18bd86dde2acd0aa974ed6d2f848fe3
7
+ data.tar.gz: 3b0c1fe73bb16ee698e48231a17d9810f69489be8a44ebd70ca44be67d51445a02ae443e0f251d83c7439da8ec0208fcd98187ccbbcbae84bdbda7855ad1e3c5
data/.gitignore CHANGED
@@ -1,5 +1,2 @@
1
- # Ignore bundler lock file
1
+ example/build/
2
2
  /Gemfile.lock
3
-
4
- # Ignore pkg folder
5
- /pkg
data/README.md CHANGED
@@ -1,3 +1,25 @@
1
1
  # middleman-headless
2
2
 
3
- **Middleman extension to load content from the Headless Content Management System.**
3
+ **Middleman extension to load content from the Headless Content Management System.**
4
+
5
+ ## Example
6
+
7
+ The example middleman site in `./example` shows how you can retrieve data from a headless instance.
8
+
9
+ First of all, you need to create a new space in your headless server with the slug `example`.
10
+
11
+ After that you need to create the following content types:
12
+
13
+ ```
14
+ post:
15
+ title: string
16
+ body: string (multiline)
17
+ image: asset
18
+ author: reference (author)
19
+
20
+ author (has no fields)
21
+ ```
22
+
23
+ Now you need to add English as a language with the slug `en`.
24
+
25
+ Finally, you can create as many entries you like.
data/example/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'middleman', '>= 4.0.0'
4
+ gem 'middleman-livereload'
5
+ gem 'middleman-headless', path: '../'
@@ -0,0 +1,138 @@
1
+ PATH
2
+ remote: ../
3
+ specs:
4
+ middleman-headless (0.3.5)
5
+ middleman-core (~> 4.1)
6
+ mime-types (~> 3.1)
7
+ oauth2 (~> 1.4)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ activesupport (5.0.6)
13
+ concurrent-ruby (~> 1.0, >= 1.0.2)
14
+ i18n (~> 0.7)
15
+ minitest (~> 5.1)
16
+ tzinfo (~> 1.1)
17
+ addressable (2.5.2)
18
+ public_suffix (>= 2.0.2, < 4.0)
19
+ backports (3.10.3)
20
+ coffee-script (2.4.1)
21
+ coffee-script-source
22
+ execjs
23
+ coffee-script-source (1.12.2)
24
+ compass-import-once (1.0.5)
25
+ sass (>= 3.2, < 3.5)
26
+ concurrent-ruby (1.0.5)
27
+ contracts (0.13.0)
28
+ dotenv (2.2.1)
29
+ em-websocket (0.5.1)
30
+ eventmachine (>= 0.12.9)
31
+ http_parser.rb (~> 0.6.0)
32
+ erubis (2.7.0)
33
+ eventmachine (1.2.5)
34
+ execjs (2.7.0)
35
+ faraday (0.12.2)
36
+ multipart-post (>= 1.2, < 3)
37
+ fast_blank (1.0.0)
38
+ fastimage (2.1.0)
39
+ ffi (1.9.18)
40
+ haml (5.0.4)
41
+ temple (>= 0.8.0)
42
+ tilt
43
+ hamster (3.0.0)
44
+ concurrent-ruby (~> 1.0)
45
+ hashie (3.5.6)
46
+ http_parser.rb (0.6.0)
47
+ i18n (0.7.0)
48
+ jwt (1.5.6)
49
+ kramdown (1.15.0)
50
+ listen (3.0.8)
51
+ rb-fsevent (~> 0.9, >= 0.9.4)
52
+ rb-inotify (~> 0.9, >= 0.9.7)
53
+ memoist (0.16.0)
54
+ middleman (4.2.1)
55
+ coffee-script (~> 2.2)
56
+ compass-import-once (= 1.0.5)
57
+ haml (>= 4.0.5)
58
+ kramdown (~> 1.2)
59
+ middleman-cli (= 4.2.1)
60
+ middleman-core (= 4.2.1)
61
+ sass (>= 3.4.0, < 4.0)
62
+ middleman-cli (4.2.1)
63
+ thor (>= 0.17.0, < 2.0)
64
+ middleman-core (4.2.1)
65
+ activesupport (>= 4.2, < 5.1)
66
+ addressable (~> 2.3)
67
+ backports (~> 3.6)
68
+ bundler (~> 1.1)
69
+ contracts (~> 0.13.0)
70
+ dotenv
71
+ erubis
72
+ execjs (~> 2.0)
73
+ fast_blank
74
+ fastimage (~> 2.0)
75
+ hamster (~> 3.0)
76
+ hashie (~> 3.4)
77
+ i18n (~> 0.7.0)
78
+ listen (~> 3.0.0)
79
+ memoist (~> 0.14)
80
+ padrino-helpers (~> 0.13.0)
81
+ parallel
82
+ rack (>= 1.4.5, < 3)
83
+ sass (>= 3.4)
84
+ servolux
85
+ tilt (~> 2.0)
86
+ uglifier (~> 3.0)
87
+ middleman-livereload (3.4.6)
88
+ em-websocket (~> 0.5.1)
89
+ middleman-core (>= 3.3)
90
+ rack-livereload (~> 0.3.15)
91
+ mime-types (3.1)
92
+ mime-types-data (~> 3.2015)
93
+ mime-types-data (3.2016.0521)
94
+ minitest (5.10.3)
95
+ multi_json (1.12.2)
96
+ multi_xml (0.6.0)
97
+ multipart-post (2.0.0)
98
+ oauth2 (1.4.0)
99
+ faraday (>= 0.8, < 0.13)
100
+ jwt (~> 1.0)
101
+ multi_json (~> 1.3)
102
+ multi_xml (~> 0.5)
103
+ rack (>= 1.2, < 3)
104
+ padrino-helpers (0.13.3.4)
105
+ i18n (~> 0.6, >= 0.6.7)
106
+ padrino-support (= 0.13.3.4)
107
+ tilt (>= 1.4.1, < 3)
108
+ padrino-support (0.13.3.4)
109
+ activesupport (>= 3.1)
110
+ parallel (1.12.0)
111
+ public_suffix (3.0.0)
112
+ rack (2.0.3)
113
+ rack-livereload (0.3.16)
114
+ rack
115
+ rb-fsevent (0.10.2)
116
+ rb-inotify (0.9.10)
117
+ ffi (>= 0.5.0, < 2)
118
+ sass (3.4.25)
119
+ servolux (0.13.0)
120
+ temple (0.8.0)
121
+ thor (0.20.0)
122
+ thread_safe (0.3.6)
123
+ tilt (2.0.8)
124
+ tzinfo (1.2.3)
125
+ thread_safe (~> 0.1)
126
+ uglifier (3.2.0)
127
+ execjs (>= 0.3.0, < 3)
128
+
129
+ PLATFORMS
130
+ ruby
131
+
132
+ DEPENDENCIES
133
+ middleman (>= 4.0.0)
134
+ middleman-headless!
135
+ middleman-livereload
136
+
137
+ BUNDLED WITH
138
+ 1.13.6
data/example/config.rb ADDED
@@ -0,0 +1,10 @@
1
+ activate :headless,
2
+ address: 'http://0.0.0.0:4000',
3
+ app_key: 'key',
4
+ app_secret: 'secret',
5
+ space: 'example',
6
+ download_assets: true
7
+
8
+ configure :development do
9
+ activate :livereload
10
+ end
@@ -0,0 +1,27 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Example</title>
6
+
7
+ <style>
8
+ body {
9
+ font-family: sans-serif;
10
+ font-size: 16px;
11
+ }
12
+ </style>
13
+ </head>
14
+
15
+ <body>
16
+
17
+ <h1><%= headless.space.name %></h1>
18
+
19
+ <% headless.posts.each do |post| %>
20
+ <h2><%= post.title %></h2>
21
+ <p><%= image_tag post.asset(:image).url(width: 400), alt: post.asset(:image).name %></p>
22
+ <p><%= post.body %></p>
23
+ <p>Written by <%= post.reference(:author).name %></p>
24
+ <% end %>
25
+
26
+ </body>
27
+ </html>
@@ -11,6 +11,10 @@ module MiddlemanHeadless
11
11
  option :space, nil, 'The space to be used'
12
12
  option :preview, false, 'Enable preview mode'
13
13
  option :cache, false, 'Enable caching. You need to restart the middleman to get updated content.'
14
+ option :download_assets, false, 'Download assets and replace links during a build.'
15
+ option :assets_dir, 'assets', 'The directory to place downloaded assets in.'
16
+ option :process_exts, %w(.html .json), 'The extension of files to process for downloadable assets.'
17
+ option :assets_hash_length, 8, 'The length of the appended hash key to the asset filenames.'
14
18
 
15
19
  expose_to_config :headless
16
20
  expose_to_template :headless
@@ -25,11 +29,47 @@ module MiddlemanHeadless
25
29
  end
26
30
 
27
31
  def headless
32
+ if options.app_key.blank? or options.app_secret.blank? or options.address.blank?
33
+ raise 'missing app_key, app_secret or address'
34
+ end
35
+
28
36
  @interface ||= Interface.new(options)
29
37
  end
30
38
 
31
39
  def clear
32
40
  @interface = nil unless options.cache
33
41
  end
42
+
43
+ def after_build(builder)
44
+ download_assets(builder) if options[:download_assets] and app.build?
45
+ end
46
+
47
+ def download_assets(builder)
48
+ downloads = {}
49
+ builder.thor.say 'Downloading headless assets...'
50
+
51
+ Middleman::Util.all_files_under(app.config[:build_dir]).each do |file|
52
+ next unless options[:process_exts].include?(File.extname(file))
53
+
54
+ content = File.binread(file.expand_path)
55
+
56
+ content.gsub! /hldl:\/\/([A-z0-9=]+)\// do
57
+ data = JSON.parse(Base64.urlsafe_decode64($1))
58
+ hash = Digest::SHA1.hexdigest(data['addr'])[0..options[:assets_hash_length]]
59
+ id = "#{data['name']}-#{hash}.#{data['ext']}"
60
+ downloads[id] = data['addr']
61
+ "/#{options[:assets_dir]}/#{id}"
62
+ end
63
+
64
+ File.open(file.expand_path, 'wb') { |f| f.write(content) }
65
+ builder.thor.say_status :processed, file
66
+ end
67
+
68
+ downloads.each do |id, url|
69
+ dest = Pathname(app.config[:build_dir]).join(options[:assets_dir], id)
70
+ builder.thor.get url, dest, verbose: false
71
+ builder.thor.say_status :downloaded, dest
72
+ end
73
+ end
34
74
  end
35
75
  end
@@ -1,3 +1,4 @@
1
+ require 'mime/types'
1
2
  require 'active_support/core_ext/hash/indifferent_access'
2
3
 
3
4
  module MiddlemanHeadless
@@ -187,9 +188,24 @@ module MiddlemanHeadless
187
188
  @data[:name]
188
189
  end
189
190
 
191
+ def content_type
192
+ @data[:content_type]
193
+ end
194
+
195
+ def extension
196
+ MIME::Types[content_type].first.preferred_extension
197
+ end
198
+
190
199
  def url(options={})
191
200
  opts = options.length > 0 ? "?#{options.to_query}" : ''
192
- "#{@interface.options.address}/content/file/#{key}#{opts}"
201
+ addr = "#{@interface.options.address}/content/file/#{key}#{opts}"
202
+
203
+ if @interface.options[:download_assets]
204
+ data = { addr: addr, ext: extension, name: name.parameterize }
205
+ "hldl://#{Base64.urlsafe_encode64(JSON.generate(data))}/"
206
+ else
207
+ addr
208
+ end
193
209
  end
194
210
  end
195
211
 
@@ -3,7 +3,7 @@ $:.push File.expand_path('../lib', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = 'middleman-headless'
6
- s.version = '0.3.5'
6
+ s.version = '0.4.0'
7
7
  s.licenses = ['MIT']
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ['Joël Gähwiler']
@@ -17,5 +17,6 @@ Gem::Specification.new do |s|
17
17
  s.require_paths = ['lib']
18
18
 
19
19
  s.add_runtime_dependency('middleman-core', ['~> 4.1'])
20
- s.add_runtime_dependency('oauth2')
20
+ s.add_runtime_dependency('oauth2', ['~> 1.4'])
21
+ s.add_runtime_dependency('mime-types', ['~> 3.1'])
21
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: middleman-headless
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joël Gähwiler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-21 00:00:00.000000000 Z
11
+ date: 2017-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: middleman-core
@@ -28,16 +28,30 @@ dependencies:
28
28
  name: oauth2
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '1.4'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mime-types
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '0'
54
+ version: '3.1'
41
55
  description:
42
56
  email:
43
57
  - joel@twomanyprojects.com
@@ -49,6 +63,10 @@ files:
49
63
  - Gemfile
50
64
  - LICENSE.md
51
65
  - README.md
66
+ - example/Gemfile
67
+ - example/Gemfile.lock
68
+ - example/config.rb
69
+ - example/source/index.html.erb
52
70
  - lib/middleman-headless.rb
53
71
  - lib/middleman-headless/extension.rb
54
72
  - lib/middleman-headless/interface.rb