alephant-renderer 0.0.10 → 0.1.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/Gemfile +0 -1
- data/README.md +31 -8
- data/Rakefile +1 -2
- data/alephant-renderer.gemspec +1 -0
- data/lib/alephant/renderer.rb +25 -4
- data/lib/alephant/renderer/version.rb +1 -1
- data/lib/alephant/renderer/view_mapper.rb +57 -0
- data/lib/alephant/renderer/views.rb +23 -0
- data/lib/alephant/renderer/views/base.rb +46 -0
- data/lib/alephant/renderer/views/html.rb +63 -0
- data/lib/alephant/renderer/views/json.rb +21 -0
- data/spec/fixtures/components/foo/models/bar.rb +7 -0
- data/spec/fixtures/components/foo/models/foo.rb +2 -2
- data/spec/fixtures/components/foo/models/json.rb +21 -0
- data/spec/integration/spec_helper.rb +1 -0
- data/spec/renderer_spec.rb +42 -41
- data/spec/spec_helper.rb +5 -1
- data/spec/view_mapper_spec.rb +43 -0
- data/spec/views_json_spec.rb +33 -0
- metadata +80 -66
- data/lib/alephant/renderer/engines/mustache.rb +0 -63
- data/lib/alephant/views.rb +0 -27
- data/lib/alephant/views/base.rb +0 -31
- data/spec/fixtures/components/foo/models/welsh.rb +0 -7
- data/spec/fixtures/components/foo/templates/bar.mustache +0 -1
- data/spec/fixtures/components/foo/templates/foo.mustache +0 -1
- data/spec/fixtures/components/locale/cy.yml +0 -3
- data/spec/fixtures/components/locale/en.yml +0 -3
- data/spec/views_base_spec.rb +0 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b124075259704175277b3f266e3693741ef07d0e
|
4
|
+
data.tar.gz: 4bc052c06b6c55118e188432c431897592763ef3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 113f572f461dfc7bc1d4a1e1b133eb57e5ee9d6ec38504ca591792e87fb5e85558597c2be7c4270e8edaacfbaa9add81f2237bf2d82c64ce07359b45a69a528f
|
7
|
+
data.tar.gz: 4e76b23a5ebffb1a8b9a7542f602acbe80c7aca6951a7d2f5cf9042bd34fad320859b280396cc70e396e2b0602f701006cdcd6246f43365a488c1c78631867b7
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -76,24 +76,32 @@ class TestModel < Alephant::Views::Base
|
|
76
76
|
end
|
77
77
|
```
|
78
78
|
|
79
|
-
####
|
79
|
+
#### Translations
|
80
80
|
|
81
81
|
The best approach with the templates when translations are needed, is to have a base template then a seperate one for each lanuage that's being translated.
|
82
82
|
|
83
|
-
|
83
|
+
In each view model, the following method is available for translations:
|
84
84
|
|
85
|
-
```
|
86
|
-
|
85
|
+
```ruby
|
86
|
+
t 'my_key'
|
87
87
|
```
|
88
88
|
|
89
89
|
#### Example
|
90
90
|
|
91
|
-
If we had a template called 'test_template.mustache' we would have the following:
|
91
|
+
If we had a template called 'test_template.mustache' we would have the following in the model 'test_template.rb':
|
92
|
+
|
93
|
+
>test_template.rb
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
def my_translation
|
97
|
+
t 'key'
|
98
|
+
end
|
99
|
+
```
|
92
100
|
|
93
101
|
>test_template.mustache
|
94
102
|
|
95
103
|
```mustache
|
96
|
-
{{
|
104
|
+
{{ my_translation }}
|
97
105
|
```
|
98
106
|
|
99
107
|
>locale/en.yml
|
@@ -101,10 +109,25 @@ If we had a template called 'test_template.mustache' we would have the following
|
|
101
109
|
```yaml
|
102
110
|
en:
|
103
111
|
test_template:
|
104
|
-
|
105
|
-
|
112
|
+
key: 'A translation!'
|
113
|
+
```
|
114
|
+
|
115
|
+
##### Default
|
116
|
+
|
117
|
+
By default, if the translation key doesn't exist then the translation key is used as the translation.
|
118
|
+
|
119
|
+
You can override this behaviour and provide a default:
|
120
|
+
|
121
|
+
```ruby
|
122
|
+
def my_translation
|
123
|
+
t 'missing_key', :default => 'Some default'
|
124
|
+
end
|
125
|
+
|
106
126
|
```
|
107
127
|
|
128
|
+
So if the key doesn't exists, then 'Some default' is the translation.
|
129
|
+
|
130
|
+
|
108
131
|
## Contributing
|
109
132
|
|
110
133
|
1. Fork it ( http://github.com/bbc-news/alephant-renderer/fork )
|
data/Rakefile
CHANGED
data/alephant-renderer.gemspec
CHANGED
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
|
28
28
|
spec.add_development_dependency "bundler", "~> 1.5"
|
29
29
|
spec.add_development_dependency "rake"
|
30
|
+
spec.add_development_dependency "rake-rspec"
|
30
31
|
|
31
32
|
spec.add_runtime_dependency 'i18n'
|
32
33
|
spec.add_runtime_dependency 'mustache', '>= 0.99.5'
|
data/lib/alephant/renderer.rb
CHANGED
@@ -1,11 +1,32 @@
|
|
1
1
|
require 'alephant/renderer/version'
|
2
|
-
require 'alephant/renderer/
|
2
|
+
require 'alephant/renderer/view_mapper'
|
3
3
|
|
4
4
|
module Alephant
|
5
5
|
module Renderer
|
6
|
-
def self.create(
|
7
|
-
|
6
|
+
def self.create(config, data)
|
7
|
+
Renderer.new(config, data)
|
8
|
+
end
|
9
|
+
|
10
|
+
class Renderer
|
11
|
+
attr_reader :config, :data
|
12
|
+
|
13
|
+
def initialize(config, data)
|
14
|
+
@config = config
|
15
|
+
@data = data
|
16
|
+
end
|
17
|
+
|
18
|
+
def views
|
19
|
+
mapper.generate data
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def mapper
|
25
|
+
@mapper ||= ViewMapper.new(
|
26
|
+
config[:renderer_id],
|
27
|
+
config[:view_path]
|
28
|
+
)
|
29
|
+
end
|
8
30
|
end
|
9
31
|
end
|
10
32
|
end
|
11
|
-
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'alephant/logger'
|
2
|
+
|
3
|
+
module Alephant
|
4
|
+
module Renderer
|
5
|
+
class ViewMapper
|
6
|
+
include Logger
|
7
|
+
|
8
|
+
DEFAULT_LOCATION = 'components'
|
9
|
+
|
10
|
+
def initialize(component_id, view_base_path=nil)
|
11
|
+
self.base_path = "#{view_base_path}/#{component_id}" unless view_base_path.nil?
|
12
|
+
@component_id = component_id
|
13
|
+
end
|
14
|
+
|
15
|
+
def base_path
|
16
|
+
@base_path || DEFAULT_LOCATION
|
17
|
+
end
|
18
|
+
|
19
|
+
def base_path=(path)
|
20
|
+
@base_path = File.directory?(path) ? path : (raise "Invalid path: '#{path}'")
|
21
|
+
end
|
22
|
+
|
23
|
+
def generate(data)
|
24
|
+
model_locations.reduce({}) do |obj, file|
|
25
|
+
obj.tap do |o|
|
26
|
+
model_id = model_id_for file
|
27
|
+
o[model_id] = model(model_id, data)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def model(view_id, data)
|
35
|
+
require model_location_for view_id
|
36
|
+
Views.get_registered_class(view_id).new(data)
|
37
|
+
end
|
38
|
+
|
39
|
+
def model_location_for(view_id)
|
40
|
+
File.join(base_path, 'models', "#{view_id}.rb")
|
41
|
+
end
|
42
|
+
|
43
|
+
def model_locations
|
44
|
+
Dir[model_base_path]
|
45
|
+
end
|
46
|
+
|
47
|
+
def model_base_path
|
48
|
+
"#{base_path}/models/*"
|
49
|
+
end
|
50
|
+
|
51
|
+
def model_id_for(location)
|
52
|
+
location.split('/').last.sub(/\.rb/, '')
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Alephant
|
2
|
+
module Renderer
|
3
|
+
module Views
|
4
|
+
@@views = {}
|
5
|
+
|
6
|
+
def self.register(klass)
|
7
|
+
@@views[underscorify(klass.name.split('::').last)] = klass
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.get_registered_class(id)
|
11
|
+
@@views[id]
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.underscorify(str)
|
15
|
+
str.gsub(/::/, '/').
|
16
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
17
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
18
|
+
tr("-", "_").
|
19
|
+
downcase
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'alephant/renderer/views'
|
2
|
+
require 'hashie'
|
3
|
+
|
4
|
+
module Alephant
|
5
|
+
module Renderer
|
6
|
+
module Views
|
7
|
+
module Base
|
8
|
+
def self.included base
|
9
|
+
base.send :include, InstanceMethods
|
10
|
+
base.extend ClassMethods
|
11
|
+
end
|
12
|
+
|
13
|
+
module InstanceMethods
|
14
|
+
attr_reader :data, :content_type, :base_path
|
15
|
+
|
16
|
+
def initialize(data = {})
|
17
|
+
@data = Hashie::Mash.new data
|
18
|
+
@base_path = self.class.base_path
|
19
|
+
|
20
|
+
setup
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_h
|
24
|
+
whitelist.reduce({}) { |m,s| m.tap { |m| m[s] = self.send(s) } }
|
25
|
+
end
|
26
|
+
|
27
|
+
def setup; end
|
28
|
+
def whitelist; [] end
|
29
|
+
end
|
30
|
+
|
31
|
+
module ClassMethods
|
32
|
+
attr_accessor :base_path
|
33
|
+
|
34
|
+
def inherited(subclass)
|
35
|
+
current_dir = File.dirname(caller.first[/\/[^:]+/])
|
36
|
+
dir_path = Pathname.new(File.join(current_dir,'..')).realdirpath
|
37
|
+
|
38
|
+
subclass.base_path = dir_path.to_s
|
39
|
+
|
40
|
+
Alephant::Renderer::Views.register(subclass)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'alephant/renderer/views/base'
|
2
|
+
require 'mustache'
|
3
|
+
require 'i18n'
|
4
|
+
|
5
|
+
module Alephant
|
6
|
+
module Renderer
|
7
|
+
module Views
|
8
|
+
class Html < Mustache
|
9
|
+
include ::Alephant::Renderer::Views::Base
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@content_type = "text/html"
|
13
|
+
load_translations_from base_path
|
14
|
+
end
|
15
|
+
|
16
|
+
def locale
|
17
|
+
:en
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def load_translations_from(base_path)
|
23
|
+
if I18n.load_path.empty?
|
24
|
+
I18n.config.enforce_available_locales = false
|
25
|
+
I18n.load_path = i18n_load_path_from(base_path)
|
26
|
+
I18n.backend.load_translations
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def i18n_load_path_from(base_path)
|
31
|
+
Dir[
|
32
|
+
File.join(
|
33
|
+
Pathname.new(base_path).parent,
|
34
|
+
'locale',
|
35
|
+
'*.yml')
|
36
|
+
]
|
37
|
+
.flatten
|
38
|
+
.uniq
|
39
|
+
end
|
40
|
+
|
41
|
+
def t(key, params = {})
|
42
|
+
I18n.locale = locale
|
43
|
+
prefix = /\/([^\/]+)\.mustache/.match(template_file)[1]
|
44
|
+
params.merge! :default => key unless params[:default]
|
45
|
+
translation = I18n.translate("#{prefix}.#{key}", params)
|
46
|
+
end
|
47
|
+
|
48
|
+
def template
|
49
|
+
@template_string ||= File.open(template_file).read
|
50
|
+
end
|
51
|
+
|
52
|
+
def template_name
|
53
|
+
Mustache.underscore(self.class.to_s).split('/').last
|
54
|
+
end
|
55
|
+
|
56
|
+
def template_file
|
57
|
+
File.join(base_path,'templates',"#{template_name}.#{template_extension}")
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'alephant/renderer/views/base'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Alephant
|
5
|
+
module Renderer
|
6
|
+
module Views
|
7
|
+
class Json
|
8
|
+
include ::Alephant::Renderer::Views::Base
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@content_type = "application/json"
|
12
|
+
end
|
13
|
+
|
14
|
+
def render
|
15
|
+
JSON.generate(to_h)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative '../spec_helper'
|
data/spec/renderer_spec.rb
CHANGED
@@ -1,57 +1,58 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Alephant::Renderer do
|
4
|
-
let(:
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
4
|
+
let(:config) {
|
5
|
+
{
|
6
|
+
renderer_id: 'foo',
|
7
|
+
view_path: File.join(File.dirname(__FILE__), 'fixtures/components'),
|
8
|
+
}
|
9
|
+
}
|
10
|
+
let(:data) { {content: 'test'} }
|
11
|
+
|
12
|
+
describe '.create' do
|
13
|
+
context 'using valid params' do
|
14
|
+
let(:expected) { Alephant::Renderer::Renderer }
|
15
|
+
|
16
|
+
specify {
|
17
|
+
expect(subject.create(config, data)).to be_instance_of expected
|
18
|
+
}
|
19
|
+
end
|
15
20
|
end
|
16
21
|
|
17
|
-
describe
|
18
|
-
|
19
|
-
|
22
|
+
describe Alephant::Renderer::Renderer do
|
23
|
+
subject { Alephant::Renderer::Renderer.new(config, data) }
|
24
|
+
|
25
|
+
describe '#config' do
|
26
|
+
specify { expect(subject.config).to eql config }
|
20
27
|
end
|
21
|
-
end
|
22
28
|
|
23
|
-
|
24
|
-
|
25
|
-
describe "initialize(template_file, base_path, model)" do
|
26
|
-
context "template_file = :template_file" do
|
27
|
-
it "sets the attribute template_file" do
|
28
|
-
expect(subject.new(template_file, base_path, model).template_file).to eq(template_file)
|
29
|
-
end
|
30
|
-
end
|
29
|
+
describe '#data' do
|
30
|
+
specify { expect(subject.data).to eql data }
|
31
31
|
end
|
32
32
|
|
33
|
-
describe
|
34
|
-
it
|
35
|
-
|
36
|
-
template = instance.template
|
37
|
-
expect(template).to eq("{{content}}\n")
|
33
|
+
describe '#views' do
|
34
|
+
it 'returns a Hash' do
|
35
|
+
expect(subject.views).to be_a Hash
|
38
36
|
end
|
39
|
-
end
|
40
37
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
38
|
+
context 'using three Models' do
|
39
|
+
it 'returns three Views in Hash' do
|
40
|
+
expect(subject.views.length).to eql 3
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'using `bar`, `foo`, `json` models' do
|
45
|
+
it 'contains a View for `bar` model' do
|
46
|
+
expect(subject.views.key? 'bar').to be
|
47
|
+
end
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
.and_return(:template)
|
49
|
+
it 'contains a View for `foo` model' do
|
50
|
+
expect(subject.views.key? 'foo').to be
|
51
|
+
end
|
53
52
|
|
54
|
-
|
53
|
+
it 'contains a View for `json` model' do
|
54
|
+
expect(subject.views.key? 'json').to be
|
55
|
+
end
|
55
56
|
end
|
56
57
|
end
|
57
58
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
$: << File.join(File.dirname(__FILE__),"..", "lib")
|
2
2
|
|
3
3
|
require 'pry'
|
4
|
+
|
4
5
|
require 'alephant/renderer'
|
5
|
-
require 'alephant/views
|
6
|
+
require 'alephant/renderer/views'
|
7
|
+
require 'alephant/renderer/views/json'
|
8
|
+
require 'alephant/renderer/views/html'
|
9
|
+
require 'alephant/renderer/view_mapper'
|
6
10
|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Alephant::Renderer::ViewMapper do
|
4
|
+
let(:component_id) { :foo }
|
5
|
+
let(:data) {{ :foo => :bar }}
|
6
|
+
let(:path) { File.join(File.dirname(__FILE__), 'fixtures/components') }
|
7
|
+
|
8
|
+
subject { Alephant::Renderer::ViewMapper }
|
9
|
+
|
10
|
+
describe "initialize(view_base_path)" do
|
11
|
+
context "view_base_path = invalid_path" do
|
12
|
+
it "should raise an error" do
|
13
|
+
expect {
|
14
|
+
subject.new(component_id, './invalid_path')
|
15
|
+
}.to raise_error
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "view_base_path = '.'" do
|
20
|
+
it "sets base_path" do
|
21
|
+
expect(
|
22
|
+
subject.new(component_id, path).base_path
|
23
|
+
).to eq("#{path}/#{component_id}")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "view_base_path = nil" do
|
28
|
+
it "sets base_path" do
|
29
|
+
expect(
|
30
|
+
subject.new(component_id).base_path
|
31
|
+
).to eq(Alephant::Renderer::ViewMapper::DEFAULT_LOCATION)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "generate(data)" do
|
37
|
+
it "calls create_renderer for each template found" do
|
38
|
+
expect(
|
39
|
+
subject.new(component_id, path).generate(data).size
|
40
|
+
).to eq(3)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fixtures/components/foo/models/json'
|
3
|
+
|
4
|
+
describe Alephant::Renderer::Views::Json do
|
5
|
+
let(:data) { {'foo' => 'test', 'bar' => 'white', 'baz' => 'list'} }
|
6
|
+
|
7
|
+
describe "#content_type" do
|
8
|
+
|
9
|
+
it "sets the correct content type" do
|
10
|
+
expect(MyApp::Json.new(data).content_type).to eq('application/json')
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#to_h" do
|
16
|
+
|
17
|
+
it "generates a hash based on the white list" do
|
18
|
+
expected_result = {'item1' => 'test', 'item2' => 'white'}
|
19
|
+
expect(MyApp::Json.new(data).to_h).to eq(expected_result)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#render" do
|
25
|
+
|
26
|
+
it "returns generated json" do
|
27
|
+
expected_result = "{\"item1\":\"test\",\"item2\":\"white\"}"
|
28
|
+
expect(MyApp::Json.new(data).render).to eq(expected_result)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
metadata
CHANGED
@@ -1,198 +1,212 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alephant-renderer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Kenny
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
15
|
-
version_requirements: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - '>='
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
15
|
requirement: !ruby/object:Gem::Requirement
|
21
16
|
requirements:
|
22
17
|
- - '>='
|
23
18
|
- !ruby/object:Gem::Version
|
24
19
|
version: '0'
|
25
|
-
prerelease: false
|
26
20
|
type: :development
|
27
|
-
|
28
|
-
name: rspec-nc
|
21
|
+
prerelease: false
|
29
22
|
version_requirements: !ruby/object:Gem::Requirement
|
30
23
|
requirements:
|
31
24
|
- - '>='
|
32
25
|
- !ruby/object:Gem::Version
|
33
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec-nc
|
34
29
|
requirement: !ruby/object:Gem::Requirement
|
35
30
|
requirements:
|
36
31
|
- - '>='
|
37
32
|
- !ruby/object:Gem::Version
|
38
33
|
version: '0'
|
39
|
-
prerelease: false
|
40
34
|
type: :development
|
41
|
-
|
42
|
-
name: guard
|
35
|
+
prerelease: false
|
43
36
|
version_requirements: !ruby/object:Gem::Requirement
|
44
37
|
requirements:
|
45
38
|
- - '>='
|
46
39
|
- !ruby/object:Gem::Version
|
47
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: guard
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
44
|
requirements:
|
50
45
|
- - '>='
|
51
46
|
- !ruby/object:Gem::Version
|
52
47
|
version: '0'
|
53
|
-
prerelease: false
|
54
48
|
type: :development
|
55
|
-
|
56
|
-
name: guard-rspec
|
49
|
+
prerelease: false
|
57
50
|
version_requirements: !ruby/object:Gem::Requirement
|
58
51
|
requirements:
|
59
52
|
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: guard-rspec
|
62
57
|
requirement: !ruby/object:Gem::Requirement
|
63
58
|
requirements:
|
64
59
|
- - '>='
|
65
60
|
- !ruby/object:Gem::Version
|
66
61
|
version: '0'
|
67
|
-
prerelease: false
|
68
62
|
type: :development
|
69
|
-
|
70
|
-
name: pry
|
63
|
+
prerelease: false
|
71
64
|
version_requirements: !ruby/object:Gem::Requirement
|
72
65
|
requirements:
|
73
66
|
- - '>='
|
74
67
|
- !ruby/object:Gem::Version
|
75
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry
|
76
71
|
requirement: !ruby/object:Gem::Requirement
|
77
72
|
requirements:
|
78
73
|
- - '>='
|
79
74
|
- !ruby/object:Gem::Version
|
80
75
|
version: '0'
|
81
|
-
prerelease: false
|
82
76
|
type: :development
|
83
|
-
|
84
|
-
name: pry-remote
|
77
|
+
prerelease: false
|
85
78
|
version_requirements: !ruby/object:Gem::Requirement
|
86
79
|
requirements:
|
87
80
|
- - '>='
|
88
81
|
- !ruby/object:Gem::Version
|
89
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry-remote
|
90
85
|
requirement: !ruby/object:Gem::Requirement
|
91
86
|
requirements:
|
92
87
|
- - '>='
|
93
88
|
- !ruby/object:Gem::Version
|
94
89
|
version: '0'
|
95
|
-
prerelease: false
|
96
90
|
type: :development
|
97
|
-
|
98
|
-
name: pry-nav
|
91
|
+
prerelease: false
|
99
92
|
version_requirements: !ruby/object:Gem::Requirement
|
100
93
|
requirements:
|
101
94
|
- - '>='
|
102
95
|
- !ruby/object:Gem::Version
|
103
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry-nav
|
104
99
|
requirement: !ruby/object:Gem::Requirement
|
105
100
|
requirements:
|
106
101
|
- - '>='
|
107
102
|
- !ruby/object:Gem::Version
|
108
103
|
version: '0'
|
109
|
-
prerelease: false
|
110
104
|
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: bundler
|
113
|
-
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - ~>
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '1.5'
|
118
|
-
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
119
121
|
requirements:
|
120
122
|
- - ~>
|
121
123
|
- !ruby/object:Gem::Version
|
122
124
|
version: '1.5'
|
123
|
-
prerelease: false
|
124
|
-
type: :development
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: rake
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
127
134
|
version_requirements: !ruby/object:Gem::Requirement
|
128
135
|
requirements:
|
129
136
|
- - '>='
|
130
137
|
- !ruby/object:Gem::Version
|
131
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rake-rspec
|
132
141
|
requirement: !ruby/object:Gem::Requirement
|
133
142
|
requirements:
|
134
143
|
- - '>='
|
135
144
|
- !ruby/object:Gem::Version
|
136
145
|
version: '0'
|
137
|
-
prerelease: false
|
138
146
|
type: :development
|
139
|
-
|
140
|
-
name: i18n
|
147
|
+
prerelease: false
|
141
148
|
version_requirements: !ruby/object:Gem::Requirement
|
142
149
|
requirements:
|
143
150
|
- - '>='
|
144
151
|
- !ruby/object:Gem::Version
|
145
152
|
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: i18n
|
146
155
|
requirement: !ruby/object:Gem::Requirement
|
147
156
|
requirements:
|
148
157
|
- - '>='
|
149
158
|
- !ruby/object:Gem::Version
|
150
159
|
version: '0'
|
151
|
-
prerelease: false
|
152
160
|
type: :runtime
|
153
|
-
|
154
|
-
name: mustache
|
161
|
+
prerelease: false
|
155
162
|
version_requirements: !ruby/object:Gem::Requirement
|
156
163
|
requirements:
|
157
164
|
- - '>='
|
158
165
|
- !ruby/object:Gem::Version
|
159
|
-
version: 0
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: mustache
|
160
169
|
requirement: !ruby/object:Gem::Requirement
|
161
170
|
requirements:
|
162
171
|
- - '>='
|
163
172
|
- !ruby/object:Gem::Version
|
164
173
|
version: 0.99.5
|
165
|
-
prerelease: false
|
166
174
|
type: :runtime
|
167
|
-
|
168
|
-
name: alephant-logger
|
175
|
+
prerelease: false
|
169
176
|
version_requirements: !ruby/object:Gem::Requirement
|
170
177
|
requirements:
|
171
178
|
- - '>='
|
172
179
|
- !ruby/object:Gem::Version
|
173
|
-
version:
|
180
|
+
version: 0.99.5
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: alephant-logger
|
174
183
|
requirement: !ruby/object:Gem::Requirement
|
175
184
|
requirements:
|
176
185
|
- - '>='
|
177
186
|
- !ruby/object:Gem::Version
|
178
187
|
version: '0'
|
179
|
-
prerelease: false
|
180
188
|
type: :runtime
|
181
|
-
|
182
|
-
name: hashie
|
189
|
+
prerelease: false
|
183
190
|
version_requirements: !ruby/object:Gem::Requirement
|
184
191
|
requirements:
|
185
192
|
- - '>='
|
186
193
|
- !ruby/object:Gem::Version
|
187
194
|
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: hashie
|
188
197
|
requirement: !ruby/object:Gem::Requirement
|
189
198
|
requirements:
|
190
199
|
- - '>='
|
191
200
|
- !ruby/object:Gem::Version
|
192
201
|
version: '0'
|
193
|
-
prerelease: false
|
194
202
|
type: :runtime
|
195
|
-
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - '>='
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
209
|
+
description:
|
196
210
|
email:
|
197
211
|
- kenoir@gmail.com
|
198
212
|
executables: []
|
@@ -209,25 +223,26 @@ files:
|
|
209
223
|
- Rakefile
|
210
224
|
- alephant-renderer.gemspec
|
211
225
|
- lib/alephant/renderer.rb
|
212
|
-
- lib/alephant/renderer/engines/mustache.rb
|
213
226
|
- lib/alephant/renderer/version.rb
|
214
|
-
- lib/alephant/
|
215
|
-
- lib/alephant/views
|
227
|
+
- lib/alephant/renderer/view_mapper.rb
|
228
|
+
- lib/alephant/renderer/views.rb
|
229
|
+
- lib/alephant/renderer/views/base.rb
|
230
|
+
- lib/alephant/renderer/views/html.rb
|
231
|
+
- lib/alephant/renderer/views/json.rb
|
232
|
+
- spec/fixtures/components/foo/models/bar.rb
|
216
233
|
- spec/fixtures/components/foo/models/foo.rb
|
217
|
-
- spec/fixtures/components/foo/models/
|
218
|
-
- spec/
|
219
|
-
- spec/fixtures/components/foo/templates/foo.mustache
|
220
|
-
- spec/fixtures/components/locale/cy.yml
|
221
|
-
- spec/fixtures/components/locale/en.yml
|
234
|
+
- spec/fixtures/components/foo/models/json.rb
|
235
|
+
- spec/integration/spec_helper.rb
|
222
236
|
- spec/renderer_spec.rb
|
223
237
|
- spec/spec_helper.rb
|
224
|
-
- spec/
|
238
|
+
- spec/view_mapper_spec.rb
|
239
|
+
- spec/views_json_spec.rb
|
225
240
|
- trans.yml
|
226
241
|
homepage: ''
|
227
242
|
licenses:
|
228
243
|
- MIT
|
229
244
|
metadata: {}
|
230
|
-
post_install_message:
|
245
|
+
post_install_message:
|
231
246
|
rdoc_options: []
|
232
247
|
require_paths:
|
233
248
|
- lib
|
@@ -242,18 +257,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
242
257
|
- !ruby/object:Gem::Version
|
243
258
|
version: '0'
|
244
259
|
requirements: []
|
245
|
-
rubyforge_project:
|
246
|
-
rubygems_version: 2.
|
247
|
-
signing_key:
|
260
|
+
rubyforge_project:
|
261
|
+
rubygems_version: 2.2.2
|
262
|
+
signing_key:
|
248
263
|
specification_version: 4
|
249
264
|
summary: Render HTML snippets
|
250
265
|
test_files:
|
266
|
+
- spec/fixtures/components/foo/models/bar.rb
|
251
267
|
- spec/fixtures/components/foo/models/foo.rb
|
252
|
-
- spec/fixtures/components/foo/models/
|
253
|
-
- spec/
|
254
|
-
- spec/fixtures/components/foo/templates/foo.mustache
|
255
|
-
- spec/fixtures/components/locale/cy.yml
|
256
|
-
- spec/fixtures/components/locale/en.yml
|
268
|
+
- spec/fixtures/components/foo/models/json.rb
|
269
|
+
- spec/integration/spec_helper.rb
|
257
270
|
- spec/renderer_spec.rb
|
258
271
|
- spec/spec_helper.rb
|
259
|
-
- spec/
|
272
|
+
- spec/view_mapper_spec.rb
|
273
|
+
- spec/views_json_spec.rb
|
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'alephant/logger'
|
2
|
-
require 'mustache'
|
3
|
-
require 'i18n'
|
4
|
-
|
5
|
-
module Alephant
|
6
|
-
module Renderer
|
7
|
-
class Mustache
|
8
|
-
include ::Alephant::Logger
|
9
|
-
|
10
|
-
attr_reader :template_file
|
11
|
-
|
12
|
-
def initialize(template_file, base_path, model)
|
13
|
-
@template_file = template_file
|
14
|
-
@base_path = base_path
|
15
|
-
@model = model
|
16
|
-
|
17
|
-
load_translations_from base_path
|
18
|
-
|
19
|
-
logger.info("Renderer.initialize: end with @base_path set to #{@base_path}")
|
20
|
-
end
|
21
|
-
|
22
|
-
def render
|
23
|
-
logger.info("Renderer.render: rendered template #{template_file}")
|
24
|
-
::Mustache.render(template, @model)
|
25
|
-
end
|
26
|
-
|
27
|
-
def template
|
28
|
-
template_location = File.join(@base_path, 'templates', "#{template_file}.mustache")
|
29
|
-
|
30
|
-
begin
|
31
|
-
logger.info("Renderer.template: #{template_location}")
|
32
|
-
File.open(template_location).read
|
33
|
-
rescue Exception => e
|
34
|
-
logger.error("Renderer.template: view template #{template_file} not found")
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def load_translations_from(base_path)
|
41
|
-
if I18n.load_path.empty?
|
42
|
-
I18n.config.enforce_available_locales = false
|
43
|
-
I18n.load_path = i18n_load_path_from(base_path)
|
44
|
-
I18n.backend.load_translations
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def i18n_load_path_from(base_path)
|
49
|
-
Dir[
|
50
|
-
File.join(
|
51
|
-
Pathname.new(base_path).parent,
|
52
|
-
'locale',
|
53
|
-
'*.yml')
|
54
|
-
]
|
55
|
-
.flatten
|
56
|
-
.uniq
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
data/lib/alephant/views.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'alephant/views/base'
|
2
|
-
|
3
|
-
module Alephant
|
4
|
-
module Views
|
5
|
-
@@views = {}
|
6
|
-
|
7
|
-
def self.register(klass)
|
8
|
-
id = ::Alephant::Views.underscorify(
|
9
|
-
klass.name.split('::').last
|
10
|
-
)
|
11
|
-
|
12
|
-
@@views[id] = klass
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.get_registered_class(id)
|
16
|
-
@@views[id]
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.underscorify(str)
|
20
|
-
str.gsub(/::/, '/').
|
21
|
-
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
22
|
-
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
23
|
-
tr("-", "_").
|
24
|
-
downcase
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
data/lib/alephant/views/base.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'mustache'
|
2
|
-
require 'alephant/views'
|
3
|
-
require 'hashie'
|
4
|
-
require 'json'
|
5
|
-
require 'i18n'
|
6
|
-
|
7
|
-
module Alephant::Views
|
8
|
-
class Base < Mustache
|
9
|
-
attr_accessor :data
|
10
|
-
|
11
|
-
def initialize(data = {})
|
12
|
-
@data = Hashie::Mash.new data
|
13
|
-
end
|
14
|
-
|
15
|
-
def locale
|
16
|
-
:en
|
17
|
-
end
|
18
|
-
|
19
|
-
def t(key, params = {})
|
20
|
-
I18n.locale = locale
|
21
|
-
prefix = /\/([^\/]+)\.mustache/.match(template_file)[1]
|
22
|
-
params.merge! :default => key unless params[:default]
|
23
|
-
translation = I18n.translate("#{prefix}.#{key}", params)
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.inherited(subclass)
|
27
|
-
::Alephant::Views.register(subclass)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
@@ -1 +0,0 @@
|
|
1
|
-
{{content}}
|
@@ -1 +0,0 @@
|
|
1
|
-
{{content}}
|
data/spec/views_base_spec.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'fixtures/components/foo/models/welsh'
|
3
|
-
|
4
|
-
describe Alephant::Views::Base do
|
5
|
-
let(:base_path) do
|
6
|
-
File.join(
|
7
|
-
File.dirname(__FILE__),
|
8
|
-
'fixtures',
|
9
|
-
'components',
|
10
|
-
'foo'
|
11
|
-
)
|
12
|
-
end
|
13
|
-
|
14
|
-
describe "t(key, param{})" do
|
15
|
-
it "Translates a key for the default locale" do
|
16
|
-
Alephant::Renderer.create('foo', base_path, :model)
|
17
|
-
|
18
|
-
expect(subject.t('bar')).to eq('Translation')
|
19
|
-
end
|
20
|
-
|
21
|
-
it "Translates a key for an overridden locale" do
|
22
|
-
Alephant::Renderer.create('welsh', base_path, :model)
|
23
|
-
|
24
|
-
expect(Fixtures::Welsh.new.t('bar')).to eq('Welsh Translation')
|
25
|
-
end
|
26
|
-
|
27
|
-
it "Uses the translation keys value if no translation and no default set" do
|
28
|
-
Alephant::Renderer.create('welsh', base_path, :model)
|
29
|
-
|
30
|
-
expect(Fixtures::Welsh.new.t('non_existent')).to eq('non_existent')
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe "t(key, param{:default => 'A default'})" do
|
35
|
-
it "Uses the passed in default if translation key does not exist" do
|
36
|
-
Alephant::Renderer.create('welsh', base_path, :model)
|
37
|
-
|
38
|
-
expect(Fixtures::Welsh.new.t('non_existent', :default => 'A default')).to eq('A default')
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|