opencomponents 0.1.0 → 0.2.0
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 +53 -11
- data/lib/opencomponents.rb +25 -1
- data/lib/opencomponents/component.rb +86 -10
- data/lib/opencomponents/prerendered_component.rb +36 -7
- data/lib/opencomponents/rendered_component.rb +12 -6
- data/lib/opencomponents/renderer.rb +15 -2
- data/lib/opencomponents/version.rb +1 -1
- data/opencomponents.gemspec +1 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bad9832ecad1d26ca9511e032e4c85d948f17f18
|
4
|
+
data.tar.gz: cc277e8e5182192778dec331c80050d3d8dd4c5d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f33a1d25e888b0d4ad0a2e158f2b6eebfb93bb2959d3c2965dd8577e1663766dc758fb202d6ba9884f9ec2fe4187bc773a1e6db9e9ae10f62763684150947f37
|
7
|
+
data.tar.gz: 55f5b8e3d0c2aa0c932951a7ee06539c2d60ca55cba65f0d9d9f9021a8446824c919068e911ca4e3ce941b15a08427e52c0105b96caba31b2734d9f9f97a5699
|
data/README.md
CHANGED
@@ -1,20 +1,28 @@
|
|
1
1
|
# opencomponents
|
2
|
-
[]
|
3
|
-
[]
|
2
|
+
[][1]
|
3
|
+
[][2]
|
4
|
+
[][3]
|
5
|
+
[][4]
|
6
|
+
[][5]
|
4
7
|
|
5
|
-
[
|
8
|
+
[1]:https://travis-ci.org/opentable/ruby-oc
|
9
|
+
[2]:https://coveralls.io/r/opentable/ruby-oc
|
10
|
+
[3]:https://codeclimate.com/github/opentable/ruby-oc
|
11
|
+
[4]:http://badge.fury.io/rb/opencomponents
|
12
|
+
[5]:https://gemnasium.com/opentable/ruby-oc
|
6
13
|
|
7
|
-
[
|
14
|
+
[OpenComponents][6] for Ruby
|
15
|
+
|
16
|
+
[6]:https://github.com/opentable/oc
|
8
17
|
|
9
18
|
## Important
|
10
19
|
This gem is still under heavy development and the API is likely to change at any
|
11
20
|
time.
|
12
21
|
|
13
22
|
## Getting Started
|
14
|
-
Add the gem to your Gemfile and run `bundle install
|
15
|
-
on RubyGems):
|
23
|
+
Add the gem to your Gemfile and run `bundle install`:
|
16
24
|
```ruby
|
17
|
-
gem 'opencomponents',
|
25
|
+
gem 'opencomponents', '~> 0.1.0'
|
18
26
|
```
|
19
27
|
|
20
28
|
By default, the gem will attempt to use a component registry located at
|
@@ -25,14 +33,48 @@ it with:
|
|
25
33
|
OpenComponents.configure { |config| config.registry = 'http://some.other.host' }
|
26
34
|
```
|
27
35
|
|
36
|
+
## Getting Rendered Components
|
37
|
+
To request an OpenComponent with its rendered HTML, you can create and load a new
|
38
|
+
`RenderedComponent` object.
|
39
|
+
```ruby
|
40
|
+
component = OpenComponents::RenderedComponent.new('my-awesome-component')
|
41
|
+
component.load
|
42
|
+
```
|
43
|
+
|
44
|
+
Optionally, you can also specify parameters, the component version, and
|
45
|
+
additional HTTP headers to request:
|
46
|
+
```ruby
|
47
|
+
component = OpenComponents::RenderedComponent.new(
|
48
|
+
'my-awesome-component',
|
49
|
+
params: {name: 'Kate'},
|
50
|
+
version: '1.0.2',
|
51
|
+
headers: {accept_language: 'emoji'}
|
52
|
+
)
|
53
|
+
```
|
54
|
+
|
55
|
+
## Getting Pre-rendered Components
|
56
|
+
If you'd like to perform the component rendering yourself, you can request a
|
57
|
+
pre-rendered component from a registry using a `PrerenderedComponent` object.
|
58
|
+
```ruby
|
59
|
+
component = OpenComponents::PrerenderedComponent.new('my-awesome-component')
|
60
|
+
component.load
|
61
|
+
```
|
62
|
+
|
63
|
+
You can use the same optional `params`, `version`, and `headers` arguments as
|
64
|
+
`RenderedComponent`s.
|
65
|
+
|
66
|
+
**Note**: `PrerenderedComponent`s will only fetch component data for you - they
|
67
|
+
do not provide an interface for rendering them. At the moment, it's up to you to
|
68
|
+
determine the best way to render the template.
|
69
|
+
|
28
70
|
## Integrations
|
29
71
|
Individual integrations for rendering components in Rails and Sinatra are
|
30
72
|
available.
|
31
|
-
* [opencomponents-rails][
|
32
|
-
* [sinatra-opencomponents][
|
73
|
+
* [opencomponents-rails][7]
|
74
|
+
* [sinatra-opencomponents][8]
|
33
75
|
|
34
|
-
[
|
35
|
-
[
|
76
|
+
[7]:https://github.com/opentable/opencomponents-rails
|
77
|
+
[8]:https://github.com/opentable/sinatra-opencomponents
|
36
78
|
|
37
79
|
## Contributing
|
38
80
|
Would be rad. Open a PR or Issue if you have an idea for improvements.
|
data/lib/opencomponents.rb
CHANGED
@@ -5,17 +5,41 @@ require 'opencomponents/renderer'
|
|
5
5
|
require 'opencomponents/version'
|
6
6
|
|
7
7
|
module OpenComponents
|
8
|
+
# Public: Default OC registry URL (http://localhost:3030).
|
8
9
|
DEFAULT_REGISTRY = 'http://localhost:3030'
|
9
10
|
|
11
|
+
# Internal: Custom exception class to raise in the event a component cannot be
|
12
|
+
# found in the registry.
|
10
13
|
ComponentNotFound = Class.new(RuntimeError)
|
11
14
|
|
15
|
+
# Internal: Stores configuration data.
|
16
|
+
#
|
17
|
+
# registry - String for the registry host.
|
12
18
|
Configuration = Struct.new(:registry)
|
13
|
-
Template = Struct.new(:src, :type, :key)
|
14
19
|
|
20
|
+
# Internal: Wrapper object for pre-rendered OC templates.
|
21
|
+
#
|
22
|
+
# src - String for the template URL.
|
23
|
+
# type - String for template engine type.
|
24
|
+
# key - String for template key.
|
25
|
+
Template = Struct.new(:src, :type, :key)
|
26
|
+
|
27
|
+
# Public: Getter for OC Configuration.
|
28
|
+
#
|
29
|
+
# Returns the Configuration if set, a default Configuration if not set.
|
15
30
|
def self.config
|
16
31
|
@@_config ||= Configuration.new(DEFAULT_REGISTRY)
|
17
32
|
end
|
18
33
|
|
34
|
+
# Public: Setter for Configuration.
|
35
|
+
#
|
36
|
+
# Examples
|
37
|
+
#
|
38
|
+
# OpenComponents.configure do |oc|
|
39
|
+
# oc.registry = 'http://my-awesome-oc-registry.com'
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# Returns the Configuration.
|
19
43
|
def self.configure
|
20
44
|
yield self.config
|
21
45
|
end
|
@@ -1,20 +1,67 @@
|
|
1
1
|
require 'rest-client'
|
2
2
|
|
3
3
|
module OpenComponents
|
4
|
+
# Wrapper object for a component fetched from an OC registry.
|
4
5
|
class Component
|
5
|
-
|
6
|
-
|
6
|
+
# Public: Gets/sets the String name of the component.
|
7
|
+
attr_accessor :name
|
7
8
|
|
8
|
-
|
9
|
+
# Public: Gets/sets the desired String version of the component.
|
10
|
+
attr_accessor :version
|
11
|
+
|
12
|
+
# Public: Gets/sets a Hash of params to send in the component request.
|
13
|
+
attr_accessor :params
|
14
|
+
|
15
|
+
# Public: Gets/sets a Hash of headers to send in the component request.
|
16
|
+
attr_accessor :headers
|
17
|
+
|
18
|
+
# Public: Returns the String URL of the requested component.
|
19
|
+
attr_reader :href
|
20
|
+
|
21
|
+
# Public: Returns the String version of the component as served by the
|
22
|
+
# registry.
|
23
|
+
attr_reader :registry_version
|
24
|
+
|
25
|
+
# Public: Returns the String type of the component as served by the
|
26
|
+
# registry.
|
27
|
+
attr_reader :type
|
28
|
+
|
29
|
+
# Public: Returns the String render mode of the component as served by the
|
30
|
+
# registry. Generally either `rendered` or `pre-rendered`.
|
31
|
+
attr_reader :render_mode
|
32
|
+
|
33
|
+
# Public: Initializes a new Component subclass.
|
34
|
+
#
|
35
|
+
# name - The String name of the component to request.
|
36
|
+
# opts - A Hash of options to use when requesting the component
|
37
|
+
# (default: {}).
|
38
|
+
# :params - A Hash of parameters to send in the component request
|
39
|
+
# (optional, default: {}).
|
40
|
+
# :version - The String version of the component to request
|
41
|
+
# (optional, default: '').
|
42
|
+
# :headers - A Hash of HTTP request headers to include in the
|
43
|
+
# component request (optional, default: {}).
|
44
|
+
def initialize(name, opts = {})
|
9
45
|
@name = name
|
10
|
-
@params = params
|
11
|
-
@version = version
|
46
|
+
@params = opts[:params] || {}
|
47
|
+
@version = opts[:version] || ''
|
48
|
+
@headers = opts[:headers] || {}
|
12
49
|
end
|
13
50
|
|
51
|
+
# Public: Returns the String value of `requestVersion` from a component
|
52
|
+
# response, `nil` if not present.
|
14
53
|
def request_version
|
15
54
|
@request_version == '' ? nil : @request_version
|
16
55
|
end
|
17
56
|
|
57
|
+
# Public: Resets all component attributes from a registry response to `nil`.
|
58
|
+
#
|
59
|
+
# Examples
|
60
|
+
#
|
61
|
+
# component.flush!
|
62
|
+
# # => #<OpenComponents::RenderedComponent: ... >
|
63
|
+
#
|
64
|
+
# Returns the reset Component.
|
18
65
|
def flush!
|
19
66
|
flush_variables_whitelist.each do |var|
|
20
67
|
instance_variable_set(var, nil)
|
@@ -23,6 +70,15 @@ module OpenComponents
|
|
23
70
|
self
|
24
71
|
end
|
25
72
|
|
73
|
+
# Public: Resets all component attributes and reloads them from a registry
|
74
|
+
# response.
|
75
|
+
#
|
76
|
+
# Examples
|
77
|
+
#
|
78
|
+
# component.reload!
|
79
|
+
# # => #<OpenComponents::RenderedComponent: ... >
|
80
|
+
#
|
81
|
+
# Returns the reloaded Component.
|
26
82
|
def reload!
|
27
83
|
flush!
|
28
84
|
load
|
@@ -30,6 +86,11 @@ module OpenComponents
|
|
30
86
|
|
31
87
|
protected
|
32
88
|
|
89
|
+
# Internal: Executes a component request and sets attributes common to all
|
90
|
+
# component render modes. Public-facing `#load` methods exist on Component
|
91
|
+
# subclasses.
|
92
|
+
#
|
93
|
+
# Returns the Component.
|
33
94
|
def load
|
34
95
|
@href = response_data['href']
|
35
96
|
@registry_version = response_data['version']
|
@@ -40,32 +101,47 @@ module OpenComponents
|
|
40
101
|
self
|
41
102
|
end
|
42
103
|
|
104
|
+
# Internal: Builds the URL to send a component request to.
|
105
|
+
#
|
106
|
+
# Returns the String URL to request a component from.
|
43
107
|
def url
|
44
108
|
File.join(OpenComponents.config.registry, name, version)
|
45
109
|
end
|
46
110
|
|
111
|
+
# Internal: Executes a component request against the configured registry.
|
112
|
+
#
|
113
|
+
# Returns a response body String.
|
114
|
+
# Raises OpenComponents::ComponentNotFound if the registry responds with a
|
115
|
+
# 404.
|
47
116
|
def response
|
117
|
+
request_headers = headers.merge(params: params)
|
118
|
+
|
48
119
|
RestClient::Request.execute(
|
49
120
|
method: :get,
|
50
121
|
url: url,
|
51
122
|
timeout: 10,
|
52
|
-
headers:
|
53
|
-
accept: accept_header,
|
54
|
-
params: params,
|
55
|
-
}
|
123
|
+
headers: request_headers
|
56
124
|
)
|
57
125
|
rescue RestClient::ResourceNotFound => e
|
58
126
|
fail ComponentNotFound, e.message
|
59
127
|
end
|
60
128
|
|
129
|
+
# Internal: Helper method for converting and memoizing registry response
|
130
|
+
# data.
|
131
|
+
#
|
132
|
+
# Returns a Hash of registry response data.
|
61
133
|
def response_data
|
62
134
|
@_response_data ||= JSON.parse(response)
|
63
135
|
end
|
64
136
|
|
65
137
|
private
|
66
138
|
|
139
|
+
# Internal: Whitelists instance variable names allowed to be reset when
|
140
|
+
# calling `#flush!`.
|
141
|
+
#
|
142
|
+
# Returns an Array of instance variable Symbols allowed to be reset.
|
67
143
|
def flush_variables_whitelist
|
68
|
-
instance_variables - [:@name, :@version, :@params]
|
144
|
+
instance_variables - [:@name, :@version, :@params, :@headers]
|
69
145
|
end
|
70
146
|
end
|
71
147
|
end
|
@@ -1,7 +1,42 @@
|
|
1
1
|
module OpenComponents
|
2
|
+
# Wrapper object for components using the `pre-rendered` rendering mode.
|
2
3
|
class PrerenderedComponent < Component
|
3
|
-
|
4
|
+
# Internal: Default HTTP headers to send when requesting a component.
|
5
|
+
DEFAULT_HEADERS = {accept: 'application/vnd.oc.prerendered+json'}
|
4
6
|
|
7
|
+
# Public: Returns a Hash of data to use when rendering the component.
|
8
|
+
attr_reader :data
|
9
|
+
|
10
|
+
# Public: Returns a Template with data for rendering the raw component.
|
11
|
+
attr_reader :template
|
12
|
+
|
13
|
+
# Public: Initializes a new PrerenderedComponent.
|
14
|
+
#
|
15
|
+
# name - The String name of the component to request.
|
16
|
+
# opts - A Hash of options to use when requesting the component
|
17
|
+
# (default: {}).
|
18
|
+
# :params - A Hash of parameters to send in the component request
|
19
|
+
# (optional, default: {}).
|
20
|
+
# :version - The String version of the component to request
|
21
|
+
# (optional, default: nil).
|
22
|
+
# :headers - A Hash of HTTP request headers to include in the
|
23
|
+
# component request (optional, default: DEFAULT_HEADERS).
|
24
|
+
def initialize(name, opts = {})
|
25
|
+
super(name, opts)
|
26
|
+
|
27
|
+
@headers.merge!(DEFAULT_HEADERS)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Public: Executes a request for the Component against the configured
|
31
|
+
# registry and sets the component attributes.
|
32
|
+
#
|
33
|
+
# Examples
|
34
|
+
#
|
35
|
+
# component = OpenComponents::RenderedComponent.new('my-component')
|
36
|
+
# component.load
|
37
|
+
# # => #<OpenComponents::RenderedComponent: ... >
|
38
|
+
#
|
39
|
+
# Returns the Component with attributes set.
|
5
40
|
def load
|
6
41
|
template_data = response_data['template']
|
7
42
|
|
@@ -12,11 +47,5 @@ module OpenComponents
|
|
12
47
|
|
13
48
|
super
|
14
49
|
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def accept_header
|
19
|
-
'application/vnd.oc.prerendered+json'
|
20
|
-
end
|
21
50
|
end
|
22
51
|
end
|
@@ -1,17 +1,23 @@
|
|
1
1
|
module OpenComponents
|
2
|
+
# Wrapper object for components using the `rendered` rendering mode.
|
2
3
|
class RenderedComponent < Component
|
4
|
+
# Public: Returns the HTML String for the rendered component.
|
3
5
|
attr_reader :html
|
4
6
|
|
7
|
+
# Public: Executes a request for the Component against the configured
|
8
|
+
# registry and sets the component attributes.
|
9
|
+
#
|
10
|
+
# Examples
|
11
|
+
#
|
12
|
+
# component = OpenComponents::RenderedComponent.new('my-component')
|
13
|
+
# component.load
|
14
|
+
# # => #<OpenComponents::RenderedComponent: ... >
|
15
|
+
#
|
16
|
+
# Returns the Component with attributes set.
|
5
17
|
def load
|
6
18
|
@html = response_data['html']
|
7
19
|
|
8
20
|
super
|
9
21
|
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def accept_header
|
14
|
-
nil
|
15
|
-
end
|
16
22
|
end
|
17
23
|
end
|
@@ -1,7 +1,20 @@
|
|
1
1
|
module OpenComponents
|
2
|
+
# Provides rendering helper methods for components.
|
2
3
|
module Renderer
|
3
|
-
|
4
|
-
|
4
|
+
# Public: Builds a new RenderedComponent, executes a request for it against
|
5
|
+
# the configured registry, and returns the rendered component HTML.
|
6
|
+
#
|
7
|
+
# component - The String name of the component to render.
|
8
|
+
# opts - A Hash of options to use when requesting the component
|
9
|
+
# (default: {}).
|
10
|
+
# :params - A Hash of parameters to send in the component request
|
11
|
+
# (optional, default: {}).
|
12
|
+
# :version - The String version of the component to request
|
13
|
+
# (optional, default: nil).
|
14
|
+
# :headers - A Hash of HTTP request headers to include in the
|
15
|
+
# component request (optional, default: {}).
|
16
|
+
def render_component(component, opts = {})
|
17
|
+
OpenComponents::RenderedComponent.new(component, opts)
|
5
18
|
.load
|
6
19
|
.html
|
7
20
|
end
|
data/opencomponents.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opencomponents
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Todd Bealmear
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -59,7 +59,8 @@ licenses:
|
|
59
59
|
- MIT
|
60
60
|
metadata: {}
|
61
61
|
post_install_message:
|
62
|
-
rdoc_options:
|
62
|
+
rdoc_options:
|
63
|
+
- "--markup=tomdoc"
|
63
64
|
require_paths:
|
64
65
|
- lib
|
65
66
|
required_ruby_version: !ruby/object:Gem::Requirement
|