opencomponents 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Build Status](https://travis-ci.org/opentable/ruby-oc.svg?branch=master)]
|
3
|
-
[![Coverage Status](https://coveralls.io/repos/opentable/ruby-oc/badge.svg)]
|
2
|
+
[![Build Status](https://travis-ci.org/opentable/ruby-oc.svg?branch=master)][1]
|
3
|
+
[![Coverage Status](https://coveralls.io/repos/opentable/ruby-oc/badge.svg)][2]
|
4
|
+
[![Code Climate](https://codeclimate.com/github/opentable/ruby-oc/badges/gpa.svg)][3]
|
5
|
+
[![Gem Version](https://badge.fury.io/rb/opencomponents.svg)][4]
|
6
|
+
[![Dependency Status](https://gemnasium.com/opentable/ruby-oc.svg)][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
|