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 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
@@ -0,0 +1,2 @@
1
+ coverage/
2
+ pkg/*.gem
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in truc.gemspec
4
+ gemspec
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'
@@ -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
@@ -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,4 @@
1
+ module Prismic
2
+ module Fragments
3
+ end
4
+ end
@@ -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
@@ -0,0 +1,15 @@
1
+ module Prismic
2
+ module Fragments
3
+ class Date
4
+ attr_accessor :value
5
+
6
+ def initialize(value)
7
+ @value = value
8
+ end
9
+
10
+ def as_html(link_resolver=nil)
11
+ %(<time>#{value.iso8601(3)}</time>)
12
+ end
13
+ end
14
+ end
15
+ end