rooftop 0.0.5 → 0.0.6
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 +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
|