prismic.io 1.0.0.preview.5 → 1.0.0.preview.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +8 -2
- data/lib/prismic/api.rb +38 -18
- data/lib/prismic/fragments/image.rb +5 -3
- data/lib/prismic/fragments/structured_text.rb +23 -0
- data/lib/prismic/json_parsers.rb +16 -10
- data/lib/prismic/version.rb +1 -1
- data/lib/prismic.rb +152 -22
- data/spec/fragments_spec.rb +49 -4
- data/spec/json_parsers_spec.rb +11 -3
- data/spec/lesbonneschoses_spec.rb +37 -0
- data/spec/prismic_spec.rb +46 -9
- data/spec/responses_mocks/document.json +4 -0
- data/spec/responses_mocks/fragments.json +4 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48b555e3c575061f3461b396c1739459780a690d
|
4
|
+
data.tar.gz: ec67ac158b329572e7a65e76be77bf5464139c4f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1f78ed016ec55f62dd5538f688f9ad887cfcb6cf7351840ba1ef2f7f85ab040ace75cd2caebb1546c4d43f1b856acea88d7f33b418a440a31e4910a1f299ba9
|
7
|
+
data.tar.gz: b523de93f12d9c831ce127cad7629682d4cd4d481ef785c9eaac098e7e95c4b3f038e1392f6d28b021b7c1e47ab5c91a088f14d3c2c935eb88a45bdd93392499
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -28,9 +28,15 @@ then add in your code:
|
|
28
28
|
require 'prismic'
|
29
29
|
```
|
30
30
|
|
31
|
-
####
|
31
|
+
#### Kit Documentation
|
32
32
|
|
33
|
-
You
|
33
|
+
You should check out [the "Kits and helpers" section of our API documentation](https://developers.prismic.io/documentation/UjBe8bGIJ3EKtgBZ/api-documentation#kits-and-helpers), which sets general information about how our kits work. The Ruby kit is mostly compliant with it, but contains some mild differences:
|
34
|
+
|
35
|
+
* The api object's type is Prismic::API, and the name of the method to retrieve the master ref is gotten by `api.master_ref`.
|
36
|
+
* There's no `ctx` object to pass around; the context is passed in different ways.
|
37
|
+
* From the api object, getting a form is done through the `create_search_form` method; a basic querying therefore looks like this: `api.create_search_form("everything").query("[[:d = at(document.type, \"product\")]]").submit(ref)`
|
38
|
+
* Advice: the `%()` Ruby notation for strings is great for queries, as they may include quotes and/or double-quotes. The above querying is therefore even better this way: `api.create_search_form("everything").query(%([[:d = at(document.type, "product")]])).submit(ref)`
|
39
|
+
* Accessing type-dependent fields from a `document` is done through a `fragments` hash. Printing the HTML version of a field therefore looks like `document.fragments["title_user_friendly"].as_html(link_resolver(ref)).html_safe`.
|
34
40
|
|
35
41
|
#### Use it
|
36
42
|
|
data/lib/prismic/api.rb
CHANGED
@@ -1,33 +1,56 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Prismic
|
3
3
|
class API
|
4
|
-
attr_reader :json, :access_token
|
4
|
+
attr_reader :json, :access_token, :http_client
|
5
5
|
attr_accessor :refs, :bookmarks, :forms, :master, :tags, :types, :oauth
|
6
6
|
|
7
|
-
def initialize(json, access_token
|
7
|
+
def initialize(json, access_token, http_client)
|
8
8
|
@json = json
|
9
9
|
@access_token = access_token
|
10
|
+
@http_client = http_client
|
10
11
|
yield self if block_given?
|
11
12
|
self.master = refs.values && refs.values.map { |ref| ref if ref.master? }.compact.first
|
12
13
|
raise BadPrismicResponseError, "No master Ref found" unless master
|
13
14
|
end
|
14
15
|
|
16
|
+
# Get a bookmark by its name
|
17
|
+
# @api
|
18
|
+
# @param name [String] The bookmark's name
|
19
|
+
#
|
20
|
+
# @return [Hash] The bookmark
|
15
21
|
def bookmark(name)
|
16
22
|
bookmarks[name]
|
17
23
|
end
|
18
24
|
|
25
|
+
# Get a {Ref reference} by its alias
|
26
|
+
# @api
|
27
|
+
# @param name [String] The reference's alias
|
28
|
+
#
|
29
|
+
# @return [Ref] The reference
|
19
30
|
def ref(name)
|
20
31
|
refs[name.downcase]
|
21
32
|
end
|
22
33
|
|
34
|
+
# Returns the master {Ref reference}
|
35
|
+
# @api
|
36
|
+
#
|
37
|
+
# @return [type] [description]
|
23
38
|
def master_ref
|
24
39
|
ref('master')
|
25
40
|
end
|
26
41
|
|
42
|
+
|
27
43
|
def form(name)
|
28
44
|
forms[name]
|
29
45
|
end
|
30
46
|
|
47
|
+
# Returns a {Prismic::SearchForm search form} by its name
|
48
|
+
# @api
|
49
|
+
# @param name [String] The name of the form
|
50
|
+
# @param data [Hash] Default values
|
51
|
+
# @param ref [type] Default {Ref reference}
|
52
|
+
#
|
53
|
+
# @return [SearchForm] The search form
|
31
54
|
def create_search_form(name, data={}, ref={})
|
32
55
|
form = self.form(name)
|
33
56
|
form and form.create_search_form(data, ref)
|
@@ -37,29 +60,26 @@ module Prismic
|
|
37
60
|
@json
|
38
61
|
end
|
39
62
|
|
40
|
-
def self.get(url, access_token=nil)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
res
|
45
|
-
|
46
|
-
if res.code == '200'
|
47
|
-
res
|
48
|
-
else
|
49
|
-
raise PrismicWSConnectionError, res
|
50
|
-
end
|
63
|
+
def self.get(url, access_token=nil, http_client=Prismic::DefaultHTTPClient)
|
64
|
+
data = {}
|
65
|
+
data["access_token"] = access_token if access_token
|
66
|
+
res = http_client.get(url, data, 'Accept' => 'application/json')
|
67
|
+
raise PrismicWSConnectionError, res unless res.code.to_s == '200'
|
68
|
+
res
|
51
69
|
end
|
52
70
|
|
53
|
-
def self.start(url,
|
54
|
-
|
71
|
+
def self.start(url, opts={})
|
72
|
+
http_client = opts[:http_client] || Prismic::DefaultHTTPClient
|
73
|
+
access_token = opts[:access_token]
|
74
|
+
resp = get(url, access_token, http_client)
|
55
75
|
json = JSON.load(resp.body)
|
56
|
-
parse_api_response(json, access_token)
|
76
|
+
parse_api_response(json, access_token, http_client)
|
57
77
|
end
|
58
78
|
|
59
|
-
def self.parse_api_response(data, access_token
|
79
|
+
def self.parse_api_response(data, access_token, http_client)
|
60
80
|
data_forms = data['forms'] || []
|
61
81
|
data_refs = data.fetch('refs'){ raise BadPrismicResponseError, "No refs given" }
|
62
|
-
new(data, access_token) {|api|
|
82
|
+
new(data, access_token, http_client) {|api|
|
63
83
|
api.bookmarks = data['bookmarks']
|
64
84
|
api.forms = Hash[data_forms.map { |k, form|
|
65
85
|
[k, Form.new(
|
@@ -26,12 +26,14 @@ module Prismic
|
|
26
26
|
class ViewDoesNotExistException < Error ; end
|
27
27
|
|
28
28
|
class View
|
29
|
-
attr_accessor :url, :width, :height
|
29
|
+
attr_accessor :url, :width, :height, :alt, :copyright
|
30
30
|
|
31
|
-
def initialize(url, width, height)
|
31
|
+
def initialize(url, width, height, alt, copyright)
|
32
32
|
@url = url
|
33
33
|
@width = width
|
34
34
|
@height = height
|
35
|
+
@alt = alt
|
36
|
+
@copyright = copyright
|
35
37
|
end
|
36
38
|
|
37
39
|
def ratio
|
@@ -39,7 +41,7 @@ module Prismic
|
|
39
41
|
end
|
40
42
|
|
41
43
|
def as_html(link_resolver=nil)
|
42
|
-
%(<img src="#@url" width="#@width" height="#@height" />)
|
44
|
+
%(<img src="#@url" alt="#@alt" width="#@width" height="#@height" />)
|
43
45
|
end
|
44
46
|
|
45
47
|
end
|
@@ -47,6 +47,21 @@ module Prismic
|
|
47
47
|
}.join("\n\n")
|
48
48
|
end
|
49
49
|
|
50
|
+
# Finds the first highest title in a structured text
|
51
|
+
def first_title
|
52
|
+
max_level = 6 # any title with a higher level kicks the current one out
|
53
|
+
title = false
|
54
|
+
@blocks.each do |block|
|
55
|
+
if block.is_a?(Prismic::Fragments::StructuredText::Block::Heading)
|
56
|
+
if block.level < max_level
|
57
|
+
title = block.text
|
58
|
+
max_level = block.level # new maximum
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
title
|
63
|
+
end
|
64
|
+
|
50
65
|
class Span
|
51
66
|
attr_accessor :start, :end
|
52
67
|
|
@@ -184,6 +199,14 @@ module Prismic
|
|
184
199
|
@view.height
|
185
200
|
end
|
186
201
|
|
202
|
+
def alt
|
203
|
+
@view.alt
|
204
|
+
end
|
205
|
+
|
206
|
+
def copyright
|
207
|
+
@view.copyright
|
208
|
+
end
|
209
|
+
|
187
210
|
def as_html(link_resolver)
|
188
211
|
view.as_html(link_resolver)
|
189
212
|
end
|
data/lib/prismic/json_parsers.rb
CHANGED
@@ -63,12 +63,15 @@ module Prismic
|
|
63
63
|
def self.view_parser(json)
|
64
64
|
Prismic::Fragments::Image::View.new(json['url'],
|
65
65
|
json['dimensions']['width'],
|
66
|
-
json['dimensions']['height']
|
66
|
+
json['dimensions']['height'],
|
67
|
+
json['alt'],
|
68
|
+
json['copyright'])
|
67
69
|
end
|
68
70
|
|
69
71
|
main = view_parser(json['value']['main'])
|
70
|
-
views =
|
71
|
-
|
72
|
+
views = {}
|
73
|
+
json['value']['views'].each do |name, view|
|
74
|
+
views[name] = view_parser(view)
|
72
75
|
end
|
73
76
|
|
74
77
|
Prismic::Fragments::Image.new(main, views)
|
@@ -126,7 +129,9 @@ module Prismic
|
|
126
129
|
view = Prismic::Fragments::Image::View.new(
|
127
130
|
block['url'],
|
128
131
|
block['dimensions']['width'],
|
129
|
-
block['dimensions']['height']
|
132
|
+
block['dimensions']['height'],
|
133
|
+
block['alt'],
|
134
|
+
block['copyright']
|
130
135
|
)
|
131
136
|
Prismic::Fragments::StructuredText::Block::Image.new(view)
|
132
137
|
when 'embed'
|
@@ -154,22 +159,23 @@ module Prismic
|
|
154
159
|
end
|
155
160
|
|
156
161
|
def document_parser(json)
|
157
|
-
|
162
|
+
data_json = json['data'].values.first # {"doc_type": data}
|
163
|
+
fragments = Hash[data_json.map { |name, fragment|
|
158
164
|
if fragment.is_a? Array
|
159
165
|
[name, multiple_parser(fragment)]
|
160
166
|
else
|
161
167
|
[name, parsers[fragment['type']].call(fragment)]
|
162
168
|
end
|
163
|
-
|
169
|
+
}]
|
164
170
|
|
165
171
|
Prismic::Document.new(json['id'], json['type'], json['href'], json['tags'],
|
166
172
|
json['slugs'], fragments)
|
167
173
|
end
|
168
174
|
|
169
|
-
def results_parser(
|
170
|
-
|
171
|
-
|
172
|
-
|
175
|
+
def results_parser(result)
|
176
|
+
result = {'results' => result} if result.is_a?(Array)
|
177
|
+
raise FormSearchException, "Error : #{result['error']}" if result['error']
|
178
|
+
result['results'].map do |doc|
|
173
179
|
document_parser(doc)
|
174
180
|
end
|
175
181
|
end
|
data/lib/prismic/version.rb
CHANGED
data/lib/prismic.rb
CHANGED
@@ -11,6 +11,11 @@ module Prismic
|
|
11
11
|
msg ? super(msg) : msg
|
12
12
|
@cause = cause
|
13
13
|
end
|
14
|
+
|
15
|
+
# Return the full trace of the error (including nested errors)
|
16
|
+
# @param e=self Parent error (don't use)
|
17
|
+
#
|
18
|
+
# @return [String] The trace
|
14
19
|
def full_trace(e=self)
|
15
20
|
first, *backtrace = e.backtrace
|
16
21
|
msg = e == self ? "" : "Caused by "
|
@@ -22,21 +27,51 @@ module Prismic
|
|
22
27
|
end
|
23
28
|
end
|
24
29
|
|
25
|
-
|
26
|
-
|
30
|
+
# Return an API instance
|
31
|
+
# @api
|
32
|
+
#
|
33
|
+
# The access token and HTTP client can be provided.
|
34
|
+
#
|
35
|
+
# The HTTP Client must responds to same method than {DefaultHTTPClient}.
|
36
|
+
#
|
37
|
+
# @param url [String] The URL of the prismic.io repository
|
38
|
+
# @param [String] access_token The access token
|
39
|
+
# @param [Hash] opts The options
|
40
|
+
# @option opts [String] :access_token (nil) The access_token
|
41
|
+
# @option opts :http_client (DefaultHTTPClient) The HTTP client to use
|
42
|
+
#
|
43
|
+
# @overload api(url, opts=nil)
|
44
|
+
# Standard use
|
45
|
+
# @overload api(url, access_token)
|
46
|
+
# Provide the access_token (only)
|
47
|
+
#
|
48
|
+
# @return [API] The API instance related to this repository
|
49
|
+
def self.api(url, opts=nil)
|
50
|
+
opts ||= {}
|
51
|
+
opts = {access_token: opts} if opts.is_a?(String)
|
52
|
+
API.start(url, opts)
|
27
53
|
end
|
28
54
|
|
29
55
|
class ApiData
|
30
56
|
attr_accessor :refs, :bookmarks, :types, :tags, :forms
|
31
57
|
end
|
32
58
|
|
59
|
+
|
60
|
+
# A SearchForm represent a Form returned by the prismic.io API.
|
61
|
+
#
|
62
|
+
# These forms depend on the prismic.io repository, and can be fill and send
|
63
|
+
# in the same way than regular HTML forms.
|
64
|
+
#
|
65
|
+
# Get SearchForm instance through the {API#create_search_form} method.
|
33
66
|
class SearchForm
|
34
67
|
attr_accessor :api, :form, :data, :ref
|
35
68
|
|
36
69
|
def initialize(api, form, data={}, ref=nil)
|
37
70
|
@api = api
|
38
71
|
@form = form
|
39
|
-
@data =
|
72
|
+
@data = {}
|
73
|
+
form.default_data.each { |key, value| set(key, value) }
|
74
|
+
data.each { |key, value| set(key, value) }
|
40
75
|
@ref = ref
|
41
76
|
end
|
42
77
|
|
@@ -64,55 +99,81 @@ module Prismic
|
|
64
99
|
form.fields
|
65
100
|
end
|
66
101
|
|
67
|
-
|
102
|
+
# Submit the form
|
103
|
+
# @api
|
104
|
+
#
|
105
|
+
# @note The reference MUST be defined, either by setting it at
|
106
|
+
# {API#create_search_form creation}, by using the {#ref} method or by
|
107
|
+
# providing the ref parameter.
|
108
|
+
#
|
109
|
+
# @param ref [Ref, String] The {Ref reference} to use (if not already defined)
|
110
|
+
#
|
111
|
+
# @return [type] [description]
|
112
|
+
def submit(ref = nil)
|
113
|
+
self.ref(ref) if ref
|
68
114
|
raise NoRefSetException unless @ref
|
69
115
|
|
70
116
|
if form_method == "GET" && enctype == "application/x-www-form-urlencoded"
|
71
|
-
data['ref'] = ref
|
117
|
+
data['ref'] = @ref
|
72
118
|
data['access_token'] = api.access_token if api.access_token
|
73
119
|
data.delete_if { |k, v| v.nil? }
|
74
120
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
121
|
+
response = api.http_client.get(action, data, 'Accept' => 'application/json')
|
122
|
+
|
123
|
+
if response.code.to_s == "200"
|
124
|
+
Prismic::JsonParser.results_parser(JSON.parse(response.body))
|
125
|
+
else
|
126
|
+
body = JSON.parse(response.body) rescue nil
|
127
|
+
error = body.is_a?(Hash) ? body['error'] : response.body
|
128
|
+
raise AuthenticationException, error if response.code.to_s == "401"
|
129
|
+
raise AuthorizationException, error if response.code.to_s == "403"
|
130
|
+
raise RefNotFoundException, error if response.code.to_s == "404"
|
131
|
+
raise FormSearchException, error
|
83
132
|
end
|
84
|
-
|
85
|
-
raise RefNotFoundException, "Ref #{ref} not found" if response.code == "404"
|
86
|
-
|
87
|
-
raise FormSearchException, "Error : #{response.body}" if response.code != "200"
|
88
|
-
|
89
|
-
Prismic::JsonParser.results_parser(JSON.parse(response.body))
|
90
133
|
else
|
91
134
|
raise UnsupportedFormKind, "Unsupported kind of form: #{form_method} / #{enctype}"
|
92
135
|
end
|
93
136
|
end
|
94
137
|
|
138
|
+
# Specify a query for this form
|
139
|
+
# @api
|
140
|
+
# @param query [String] The query
|
141
|
+
#
|
142
|
+
# @return [SearchForm] self
|
95
143
|
def query(query)
|
96
144
|
set('q', query)
|
97
|
-
self
|
98
145
|
end
|
99
146
|
|
147
|
+
# Specify a parameter for this form
|
148
|
+
# @param field_name [String] The parameter's name
|
149
|
+
# @param value [String] The parameter's value
|
150
|
+
#
|
151
|
+
# @return [SearchForm] self
|
100
152
|
def set(field_name, value)
|
101
153
|
field = @form.fields[field_name]
|
102
|
-
if field.repeatable?
|
154
|
+
if field && field.repeatable?
|
103
155
|
data[field_name] = [] unless data.include? field_name
|
104
156
|
data[field_name] << value
|
105
157
|
else
|
106
158
|
data[field_name] = value
|
107
159
|
end
|
160
|
+
self
|
108
161
|
end
|
109
162
|
|
163
|
+
# Set the {Ref reference} to use
|
164
|
+
# @api
|
165
|
+
# @param ref [Ref, String] The {Ref reference} to use
|
166
|
+
#
|
167
|
+
# @return [SearchForm] self
|
110
168
|
def ref(ref)
|
111
|
-
@ref = ref
|
169
|
+
@ref = ref.is_a?(Ref) ? ref.ref : ref
|
170
|
+
self
|
112
171
|
end
|
113
172
|
|
114
173
|
class NoRefSetException < Error ; end
|
115
174
|
class UnsupportedFormKind < Error ; end
|
175
|
+
class AuthorizationException < Error ; end
|
176
|
+
class AuthenticationException < Error ; end
|
116
177
|
class RefNotFoundException < Error ; end
|
117
178
|
class FormSearchException < Error ; end
|
118
179
|
end
|
@@ -151,6 +212,27 @@ module Prismic
|
|
151
212
|
}.join("\n")
|
152
213
|
end
|
153
214
|
|
215
|
+
# Finds the first highest title in a document
|
216
|
+
#
|
217
|
+
# It is impossible to reuse the StructuredText.first_title method, since we need to test the highest title across the whole document
|
218
|
+
def first_title
|
219
|
+
title = false
|
220
|
+
max_level = 6 # any title with a higher level kicks the current one out
|
221
|
+
@fragments.each do |_, fragment|
|
222
|
+
if fragment.is_a? Prismic::Fragments::StructuredText
|
223
|
+
fragment.blocks.each do |block|
|
224
|
+
if block.is_a?(Prismic::Fragments::StructuredText::Block::Heading)
|
225
|
+
if block.level < max_level
|
226
|
+
title = block.text
|
227
|
+
max_level = block.level # new maximum
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
title
|
234
|
+
end
|
235
|
+
|
154
236
|
private
|
155
237
|
|
156
238
|
def parse_fragments(fragments)
|
@@ -158,6 +240,12 @@ module Prismic
|
|
158
240
|
end
|
159
241
|
end
|
160
242
|
|
243
|
+
|
244
|
+
# Represent a prismic.io reference, a fix point in time.
|
245
|
+
#
|
246
|
+
# The references must be provided when accessing to any prismic.io resource
|
247
|
+
# (except /api) and allow to assert that the URL you use will always
|
248
|
+
# returns the same results.
|
161
249
|
class Ref
|
162
250
|
attr_accessor :ref, :label, :is_master, :scheduled_at
|
163
251
|
|
@@ -182,9 +270,51 @@ module Prismic
|
|
182
270
|
end
|
183
271
|
end
|
184
272
|
|
273
|
+
# Default HTTP client implementation, using the standard {Net::HTTP} library.
|
274
|
+
module DefaultHTTPClient
|
275
|
+
class << self
|
276
|
+
# Performs a GET call and returns the result
|
277
|
+
#
|
278
|
+
# The result must respond to
|
279
|
+
# - code: returns the response's HTTP status code (as number or String)
|
280
|
+
# - body: returns the response's body (as String)
|
281
|
+
def get(uri, data={}, headers={})
|
282
|
+
uri = URI(uri) if uri.is_a?(String)
|
283
|
+
uri.query = url_encode(data)
|
284
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
285
|
+
http.use_ssl = uri.scheme =~ /https/i
|
286
|
+
http.get(uri.request_uri, headers)
|
287
|
+
end
|
288
|
+
|
289
|
+
def url_encode(data)
|
290
|
+
# Can't use URI.encode_www_form (doesn't support multi-values in 1.9.2)
|
291
|
+
encode = ->(k, v){ "#{k}=#{CGI::escape(v)}" }
|
292
|
+
data.map { |k, vs|
|
293
|
+
if vs.is_a?(Array)
|
294
|
+
vs.map{|v| encode.(k, v) }.join("&")
|
295
|
+
else
|
296
|
+
encode.(k, vs)
|
297
|
+
end
|
298
|
+
}.join("&")
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
# Build a {LinkResolver} instance
|
304
|
+
# @api
|
305
|
+
#
|
306
|
+
# The {LinkResolver} will help to build URL specific to an application, based
|
307
|
+
# on a generic prismic.io's {Fragments::DocumentLink Document link}.
|
308
|
+
#
|
309
|
+
# @param ref [Ref] The ref to use
|
310
|
+
# @yieldparam doc_link [Fragments::DocumentLink] A DocumentLink instance
|
311
|
+
# @yieldreturn [String] The application specific URL of the given document
|
312
|
+
#
|
313
|
+
# @return [LinkResolver] [description]
|
185
314
|
def self.link_resolver(ref, &blk)
|
186
315
|
LinkResolver.new(ref, &blk)
|
187
316
|
end
|
317
|
+
|
188
318
|
end
|
189
319
|
|
190
320
|
require 'prismic/api'
|
data/spec/fragments_spec.rb
CHANGED
@@ -275,7 +275,7 @@ describe 'Image::View' do
|
|
275
275
|
@url = 'my_url'
|
276
276
|
@width = 10
|
277
277
|
@height = 2
|
278
|
-
@view = Prismic::Fragments::Image::View.new(@url, @width, @height)
|
278
|
+
@view = Prismic::Fragments::Image::View.new(@url, @width, @height, "", "")
|
279
279
|
end
|
280
280
|
|
281
281
|
describe 'ratio' do
|
@@ -300,13 +300,23 @@ describe 'Image::View' do
|
|
300
300
|
it "returns an element whose `height` attribute equals the height" do
|
301
301
|
Nokogiri::XML(@view.as_html).child.attribute('height').value.should == @height.to_s
|
302
302
|
end
|
303
|
+
|
304
|
+
it "if set, returns an element whose `alt` attribute equals the alt" do
|
305
|
+
@alt = "Alternative text"
|
306
|
+
@view.alt = @alt
|
307
|
+
Nokogiri::XML(@view.as_html).child.attribute('alt').value.should == @alt
|
308
|
+
end
|
309
|
+
|
310
|
+
# it "if not set, alt attribute is absent" do
|
311
|
+
# Nokogiri::XML(@view.as_html).child.attribute('alt').should == nil
|
312
|
+
# end
|
303
313
|
end
|
304
314
|
end
|
305
315
|
|
306
316
|
describe 'Image' do
|
307
317
|
before do
|
308
|
-
@main_view = Prismic::Fragments::Image::View.new('my_url', 10, 10)
|
309
|
-
@another_view = Prismic::Fragments::Image::View.new('my_url2', 20, 20)
|
318
|
+
@main_view = Prismic::Fragments::Image::View.new('my_url', 10, 10, "Alternative", "CC-BY")
|
319
|
+
@another_view = Prismic::Fragments::Image::View.new('my_url2', 20, 20, "", "")
|
310
320
|
@image = Prismic::Fragments::Image.new(@main_view, { 'another_view' => @another_view })
|
311
321
|
end
|
312
322
|
|
@@ -330,10 +340,33 @@ describe 'Image' do
|
|
330
340
|
Nokogiri::XML(@image.as_html).child.attribute('src').value.should == Nokogiri::XML(@main_view.as_html).child.attribute('src').value
|
331
341
|
Nokogiri::XML(@image.as_html).child.attribute('width').value.should == Nokogiri::XML(@main_view.as_html).child.attribute('width').value
|
332
342
|
Nokogiri::XML(@image.as_html).child.attribute('height').value.should == Nokogiri::XML(@main_view.as_html).child.attribute('height').value
|
343
|
+
Nokogiri::XML(@image.as_html).child.attribute('alt').value.should == Nokogiri::XML(@main_view.as_html).child.attribute('alt').value
|
333
344
|
end
|
334
345
|
end
|
335
346
|
end
|
336
347
|
|
348
|
+
describe 'StructuredText' do
|
349
|
+
before do
|
350
|
+
@structuredtext = Prismic::Fragments::StructuredText.new([
|
351
|
+
Prismic::Fragments::StructuredText::Block::Text.new("This is not a title", []),
|
352
|
+
Prismic::Fragments::StructuredText::Block::Heading.new("This is a title, but not the highest", [], 3),
|
353
|
+
Prismic::Fragments::StructuredText::Block::Heading.new("Document's title", [], 1),
|
354
|
+
Prismic::Fragments::StructuredText::Block::Text.new("This is not a title", [])
|
355
|
+
])
|
356
|
+
end
|
357
|
+
it 'finds the text of the first block' do
|
358
|
+
@structuredtext.blocks[0].text.should == "This is not a title"
|
359
|
+
end
|
360
|
+
it 'finds the right title if exists' do
|
361
|
+
@structuredtext.first_title.should == "Document's title"
|
362
|
+
end
|
363
|
+
it 'returns false if no title' do
|
364
|
+
@structuredtext.blocks[1] = Prismic::Fragments::StructuredText::Block::Text.new("This is not a title either", [])
|
365
|
+
@structuredtext.blocks[2] = Prismic::Fragments::StructuredText::Block::Text.new("And this is not a title either", [])
|
366
|
+
@structuredtext.first_title.should == false
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
337
370
|
describe 'StructuredText::Heading' do
|
338
371
|
before do
|
339
372
|
@text = "This is a simple test."
|
@@ -393,7 +426,7 @@ end
|
|
393
426
|
|
394
427
|
describe 'StructuredText::Image' do
|
395
428
|
before do
|
396
|
-
@view = Prismic::Fragments::Image::View.new('my_url', 10, 10)
|
429
|
+
@view = Prismic::Fragments::Image::View.new('my_url', 10, 10, "Aternative", "CC-BY")
|
397
430
|
@image = Prismic::Fragments::StructuredText::Block::Image.new(@view)
|
398
431
|
end
|
399
432
|
|
@@ -414,6 +447,18 @@ describe 'StructuredText::Image' do
|
|
414
447
|
@image.height.should == @view.height
|
415
448
|
end
|
416
449
|
end
|
450
|
+
|
451
|
+
describe 'alt' do
|
452
|
+
it "returns the view's alt" do
|
453
|
+
@image.alt.should == @view.alt
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
457
|
+
describe 'copyright' do
|
458
|
+
it "returns the view's copyright" do
|
459
|
+
@image.copyright.should == @view.copyright
|
460
|
+
end
|
461
|
+
end
|
417
462
|
end
|
418
463
|
|
419
464
|
describe 'StructuredText::Hyperlink' do
|
data/spec/json_parsers_spec.rb
CHANGED
@@ -141,6 +141,8 @@ describe 'image_parser' do
|
|
141
141
|
"value": {
|
142
142
|
"main": {
|
143
143
|
"url": "url1",
|
144
|
+
"alt" : "Alternative",
|
145
|
+
"copyright" : "CC-BY",
|
144
146
|
"dimensions": {
|
145
147
|
"width": 500,
|
146
148
|
"height": 500
|
@@ -149,6 +151,8 @@ describe 'image_parser' do
|
|
149
151
|
"views": {
|
150
152
|
"icon": {
|
151
153
|
"url": "url2",
|
154
|
+
"alt" : "Alternative2",
|
155
|
+
"copyright" : "CC-0",
|
152
156
|
"dimensions": {
|
153
157
|
"width": 250,
|
154
158
|
"height": 250
|
@@ -166,9 +170,13 @@ json
|
|
166
170
|
image.main.url.should == "url1"
|
167
171
|
image.main.width.should == 500
|
168
172
|
image.main.height.should == 500
|
169
|
-
image.
|
170
|
-
image.
|
171
|
-
image.views[
|
173
|
+
image.main.alt.should == "Alternative"
|
174
|
+
image.main.copyright.should == "CC-BY"
|
175
|
+
image.views['icon'].url.should == "url2"
|
176
|
+
image.views['icon'].width.should == 250
|
177
|
+
image.views['icon'].height.should == 250
|
178
|
+
image.views['icon'].alt.should == "Alternative2"
|
179
|
+
image.views['icon'].copyright.should == "CC-0"
|
172
180
|
end
|
173
181
|
end
|
174
182
|
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe 'LesBonnesChoses' do
|
5
|
+
before do
|
6
|
+
@api = Prismic.api("https://lesbonneschoses.prismic.io/api", nil)
|
7
|
+
@master_ref = @api.master_ref
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '/api' do
|
11
|
+
it "API works" do
|
12
|
+
@api.should_not be_nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'query' do
|
17
|
+
it "queries everything and returns 20 documents" do
|
18
|
+
@api.create_search_form("everything").submit(@master_ref).size.should == 20
|
19
|
+
end
|
20
|
+
|
21
|
+
it "queries macarons (using a predicate) and returns 7 documents" do
|
22
|
+
@api.create_search_form("everything")
|
23
|
+
.query(%([[:d = any(document.tags, ["Macaron"])]]))
|
24
|
+
.submit(@master_ref).size.should == 7
|
25
|
+
end
|
26
|
+
|
27
|
+
it "queries macarons (using a form) and returns 7 documents" do
|
28
|
+
@api.create_search_form("macarons").submit(@master_ref).size.should == 7
|
29
|
+
end
|
30
|
+
|
31
|
+
it "queries macarons or cupcakes (using a form + a predicate) and returns 11 documents" do
|
32
|
+
@api.create_search_form("products")
|
33
|
+
.query(%([[:d = any(document.tags, ["Cupcake", "Macaron"])]]))
|
34
|
+
.submit(@master_ref).size.should == 11
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/spec/prismic_spec.rb
CHANGED
@@ -5,7 +5,7 @@ describe 'Api' do
|
|
5
5
|
before do
|
6
6
|
json_representation = '{"foo": "bar"}'
|
7
7
|
@oauth_initiate_url = "https://lesbonneschoses.prismic.io/auth"
|
8
|
-
@api = Prismic::API.new(json_representation){|api|
|
8
|
+
@api = Prismic::API.new(json_representation, nil, Prismic::DefaultHTTPClient){|api|
|
9
9
|
api.bookmarks = {}
|
10
10
|
api.tags = {}
|
11
11
|
api.types = {}
|
@@ -17,7 +17,10 @@ describe 'Api' do
|
|
17
17
|
}
|
18
18
|
api.forms = {
|
19
19
|
'form1' => Prismic::Form.new(@api, 'form1', {}, nil, nil, nil, nil),
|
20
|
-
'form2' => Prismic::Form.new(@api, 'form2', {
|
20
|
+
'form2' => Prismic::Form.new(@api, 'form2', {
|
21
|
+
'q' => Prismic::Field.new('string', '[[any(document.type, [\"product\"])]]', true),
|
22
|
+
'param1' => Prismic::Field.new('string', 'value1', false),
|
23
|
+
}, nil, nil, nil, nil),
|
21
24
|
'form3' => Prismic::Form.new(@api, 'form3', {}, nil, nil, nil, nil),
|
22
25
|
'form4' => Prismic::Form.new(@api, 'form4', {}, nil, nil, nil, nil),
|
23
26
|
}
|
@@ -54,6 +57,14 @@ describe 'Api' do
|
|
54
57
|
@form = @api.create_search_form('form2')
|
55
58
|
@form.form.name.should == 'form2'
|
56
59
|
end
|
60
|
+
it "store default value as simple value when the field is not repeatable" do
|
61
|
+
@form = @api.create_search_form('form2')
|
62
|
+
@form.data['param1'].should == 'value1'
|
63
|
+
end
|
64
|
+
it "store default value as array when the field is repeatable" do
|
65
|
+
@form = @api.create_search_form('form2')
|
66
|
+
@form.data['q'].should == ['[[any(document.type, [\"product\"])]]']
|
67
|
+
end
|
57
68
|
end
|
58
69
|
|
59
70
|
describe 'forms' do
|
@@ -72,20 +83,18 @@ describe 'Api' do
|
|
72
83
|
before do
|
73
84
|
@data = File.read("#{File.dirname(__FILE__)}/responses_mocks/api.json")
|
74
85
|
@json = JSON.parse(@data)
|
75
|
-
@parsed = Prismic::API.parse_api_response(@json)
|
86
|
+
@parsed = Prismic::API.parse_api_response(@json, nil, Prismic::DefaultHTTPClient)
|
76
87
|
end
|
77
88
|
|
78
89
|
it "does not allow to be created without master Ref" do
|
79
90
|
expect {
|
80
|
-
Prismic::API.parse_api_response({
|
81
|
-
"refs" => [],
|
82
|
-
})
|
91
|
+
Prismic::API.parse_api_response({"refs" => []}, nil, Prismic::DefaultHTTPClient)
|
83
92
|
}.to raise_error(Prismic::API::BadPrismicResponseError, "No master Ref found")
|
84
93
|
end
|
85
94
|
|
86
95
|
it "does not allow to be created without any Ref" do
|
87
96
|
expect {
|
88
|
-
Prismic::API.parse_api_response({})
|
97
|
+
Prismic::API.parse_api_response({}, nil, Prismic::DefaultHTTPClient)
|
89
98
|
}.to raise_error(Prismic::API::BadPrismicResponseError, "No refs given")
|
90
99
|
end
|
91
100
|
|
@@ -225,6 +234,34 @@ describe 'Document' do
|
|
225
234
|
}
|
226
235
|
end
|
227
236
|
|
237
|
+
describe 'first_title' do
|
238
|
+
it "returns the right title" do
|
239
|
+
@document.fragments['field3'] = Prismic::Fragments::StructuredText.new([
|
240
|
+
Prismic::Fragments::StructuredText::Block::Text.new("This is not a title", []),
|
241
|
+
Prismic::Fragments::StructuredText::Block::Heading.new("This is a title, but not the highest", [], 3),
|
242
|
+
Prismic::Fragments::StructuredText::Block::Heading.new("This is the highest title of the fragment, but not the document", [], 2),
|
243
|
+
Prismic::Fragments::StructuredText::Block::Text.new("This is not a title", [])
|
244
|
+
])
|
245
|
+
@document.fragments['field4'] = Prismic::Fragments::StructuredText.new([
|
246
|
+
Prismic::Fragments::StructuredText::Block::Text.new("This is not a title", []),
|
247
|
+
Prismic::Fragments::StructuredText::Block::Heading.new("This is a title, but not the highest", [], 3),
|
248
|
+
Prismic::Fragments::StructuredText::Block::Heading.new("This is the highest title of the document", [], 1),
|
249
|
+
Prismic::Fragments::StructuredText::Block::Text.new("This is not a title", [])
|
250
|
+
])
|
251
|
+
@document.fragments['field5'] = Prismic::Fragments::StructuredText.new([
|
252
|
+
Prismic::Fragments::StructuredText::Block::Text.new("This is not a title", []),
|
253
|
+
Prismic::Fragments::StructuredText::Block::Heading.new("This is a title, but not the highest", [], 3),
|
254
|
+
Prismic::Fragments::StructuredText::Block::Heading.new("This is the highest title of the fragment, but not the document", [], 2),
|
255
|
+
Prismic::Fragments::StructuredText::Block::Text.new("This is not a title", [])
|
256
|
+
])
|
257
|
+
@document.first_title.should == "This is the highest title of the document"
|
258
|
+
end
|
259
|
+
|
260
|
+
it "returns false if no title" do
|
261
|
+
@document.first_title.should == false
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
228
265
|
describe 'slug' do
|
229
266
|
it "returns the first slug if found" do
|
230
267
|
@document.slug.should == 'my-slug'
|
@@ -253,7 +290,7 @@ end
|
|
253
290
|
|
254
291
|
describe 'SearchForm' do
|
255
292
|
before do
|
256
|
-
@field = Prismic::Field.new('String',
|
293
|
+
@field = Prismic::Field.new('String', 'foo', true)
|
257
294
|
@api = nil
|
258
295
|
end
|
259
296
|
|
@@ -265,7 +302,7 @@ describe 'SearchForm' do
|
|
265
302
|
describe 'set() for queries' do
|
266
303
|
|
267
304
|
it "append value for repeatable fields" do
|
268
|
-
@field = Prismic::Field.new('String',
|
305
|
+
@field = Prismic::Field.new('String', 'foo', true)
|
269
306
|
@form = create_form('q' => @field)
|
270
307
|
@form.set('q', 'bar')
|
271
308
|
@form.data.should == { 'q' => ['foo', 'bar'] } # test the 1st call
|
@@ -56,6 +56,8 @@
|
|
56
56
|
"value": {
|
57
57
|
"main": {
|
58
58
|
"url": "https://wroomio.s3.amazonaws.com/lesbonneschoses/0417110ebf2dc34a3e8b7b28ee4e06ac82473b70.png",
|
59
|
+
"alt" : "Alternative text to image",
|
60
|
+
"copyright" : "CC-BY",
|
59
61
|
"dimensions": {
|
60
62
|
"width": 500,
|
61
63
|
"height": 500
|
@@ -64,6 +66,8 @@
|
|
64
66
|
"views": {
|
65
67
|
"icon": {
|
66
68
|
"url": "https://wroomio.s3.amazonaws.com/lesbonneschoses/babdc3421037f9af77720d8f5dcf1b84c912c6ba.png",
|
69
|
+
"alt" : "Alternative text to view",
|
70
|
+
"copyright" : "CC-BY",
|
67
71
|
"dimensions": {
|
68
72
|
"width": 250,
|
69
73
|
"height": 250
|
@@ -60,6 +60,8 @@
|
|
60
60
|
"value": {
|
61
61
|
"main": {
|
62
62
|
"url": "https://wroomio.s3.amazonaws.com/lesbonneschoses/0417110ebf2dc34a3e8b7b28ee4e06ac82473b70.png",
|
63
|
+
"alt" : "Alternative text to image",
|
64
|
+
"copyright" : "CC-BY",
|
63
65
|
"dimensions": {
|
64
66
|
"width": 500,
|
65
67
|
"height": 500
|
@@ -68,6 +70,8 @@
|
|
68
70
|
"views": {
|
69
71
|
"icon": {
|
70
72
|
"url": "https://wroomio.s3.amazonaws.com/lesbonneschoses/babdc3421037f9af77720d8f5dcf1b84c912c6ba.png",
|
73
|
+
"alt" : "Alternative text to view",
|
74
|
+
"copyright" : "CC-BY",
|
71
75
|
"dimensions": {
|
72
76
|
"width": 250,
|
73
77
|
"height": 250
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prismic.io
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.preview.
|
4
|
+
version: 1.0.0.preview.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Étienne Vallette d'Osia
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-11-
|
12
|
+
date: 2013-11-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -100,6 +100,7 @@ files:
|
|
100
100
|
- prismic.gemspec
|
101
101
|
- spec/fragments_spec.rb
|
102
102
|
- spec/json_parsers_spec.rb
|
103
|
+
- spec/lesbonneschoses_spec.rb
|
103
104
|
- spec/prismic_spec.rb
|
104
105
|
- spec/responses_mocks/api.json
|
105
106
|
- spec/responses_mocks/document.json
|
@@ -134,6 +135,7 @@ summary: Prismic.io development kit
|
|
134
135
|
test_files:
|
135
136
|
- spec/fragments_spec.rb
|
136
137
|
- spec/json_parsers_spec.rb
|
138
|
+
- spec/lesbonneschoses_spec.rb
|
137
139
|
- spec/prismic_spec.rb
|
138
140
|
- spec/responses_mocks/api.json
|
139
141
|
- spec/responses_mocks/document.json
|