prismic.io 1.0.0.preview.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +37 -0
- data/README.md +43 -0
- data/Rakefile +1 -0
- data/lib/prismic.rb +167 -0
- data/lib/prismic/api.rb +94 -0
- data/lib/prismic/form.rb +19 -0
- data/lib/prismic/fragments.rb +11 -0
- data/lib/prismic/fragments/block.rb +4 -0
- data/lib/prismic/fragments/color.rb +31 -0
- data/lib/prismic/fragments/date.rb +15 -0
- data/lib/prismic/fragments/embed.rb +23 -0
- data/lib/prismic/fragments/image.rb +47 -0
- data/lib/prismic/fragments/link.rb +47 -0
- data/lib/prismic/fragments/multiple.rb +29 -0
- data/lib/prismic/fragments/number.rb +19 -0
- data/lib/prismic/fragments/select.rb +15 -0
- data/lib/prismic/fragments/structured_text.rb +200 -0
- data/lib/prismic/fragments/text.rb +15 -0
- data/lib/prismic/json_parsers.rb +174 -0
- data/lib/prismic/version.rb +5 -0
- data/prismic.gemspec +26 -0
- data/spec/fragments_spec.rb +372 -0
- data/spec/json_parsers_spec.rb +287 -0
- data/spec/prismic_spec.rb +237 -0
- data/spec/responses_mocks/api.json +192 -0
- data/spec/responses_mocks/document.json +170 -0
- data/spec/responses_mocks/fragments.json +176 -0
- data/spec/responses_mocks/structured_text_heading.json +12 -0
- data/spec/responses_mocks/structured_text_paragraph.json +30 -0
- data/spec/spec_helper.rb +10 -0
- metadata +157 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f251fe260baae8f6d9759bdb71e67cc2754ccd2d
|
4
|
+
data.tar.gz: e7e13a4e8f6c225633f7134d47a42457a8e65e4a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9ba102393aba6870ef0992fde91d090331368103906674ba94f75f1202ab8ed5729ce67153721a6874b52987a3e9bb1a94de88424d523c1ca7dc9959544da949
|
7
|
+
data.tar.gz: e42b10fe090f8adfca57267f456896da72e4b6474743f6acceaf3ff1bae4ac03094783d11e472dfe6d11186ab05b0c4f884a3a22856780205b64151f8dee4c30
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
Prismic (1.0.0.preview.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.2.4)
|
10
|
+
mini_portile (0.5.1)
|
11
|
+
multi_json (1.8.0)
|
12
|
+
nokogiri (1.6.0)
|
13
|
+
mini_portile (~> 0.5.0)
|
14
|
+
rspec (2.14.1)
|
15
|
+
rspec-core (~> 2.14.0)
|
16
|
+
rspec-expectations (~> 2.14.0)
|
17
|
+
rspec-mocks (~> 2.14.0)
|
18
|
+
rspec-core (2.14.4)
|
19
|
+
rspec-expectations (2.14.0)
|
20
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
21
|
+
rspec-mocks (2.14.2)
|
22
|
+
simplecov (0.7.1)
|
23
|
+
multi_json (~> 1.0)
|
24
|
+
simplecov-html (~> 0.7.1)
|
25
|
+
simplecov-html (0.7.1)
|
26
|
+
yajl-ruby (1.1.0)
|
27
|
+
|
28
|
+
PLATFORMS
|
29
|
+
ruby
|
30
|
+
|
31
|
+
DEPENDENCIES
|
32
|
+
Prismic!
|
33
|
+
bundler (~> 1.3)
|
34
|
+
nokogiri (~> 1.6)
|
35
|
+
rspec (~> 2.14)
|
36
|
+
simplecov (~> 0.7)
|
37
|
+
yajl-ruby (~> 1.1)
|
data/README.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
## Ruby development kit for prismic.io
|
2
|
+
|
3
|
+
### Getting Started
|
4
|
+
|
5
|
+
#### Install using bundler
|
6
|
+
|
7
|
+
You can this line in your Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'prismic.io', require: 'prismic'
|
11
|
+
```
|
12
|
+
|
13
|
+
#### Install manually
|
14
|
+
|
15
|
+
Run in shell:
|
16
|
+
|
17
|
+
```sh
|
18
|
+
gem install prismic.io
|
19
|
+
```
|
20
|
+
|
21
|
+
then add in your code:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
require 'prismic'
|
25
|
+
```
|
26
|
+
|
27
|
+
#### API Documentation
|
28
|
+
|
29
|
+
You can browse the [API Documentation](http://prismicio.github.io/ruby-kit/).
|
30
|
+
|
31
|
+
#### Use it
|
32
|
+
|
33
|
+
You can look at the [rails starter](https://github.com/prismicio/ruby-rails-starter) project to see how to use it :-)
|
34
|
+
|
35
|
+
### Licence
|
36
|
+
|
37
|
+
This software is licensed under the Apache 2 license, quoted below.
|
38
|
+
|
39
|
+
Copyright 2013 Zengularity (http://www.zengularity.com).
|
40
|
+
|
41
|
+
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this project except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
42
|
+
|
43
|
+
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/prismic.rb
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
module Prismic
|
5
|
+
|
6
|
+
# These exception can contains an error cause and is able to show them
|
7
|
+
class Error < Exception
|
8
|
+
attr_reader :cause
|
9
|
+
def initialize(msg=nil, cause=nil)
|
10
|
+
msg ? super(msg) : msg
|
11
|
+
@cause = cause
|
12
|
+
end
|
13
|
+
def full_trace(e=self)
|
14
|
+
first, *backtrace = e.backtrace
|
15
|
+
msg = e == self ? "" : "Caused by "
|
16
|
+
msg += "#{first}: #{e.message} (#{e.class})"
|
17
|
+
stack = backtrace.map{|s| "\tfrom #{s}" }.join("\n")
|
18
|
+
cause = e.respond_to?(:cause) ? e.cause : nil
|
19
|
+
cause_stack = cause ? full_trace(cause) : nil
|
20
|
+
[msg, stack, cause_stack].compact.join("\n")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.api(*args)
|
25
|
+
API.start(*args)
|
26
|
+
end
|
27
|
+
|
28
|
+
class ApiData
|
29
|
+
attr_accessor :refs, :bookmarks, :types, :tags, :forms
|
30
|
+
end
|
31
|
+
|
32
|
+
class SearchForm
|
33
|
+
attr_accessor :form, :data
|
34
|
+
|
35
|
+
def initialize(form, data=form.default_data)
|
36
|
+
@form = form
|
37
|
+
@data = data
|
38
|
+
end
|
39
|
+
|
40
|
+
def name
|
41
|
+
form.name
|
42
|
+
end
|
43
|
+
|
44
|
+
def form_method
|
45
|
+
form.form_method
|
46
|
+
end
|
47
|
+
|
48
|
+
def rel
|
49
|
+
form.rel
|
50
|
+
end
|
51
|
+
|
52
|
+
def enctype
|
53
|
+
form.enctype
|
54
|
+
end
|
55
|
+
|
56
|
+
def action
|
57
|
+
form.action
|
58
|
+
end
|
59
|
+
|
60
|
+
def fields
|
61
|
+
form.fields
|
62
|
+
end
|
63
|
+
|
64
|
+
def submit(ref)
|
65
|
+
if form_method == "GET" && enctype == "application/x-www-form-urlencoded"
|
66
|
+
data['ref'] = ref
|
67
|
+
data.delete_if { |k, v| !v }
|
68
|
+
|
69
|
+
uri = URI(action)
|
70
|
+
uri.query = URI.encode_www_form(data)
|
71
|
+
|
72
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
73
|
+
request.add_field('Accept', 'application/json')
|
74
|
+
|
75
|
+
response = Net::HTTP.new(uri.host, uri.port).start do |http|
|
76
|
+
http.request(request)
|
77
|
+
end
|
78
|
+
|
79
|
+
raise RefNotFoundException, "Ref #{ref} not found" if response.code == "404"
|
80
|
+
|
81
|
+
JSON.parse(response.body).map do |doc|
|
82
|
+
Prismic::JsonParser.document_parser(doc)
|
83
|
+
end
|
84
|
+
else
|
85
|
+
raise UnsupportedFormKind, "Unsupported kind of form: #{form_method} / #{enctype}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def query(query)
|
90
|
+
strip_brakets = Proc.new {|str| str.strip[1, str.strip.length - 2]}
|
91
|
+
|
92
|
+
previous_query = (not form.fields['q'].nil?) ? form.fields['q'].default.to_s : ''
|
93
|
+
data['q'] = "[#{strip_brakets.call(previous_query)}#{strip_brakets.call(query)}]"
|
94
|
+
self
|
95
|
+
end
|
96
|
+
|
97
|
+
class UnsupportedFormKind < Error ; end
|
98
|
+
class RefNotFoundException < Error ; end
|
99
|
+
end
|
100
|
+
|
101
|
+
class Field
|
102
|
+
attr_accessor :field_type, :default
|
103
|
+
|
104
|
+
def initialize(field_type, default)
|
105
|
+
@field_type = field_type
|
106
|
+
@default = default
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
class Document
|
112
|
+
attr_accessor :id, :type, :href, :tags, :slugs, :fragments
|
113
|
+
|
114
|
+
def initialize(id, type, href, tags, slugs, fragments)
|
115
|
+
@id = id
|
116
|
+
@type = type
|
117
|
+
@href = href
|
118
|
+
@tags = tags
|
119
|
+
@slugs = slugs
|
120
|
+
@fragments = (fragments.is_a? Hash) ? parse_fragments(fragments) : fragments
|
121
|
+
end
|
122
|
+
|
123
|
+
def slug
|
124
|
+
slugs.empty? ? '-' : slugs.first
|
125
|
+
end
|
126
|
+
|
127
|
+
def as_html(link_resolver)
|
128
|
+
fragments.map { |field, fragment|
|
129
|
+
%(<section data-field="#{field}">#{fragment.as_html(link_resolver)}</section>)
|
130
|
+
}.join("\n")
|
131
|
+
end
|
132
|
+
|
133
|
+
private
|
134
|
+
|
135
|
+
def parse_fragments(fragments)
|
136
|
+
fragments
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
class Ref
|
141
|
+
attr_accessor :ref, :label, :is_master, :scheduledAt
|
142
|
+
|
143
|
+
def initialize(ref, label, is_master = false)
|
144
|
+
@ref = ref
|
145
|
+
@label = label.downcase
|
146
|
+
@is_master = is_master
|
147
|
+
end
|
148
|
+
|
149
|
+
alias :master? :is_master
|
150
|
+
end
|
151
|
+
|
152
|
+
class LinkResolver
|
153
|
+
attr_reader :ref
|
154
|
+
def initialize(ref, &blk)
|
155
|
+
@ref = ref
|
156
|
+
@blk = blk
|
157
|
+
end
|
158
|
+
def link_to(doc_link)
|
159
|
+
@blk.call(doc_link)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
require 'prismic/api'
|
165
|
+
require 'prismic/form'
|
166
|
+
require 'prismic/fragments'
|
167
|
+
require 'prismic/json_parsers'
|
data/lib/prismic/api.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
module Prismic
|
2
|
+
class API
|
3
|
+
attr_accessor :refs, :bookmarks, :forms, :master, :tags, :types
|
4
|
+
|
5
|
+
def initialize(args)
|
6
|
+
@json = args.fetch(:json)
|
7
|
+
@bookmarks = args.fetch(:bookmarks)
|
8
|
+
@refs = args.fetch(:refs)
|
9
|
+
@forms = args.fetch(:forms)
|
10
|
+
@tags = args.fetch(:tags)
|
11
|
+
@types = args.fetch(:types)
|
12
|
+
self.master = refs.values.map { |ref| ref if ref.master? }.compact.first
|
13
|
+
raise BadPrismicResponseError, "No master Ref found" unless master
|
14
|
+
end
|
15
|
+
|
16
|
+
def bookmark(name)
|
17
|
+
bookmarks[name]
|
18
|
+
end
|
19
|
+
|
20
|
+
def ref(name)
|
21
|
+
refs[name]
|
22
|
+
end
|
23
|
+
|
24
|
+
def ref_id_by_label(label)
|
25
|
+
refs.find { |k, ref| k == label }.last
|
26
|
+
end
|
27
|
+
|
28
|
+
def form(name)
|
29
|
+
forms[name]
|
30
|
+
end
|
31
|
+
|
32
|
+
def as_json
|
33
|
+
@json
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.get(url, token=nil)
|
37
|
+
url = url + "?access_token=" + token if token
|
38
|
+
puts url
|
39
|
+
uri = URI(url)
|
40
|
+
http = Net::HTTP.new(uri.host)
|
41
|
+
path = token ? "#{uri.path}?access_token=#{token}" : uri.path
|
42
|
+
req = Net::HTTP::Get.new(path, 'Accept' => 'application/json')
|
43
|
+
res = http.request(req)
|
44
|
+
|
45
|
+
if res.code == '200'
|
46
|
+
res
|
47
|
+
else
|
48
|
+
raise PrismicWSConnectionError, res
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.start(url, token=nil)
|
53
|
+
resp = get(url, token)
|
54
|
+
json = JSON.load(resp.body)
|
55
|
+
parse_api_response(json)
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.parse_api_response(data)
|
59
|
+
data_forms = data['forms'] || []
|
60
|
+
data_refs = data.fetch('refs'){ raise BadPrismicResponseError, "No refs given" }
|
61
|
+
new({
|
62
|
+
json: data,
|
63
|
+
bookmarks: data['bookmarks'],
|
64
|
+
forms: Hash[data_forms.map { |k, form|
|
65
|
+
[k, SearchForm.new(Form.new(
|
66
|
+
form['name'],
|
67
|
+
Hash[form['fields'].map { |k2, field|
|
68
|
+
[k2, Field.new(field['type'], field['default'])]
|
69
|
+
}],
|
70
|
+
form['method'],
|
71
|
+
form['rel'],
|
72
|
+
form['enctype'],
|
73
|
+
form['action'],
|
74
|
+
))]
|
75
|
+
}],
|
76
|
+
refs: Hash[data_refs.map { |ref|
|
77
|
+
[ref['label'], Ref.new(ref['ref'], ref['label'], ref['isMasterRef'])]
|
78
|
+
}],
|
79
|
+
tags: data['tags'],
|
80
|
+
types: data['types'],
|
81
|
+
})
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
class BadPrismicResponseError < Error ; end
|
87
|
+
|
88
|
+
class PrismicWSConnectionError < Error
|
89
|
+
def initialize(resp, cause=nil)
|
90
|
+
super("Can't connect to Prismic's API: #{resp.code} #{resp.message}", cause)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
data/lib/prismic/form.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
module Prismic
|
2
|
+
class Form
|
3
|
+
attr_accessor :name, :form_method, :rel, :enctype, :action, :fields
|
4
|
+
|
5
|
+
def initialize(name, fields, form_method, rel, enctype, action)
|
6
|
+
@name = name
|
7
|
+
@fields = fields
|
8
|
+
@form_method = form_method
|
9
|
+
@rel = rel
|
10
|
+
@enctype = enctype
|
11
|
+
@action = action
|
12
|
+
end
|
13
|
+
|
14
|
+
def default_data
|
15
|
+
Hash[fields.map{|key, field| [key, field.default] }.compact]
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'prismic/fragments/block'
|
2
|
+
require 'prismic/fragments/color'
|
3
|
+
require 'prismic/fragments/date'
|
4
|
+
require 'prismic/fragments/embed'
|
5
|
+
require 'prismic/fragments/image'
|
6
|
+
require 'prismic/fragments/link'
|
7
|
+
require 'prismic/fragments/multiple'
|
8
|
+
require 'prismic/fragments/number'
|
9
|
+
require 'prismic/fragments/select'
|
10
|
+
require 'prismic/fragments/structured_text'
|
11
|
+
require 'prismic/fragments/text'
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Prismic
|
2
|
+
module Fragments
|
3
|
+
class Color
|
4
|
+
attr_accessor :value
|
5
|
+
|
6
|
+
def initialize(value)
|
7
|
+
@value = value
|
8
|
+
end
|
9
|
+
|
10
|
+
def asRGB
|
11
|
+
Fragments::Color.asRGB(@value)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.asRGB(value)
|
15
|
+
{
|
16
|
+
'red' => value[0..1].to_i(16),
|
17
|
+
'green' => value[2..3].to_i(16),
|
18
|
+
'blue' => value[4..5].to_i(16)
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def as_html(link_resolver=nil)
|
23
|
+
%(<span class="color">##@value</span>)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.valid?(value)
|
27
|
+
/(\h{2})(\h{2})(\h{2})/ === value
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|