rooftop 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +31 -3
- data/lib/rooftop.rb +2 -1
- data/lib/rooftop/base.rb +7 -0
- data/lib/rooftop/errors/unmapped_object_error.rb +5 -0
- data/lib/rooftop/menus/item.rb +28 -0
- data/lib/rooftop/menus/menu.rb +10 -0
- data/lib/rooftop/post.rb +1 -0
- data/lib/rooftop/queries/queries.rb +20 -1
- data/lib/rooftop/version.rb +1 -1
- metadata +5 -4
- data/lib/rooftop/models/menu.rb +0 -9
- data/lib/rooftop/models/menu_item.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7b51337bae47ac92f6fb41b5716bbe292f3f19b
|
4
|
+
data.tar.gz: c0ee1e20299e906b1fcf0358e820ddf05ae3d31a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 440657fbf5aa59c58464a661e57f04c7459f78b4efe4e7796c0180ed2c6e0064f83097e17cccbb397d5de151636ba128c1f45b06e2c8a443092faf3d3c65d62f
|
7
|
+
data.tar.gz: 2c0e502abd0d09977f803d6354a22b4ae3b762044513d7793847d46d225879e6a1ceb57136b98bbb288fb71fa8629e31bd40d1112bb29b41ac28602126afbf37
|
data/README.md
CHANGED
@@ -82,7 +82,7 @@ Sometimes you want to do something with a field after it's returned. for example
|
|
82
82
|
To coerce one or more fields, call a class method in your class and pass a lambda which is called on the field.
|
83
83
|
|
84
84
|
```
|
85
|
-
class
|
85
|
+
class MyCustomPostType
|
86
86
|
include rooftop::post
|
87
87
|
self.post_type = "my_custom_post_type"
|
88
88
|
coerce_field date: ->(date) { datetime.parse(date)}
|
@@ -191,7 +191,36 @@ _(the cache headers plugin for rooftop is a work in progress)_
|
|
191
191
|
If you want to cache responses, set `perform_caching` to true in your configuration block. you will need to provide a cache store and logger in the `cache_store` and `cache_logger` config options. by default, the cache store is set to `activesupport::cache.lookup_store(:memory_store)` which is a sensible default, but isn't shared across threads. any activesupport-compatible cache store (memcache, file, redis etc.) will do.
|
192
192
|
|
193
193
|
The `cache_logger` option determines where cache debug messages (hits, misses etc.) get stored. by default it's `nil`, which switches logging off.
|
194
|
-
|
194
|
+
|
195
|
+
## Menus
|
196
|
+
WordPress comes with quite a powerful way to build menus, rather than needing to traverse a tree of objects directly.
|
197
|
+
|
198
|
+
### Accessing the menu you need
|
199
|
+
At the moment you have to know the ID of the menu you need - not ideal. Keep an eye on the following issues to get an update:
|
200
|
+
|
201
|
+
* https://github.com/rooftopcms/rooftop-custom-content-setup/issues/3
|
202
|
+
* https://github.com/rooftopcms/rooftop-custom-content-setup/issues/4
|
203
|
+
|
204
|
+
So for now, with that in mind, here's how you do it:
|
205
|
+
|
206
|
+
```
|
207
|
+
r = Rooftop::Menus::Menu.find(2) #returns a menu with ID 2
|
208
|
+
r.items # a collection of Rooftop::Menus::Item
|
209
|
+
```
|
210
|
+
|
211
|
+
### Accessing the object to which a menu item refers
|
212
|
+
If a menu item refers to an object in Rooftop - a post or a page - you can access the original object by calling `object()`.
|
213
|
+
|
214
|
+
```
|
215
|
+
r = Rooftop::Menus::Menu.find(2) #returns a menu with ID 2
|
216
|
+
r.items # a collection of Rooftop::Menus::Item
|
217
|
+
item = r.items.first # a Rooftop::Menus::Item
|
218
|
+
item.object # an object derived from the post type and ID.
|
219
|
+
```
|
220
|
+
|
221
|
+
If you haven't defined a class for a post type, you'll get a `Rooftop::Menus::UnmappedObjectError`
|
222
|
+
|
223
|
+
|
195
224
|
# Roadmap
|
196
225
|
Lots! here's a flavour:
|
197
226
|
|
@@ -199,7 +228,6 @@ Lots! here's a flavour:
|
|
199
228
|
|
200
229
|
* preview mode. rooftop supports passing a preview header to see content in draft. we'll expose that in the rooftop gem as a constant.
|
201
230
|
* taxonomies will be supported and side-loaded against content
|
202
|
-
* menus are exposed by rooftop. we need to create a rooftop::menu mixin
|
203
231
|
* media: media is exposed by the api, and should be accessible and downloadable.
|
204
232
|
|
205
233
|
## Writing
|
data/lib/rooftop.rb
CHANGED
@@ -25,7 +25,7 @@ module Rooftop
|
|
25
25
|
end
|
26
26
|
|
27
27
|
class Configuration
|
28
|
-
attr_accessor :api_token, :url, :site_name, :perform_caching, :cache_store, :cache_logger, :ssl_options, :proxy
|
28
|
+
attr_accessor :api_token, :url, :site_name, :perform_caching, :cache_store, :cache_logger, :ssl_options, :proxy, :post_type_mapping
|
29
29
|
attr_reader :connection,
|
30
30
|
:connection_path,
|
31
31
|
:api_path, #actually writeable with custom setter
|
@@ -44,6 +44,7 @@ module Rooftop
|
|
44
44
|
@cache_logger = nil
|
45
45
|
@ssl_options = {}
|
46
46
|
@proxy = nil
|
47
|
+
@post_type_mapping = {}
|
47
48
|
end
|
48
49
|
|
49
50
|
def api_path=(path)
|
data/lib/rooftop/base.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module Rooftop
|
2
2
|
module Base
|
3
3
|
def self.included(base)
|
4
|
+
@included_classes ||= []
|
5
|
+
@included_classes << base unless @included_classes.include?(base)
|
4
6
|
base.extend ClassMethods
|
5
7
|
base.include Her::Model
|
6
8
|
|
@@ -37,6 +39,10 @@ module Rooftop
|
|
37
39
|
|
38
40
|
end
|
39
41
|
|
42
|
+
def self.included_classes
|
43
|
+
@included_classes
|
44
|
+
end
|
45
|
+
|
40
46
|
module ClassMethods
|
41
47
|
attr_reader :api_namespace, :api_version, :api_endpoint
|
42
48
|
|
@@ -58,6 +64,7 @@ module Rooftop
|
|
58
64
|
def setup_path!
|
59
65
|
@api_endpoint ||= collection_path
|
60
66
|
self.collection_path "#{@api_namespace}/v#{@api_version}/#{@api_endpoint}"
|
67
|
+
|
61
68
|
end
|
62
69
|
|
63
70
|
# Allow calling 'first'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Rooftop
|
2
|
+
module Menus
|
3
|
+
class Item < OpenStruct
|
4
|
+
def initialize(args)
|
5
|
+
args[:object_type] = args[:object]
|
6
|
+
super
|
7
|
+
# If this menu item has children, create a MenuItem for each one
|
8
|
+
if self.children
|
9
|
+
self.children = children.collect do |child|
|
10
|
+
Item.new(child)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
def object
|
17
|
+
if self.type == "post_type"
|
18
|
+
begin
|
19
|
+
klass = Rooftop.configuration.post_type_mapping[self.object_type] || self.object_type.classify.constantize
|
20
|
+
klass.find_by(slug: self.slug).first
|
21
|
+
rescue
|
22
|
+
raise UnmappedObjectError, "Couldn't find an mapping between the #{self.object_type} post type and a class in your code."
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/rooftop/post.rb
CHANGED
@@ -12,9 +12,28 @@ module Rooftop
|
|
12
12
|
# the fact that 'slug' is referred to in the db as 'name' is irritating. Let's fix that
|
13
13
|
# in queries so we can specify {slug: "foo"}
|
14
14
|
if args.keys.collect(&:to_sym).include?(:slug)
|
15
|
-
|
15
|
+
if args[:slug].is_a?(Array)
|
16
|
+
args[:post_name__in] ||= []
|
17
|
+
args[:slug].each do |slug|
|
18
|
+
args[:post_name__in] << slug
|
19
|
+
end
|
20
|
+
else
|
21
|
+
args[:name] = args[:slug]
|
22
|
+
end
|
16
23
|
args.delete(:slug)
|
17
24
|
end
|
25
|
+
|
26
|
+
if args.keys.collect(&:to_sym).include?(:id)
|
27
|
+
if args[:id].is_a?(Array)
|
28
|
+
args[:post__in] ||= []
|
29
|
+
args[:id].each do |id|
|
30
|
+
args[:post__in] << id
|
31
|
+
end
|
32
|
+
else
|
33
|
+
args[:page_id] = args[:id]
|
34
|
+
end
|
35
|
+
args.delete(:id)
|
36
|
+
end
|
18
37
|
filters = args.inject({}) {|hash,pair| hash["filter[#{pair.first}]"] = pair.last; hash}
|
19
38
|
#Call the Her `where` method with our new filters
|
20
39
|
super().where(filters)
|
data/lib/rooftop/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rooftop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ed Jones
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-12-
|
11
|
+
date: 2015-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -117,13 +117,14 @@ files:
|
|
117
117
|
- lib/rooftop/content/field.rb
|
118
118
|
- lib/rooftop/errors/field_not_found_error.rb
|
119
119
|
- lib/rooftop/errors/record_not_found_error.rb
|
120
|
+
- lib/rooftop/errors/unmapped_object_error.rb
|
120
121
|
- lib/rooftop/field_aliases.rb
|
121
122
|
- lib/rooftop/headers.rb
|
122
123
|
- lib/rooftop/hook_calls.rb
|
124
|
+
- lib/rooftop/menus/item.rb
|
125
|
+
- lib/rooftop/menus/menu.rb
|
123
126
|
- lib/rooftop/models/author.rb
|
124
127
|
- lib/rooftop/models/media_item.rb
|
125
|
-
- lib/rooftop/models/menu.rb
|
126
|
-
- lib/rooftop/models/menu_item.rb
|
127
128
|
- lib/rooftop/models/taxonomy.rb
|
128
129
|
- lib/rooftop/models/taxonomy_term.rb
|
129
130
|
- lib/rooftop/nested.rb
|
data/lib/rooftop/models/menu.rb
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
module Rooftop
|
2
|
-
class Menu
|
3
|
-
include Rooftop::Base
|
4
|
-
has_many :menu_items, class: "Rooftop::MenuItem"
|
5
|
-
self.api_namespace = "wp-api-menus"
|
6
|
-
self.api_version = 2
|
7
|
-
# coerce_field items: ->(items) { items.collect {|i| MenuItem.new(i)} unless items.nil?}
|
8
|
-
end
|
9
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module Rooftop
|
2
|
-
class MenuItem
|
3
|
-
def initialize(args)
|
4
|
-
args.each do |k,v|
|
5
|
-
instance_variable_set("@#{k}", v)
|
6
|
-
self.class.send(:attr_accessor, k)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
def id
|
11
|
-
self.instance_variable_get(:"@ID")
|
12
|
-
end
|
13
|
-
|
14
|
-
def ==(other)
|
15
|
-
other.class == self.class && other.respond_to?(:id) && other.id == id
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|