arbre 1.0.3 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +51 -2
- data/README.md +25 -92
- data/docs/Gemfile +2 -0
- data/docs/_config.yml +7 -0
- data/docs/_includes/footer.html +8 -0
- data/docs/_includes/google-analytics.html +16 -0
- data/docs/_includes/head.html +7 -0
- data/docs/_includes/toc.html +12 -0
- data/docs/_includes/top-menu.html +8 -0
- data/docs/_layouts/default.html +21 -0
- data/docs/index.md +106 -0
- data/docs/stylesheets/main.css +1152 -0
- data/lib/arbre/context.rb +3 -2
- data/lib/arbre/element.rb +4 -2
- data/lib/arbre/element/builder_methods.rb +4 -5
- data/lib/arbre/html/tag.rb +4 -1
- data/lib/arbre/rails/template_handler.rb +4 -2
- data/lib/arbre/version.rb +1 -1
- metadata +46 -73
- data/.gitignore +0 -10
- data/.travis.yml +0 -4
- data/Gemfile +0 -16
- data/Rakefile +0 -18
- data/arbre.gemspec +0 -22
- data/spec/arbre/integration/html_spec.rb +0 -250
- data/spec/arbre/unit/component_spec.rb +0 -44
- data/spec/arbre/unit/context_spec.rb +0 -35
- data/spec/arbre/unit/element_finder_methods_spec.rb +0 -116
- data/spec/arbre/unit/element_spec.rb +0 -271
- data/spec/arbre/unit/html/class_list_spec.rb +0 -16
- data/spec/arbre/unit/html/tag_attributes_spec.rb +0 -62
- data/spec/arbre/unit/html/tag_spec.rb +0 -103
- data/spec/arbre/unit/html/text_node_spec.rb +0 -5
- data/spec/rails/integration/forms_spec.rb +0 -105
- data/spec/rails/integration/rendering_spec.rb +0 -83
- data/spec/rails/rails_spec_helper.rb +0 -46
- data/spec/rails/stub_app/config/database.yml +0 -3
- data/spec/rails/stub_app/config/routes.rb +0 -3
- data/spec/rails/stub_app/db/schema.rb +0 -3
- data/spec/rails/stub_app/log/.gitignore +0 -1
- data/spec/rails/stub_app/public/favicon.ico +0 -0
- data/spec/rails/support/mock_person.rb +0 -15
- data/spec/rails/templates/arbre/_partial.arb +0 -1
- data/spec/rails/templates/arbre/_partial_with_assignment.arb +0 -1
- data/spec/rails/templates/arbre/empty.arb +0 -0
- data/spec/rails/templates/arbre/page_with_arb_partial_and_assignment.arb +0 -3
- data/spec/rails/templates/arbre/page_with_assignment.arb +0 -1
- data/spec/rails/templates/arbre/page_with_erb_partial.arb +0 -3
- data/spec/rails/templates/arbre/page_with_partial.arb +0 -3
- data/spec/rails/templates/arbre/simple_page.arb +0 -8
- data/spec/rails/templates/erb/_partial.erb +0 -1
- data/spec/spec_helper.rb +0 -7
- data/spec/support/bundle.rb +0 -4
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Arbre::HTML::ClassList do
|
4
|
-
|
5
|
-
describe ".build_from_string" do
|
6
|
-
|
7
|
-
it "should build a new list from a string of classes" do
|
8
|
-
list = Arbre::HTML::ClassList.build_from_string("first second")
|
9
|
-
expect(list.size).to eq(2)
|
10
|
-
|
11
|
-
expect(list).to match_array(%w{first second})
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Arbre::HTML::Tag, "Attributes" do
|
4
|
-
|
5
|
-
let(:tag){ Arbre::HTML::Tag.new }
|
6
|
-
|
7
|
-
describe "attributes" do
|
8
|
-
|
9
|
-
before { tag.build id: "my_id" }
|
10
|
-
|
11
|
-
it "should have an attributes hash" do
|
12
|
-
expect(tag.attributes).to eq({id: "my_id"})
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should render the attributes to html" do
|
16
|
-
expect(tag.to_s).to eq "<tag id=\"my_id\"></tag>\n"
|
17
|
-
end
|
18
|
-
|
19
|
-
it "shouldn't render attributes that are empty" do
|
20
|
-
tag.class_list # initializes an empty ClassList
|
21
|
-
tag.set_attribute :foo, ''
|
22
|
-
tag.set_attribute :bar, nil
|
23
|
-
|
24
|
-
expect(tag.to_s).to eq "<tag id=\"my_id\"></tag>\n"
|
25
|
-
end
|
26
|
-
|
27
|
-
it "should get an attribute value" do
|
28
|
-
expect(tag.attr(:id)).to eq("my_id")
|
29
|
-
end
|
30
|
-
|
31
|
-
describe "#has_attribute?" do
|
32
|
-
context "when the attribute exists" do
|
33
|
-
it "should return true" do
|
34
|
-
expect(tag.has_attribute?(:id)).to eq(true)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
context "when the attribute does not exist" do
|
39
|
-
it "should return false" do
|
40
|
-
expect(tag.has_attribute?(:class)).to eq(false)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
it "should remove an attribute" do
|
46
|
-
expect(tag.attributes).to eq({id: "my_id"})
|
47
|
-
expect(tag.remove_attribute(:id)).to eq("my_id")
|
48
|
-
expect(tag.attributes).to eq({})
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
describe "rendering attributes" do
|
53
|
-
it "should html safe the attribute values" do
|
54
|
-
tag.set_attribute(:class, '">bad things!')
|
55
|
-
expect(tag.to_s).to eq "<tag class=\"">bad things!\"></tag>\n"
|
56
|
-
end
|
57
|
-
it "should should escape the attribute names" do
|
58
|
-
tag.set_attribute(">bad", "things")
|
59
|
-
expect(tag.to_s).to eq "<tag >bad=\"things\"></tag>\n"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
@@ -1,103 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Arbre::HTML::Tag do
|
4
|
-
|
5
|
-
let(:tag){ Arbre::HTML::Tag.new }
|
6
|
-
|
7
|
-
describe "building a new tag" do
|
8
|
-
before { tag.build "Hello World", id: "my_id" }
|
9
|
-
|
10
|
-
it "should set the contents to a string" do
|
11
|
-
expect(tag.content).to eq("Hello World")
|
12
|
-
end
|
13
|
-
|
14
|
-
it "should set the hash of options to the attributes" do
|
15
|
-
expect(tag.attributes).to eq({ id: "my_id" })
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe "creating a tag 'for' an object" do
|
20
|
-
let(:model_name){ double(singular: "resource_class")}
|
21
|
-
let(:resource_class){ double(model_name: model_name) }
|
22
|
-
let(:resource){ double(class: resource_class, to_key: ['5'])}
|
23
|
-
|
24
|
-
before do
|
25
|
-
tag.build for: resource
|
26
|
-
end
|
27
|
-
it "should set the id to the type and id" do
|
28
|
-
expect(tag.id).to eq("resource_class_5")
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should add a class name" do
|
32
|
-
expect(tag.class_list).to include("resource_class")
|
33
|
-
end
|
34
|
-
|
35
|
-
|
36
|
-
describe "for an object that doesn't have a model_name" do
|
37
|
-
let(:resource_class){ double(name: 'ResourceClass') }
|
38
|
-
|
39
|
-
before do
|
40
|
-
tag.build for: resource
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should set the id to the type and id" do
|
44
|
-
expect(tag.id).to eq("resource_class_5")
|
45
|
-
end
|
46
|
-
|
47
|
-
it "should add a class name" do
|
48
|
-
expect(tag.class_list).to include("resource_class")
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
describe "with a default_id_for_prefix" do
|
53
|
-
|
54
|
-
let(:tag) do
|
55
|
-
Class.new(Arbre::HTML::Tag) do
|
56
|
-
def default_id_for_prefix
|
57
|
-
"a_prefix"
|
58
|
-
end
|
59
|
-
end.new
|
60
|
-
end
|
61
|
-
|
62
|
-
it "should set the id to the type and id" do
|
63
|
-
expect(tag.id).to eq("a_prefix_resource_class_5")
|
64
|
-
end
|
65
|
-
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
describe "css class names" do
|
70
|
-
|
71
|
-
it "should add a class" do
|
72
|
-
tag.add_class "hello_world"
|
73
|
-
expect(tag.class_names).to eq("hello_world")
|
74
|
-
end
|
75
|
-
|
76
|
-
it "should remove_class" do
|
77
|
-
tag.add_class "hello_world"
|
78
|
-
expect(tag.class_names).to eq("hello_world")
|
79
|
-
tag.remove_class "hello_world"
|
80
|
-
expect(tag.class_names).to eq("")
|
81
|
-
end
|
82
|
-
|
83
|
-
it "should not add a class if it already exists" do
|
84
|
-
tag.add_class "hello_world"
|
85
|
-
tag.add_class "hello_world"
|
86
|
-
expect(tag.class_names).to eq("hello_world")
|
87
|
-
end
|
88
|
-
|
89
|
-
it "should seperate classes with space" do
|
90
|
-
tag.add_class "hello world"
|
91
|
-
expect(tag.class_list.size).to eq(2)
|
92
|
-
end
|
93
|
-
|
94
|
-
it "should create a class list from a string" do
|
95
|
-
tag = Arbre::HTML::Tag.new
|
96
|
-
tag.build(class: "first-class")
|
97
|
-
tag.add_class "second-class"
|
98
|
-
expect(tag.class_list.size).to eq(2)
|
99
|
-
end
|
100
|
-
|
101
|
-
end
|
102
|
-
|
103
|
-
end
|
@@ -1,105 +0,0 @@
|
|
1
|
-
require 'rails/rails_spec_helper'
|
2
|
-
|
3
|
-
describe "Building forms" do
|
4
|
-
|
5
|
-
let(:assigns){ {} }
|
6
|
-
let(:helpers){ mock_action_view }
|
7
|
-
let(:html) { form.to_s }
|
8
|
-
|
9
|
-
describe "building a simple form for" do
|
10
|
-
|
11
|
-
let(:form) do
|
12
|
-
arbre do
|
13
|
-
form_for MockPerson.new, url: "/" do |f|
|
14
|
-
f.label :name
|
15
|
-
f.text_field :name
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should build a form" do
|
21
|
-
expect(html).to have_selector("form")
|
22
|
-
end
|
23
|
-
|
24
|
-
it "should include the hidden authenticity token" do
|
25
|
-
expect(html).to include '<input type="hidden" name="authenticity_token" value="AUTH_TOKEN" />'
|
26
|
-
end
|
27
|
-
|
28
|
-
it "should create a label" do
|
29
|
-
expect(html).to have_selector("form label[for=mock_person_name]")
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should create a text field" do
|
33
|
-
expect(html).to have_selector("form input[type=text]")
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
|
38
|
-
describe "building a form with fields for" do
|
39
|
-
|
40
|
-
let(:form) do
|
41
|
-
arbre do
|
42
|
-
form_for MockPerson.new, url: "/" do |f|
|
43
|
-
f.label :name
|
44
|
-
f.text_field :name
|
45
|
-
f.fields_for :permission do |pf|
|
46
|
-
pf.label :admin
|
47
|
-
pf.check_box :admin
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
it "should render nested label" do
|
54
|
-
expect(html).to have_selector("form label[for=mock_person_permission_admin]", text: "Admin")
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should render nested label" do
|
58
|
-
expect(html).to have_selector("form input[type=checkbox][name='mock_person[permission][admin]']")
|
59
|
-
end
|
60
|
-
|
61
|
-
it "should not render a div for the proxy" do
|
62
|
-
expect(html).not_to have_selector("form div.fields_for_proxy")
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
describe "forms with other elements" do
|
68
|
-
let(:form) do
|
69
|
-
arbre do
|
70
|
-
form_for MockPerson.new, url: "/" do |f|
|
71
|
-
|
72
|
-
div do
|
73
|
-
f.label :name
|
74
|
-
f.text_field :name
|
75
|
-
end
|
76
|
-
|
77
|
-
para do
|
78
|
-
f.label :name
|
79
|
-
f.text_field :name
|
80
|
-
end
|
81
|
-
|
82
|
-
div class: "permissions" do
|
83
|
-
f.fields_for :permission do |pf|
|
84
|
-
div class: "permissions_label" do
|
85
|
-
pf.label :admin
|
86
|
-
end
|
87
|
-
pf.check_box :admin
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
it "should correctly nest elements" do
|
96
|
-
expect(html).to have_selector("form > p > label")
|
97
|
-
end
|
98
|
-
|
99
|
-
it "should correnctly nest elements within fields for" do
|
100
|
-
expect(html).to have_selector("form > div.permissions > div.permissions_label label")
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
|
105
|
-
end
|
@@ -1,83 +0,0 @@
|
|
1
|
-
require 'rails/rails_spec_helper'
|
2
|
-
|
3
|
-
ARBRE_VIEWS_PATH = File.expand_path("../../templates", __FILE__)
|
4
|
-
|
5
|
-
class TestController < ActionController::Base
|
6
|
-
append_view_path ARBRE_VIEWS_PATH
|
7
|
-
|
8
|
-
def render_empty
|
9
|
-
render "arbre/empty"
|
10
|
-
end
|
11
|
-
|
12
|
-
def render_simple_page
|
13
|
-
render "arbre/simple_page"
|
14
|
-
end
|
15
|
-
|
16
|
-
def render_partial
|
17
|
-
render "arbre/page_with_partial"
|
18
|
-
end
|
19
|
-
|
20
|
-
def render_erb_partial
|
21
|
-
render "arbre/page_with_erb_partial"
|
22
|
-
end
|
23
|
-
|
24
|
-
def render_with_instance_variable
|
25
|
-
@my_instance_var = "From Instance Var"
|
26
|
-
render "arbre/page_with_assignment"
|
27
|
-
end
|
28
|
-
|
29
|
-
def render_partial_with_instance_variable
|
30
|
-
@my_instance_var = "From Instance Var"
|
31
|
-
render "arbre/page_with_arb_partial_and_assignment"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
|
36
|
-
describe TestController, "Rendering with Arbre", type: :request do
|
37
|
-
let(:body){ response.body }
|
38
|
-
|
39
|
-
it "should render the empty template" do
|
40
|
-
get "/test/render_empty"
|
41
|
-
expect(response).to be_success
|
42
|
-
end
|
43
|
-
|
44
|
-
it "should render a simple page" do
|
45
|
-
get "/test/render_simple_page"
|
46
|
-
expect(response).to be_success
|
47
|
-
expect(body).to have_selector("h1", text: "Hello World")
|
48
|
-
expect(body).to have_selector("p", text: "Hello again!")
|
49
|
-
end
|
50
|
-
|
51
|
-
it "should render an arb partial" do
|
52
|
-
get "/test/render_partial"
|
53
|
-
expect(response).to be_success
|
54
|
-
expect(body).to eq <<-EOS
|
55
|
-
<h1>Before Partial</h1>
|
56
|
-
<p>Hello from a partial</p>
|
57
|
-
<h2>After Partial</h2>
|
58
|
-
EOS
|
59
|
-
end
|
60
|
-
|
61
|
-
it "should render an erb (or other) partial" do
|
62
|
-
get "/test/render_erb_partial"
|
63
|
-
expect(response).to be_success
|
64
|
-
expect(body).to eq <<-EOS
|
65
|
-
<h1>Before Partial</h1>
|
66
|
-
<p>Hello from an erb partial</p>
|
67
|
-
<h2>After Partial</h2>
|
68
|
-
EOS
|
69
|
-
end
|
70
|
-
|
71
|
-
it "should render with instance variables" do
|
72
|
-
get "/test/render_with_instance_variable"
|
73
|
-
expect(response).to be_success
|
74
|
-
expect(body).to have_selector("h1", text: "From Instance Var")
|
75
|
-
end
|
76
|
-
|
77
|
-
it "should render an arbre partial with assignments" do
|
78
|
-
get "/test/render_partial_with_instance_variable"
|
79
|
-
expect(response).to be_success
|
80
|
-
expect(body).to have_selector("p", text: "Partial: From Instance Var")
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bundler/setup'
|
3
|
-
|
4
|
-
require 'combustion'
|
5
|
-
|
6
|
-
Combustion.path = 'spec/rails/stub_app'
|
7
|
-
Combustion.initialize! :action_controller,
|
8
|
-
:action_view
|
9
|
-
|
10
|
-
require 'rspec/rails'
|
11
|
-
require 'capybara/rspec'
|
12
|
-
require 'capybara/rails'
|
13
|
-
|
14
|
-
require 'spec_helper'
|
15
|
-
|
16
|
-
require 'rails/support/mock_person'
|
17
|
-
|
18
|
-
# Ensure that the rails plugin is installed
|
19
|
-
require 'arbre/rails'
|
20
|
-
|
21
|
-
Rails.application.routes.draw do
|
22
|
-
get 'test/:action', controller: "test"
|
23
|
-
end
|
24
|
-
|
25
|
-
module AdditionalHelpers
|
26
|
-
|
27
|
-
def protect_against_forgery?
|
28
|
-
true
|
29
|
-
end
|
30
|
-
|
31
|
-
def form_authenticity_token
|
32
|
-
"AUTH_TOKEN"
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
def mock_action_view(assigns = {})
|
38
|
-
controller = ActionView::TestCase::TestController.new
|
39
|
-
ActionView::Base.send :include, ActionView::Helpers
|
40
|
-
ActionView::Base.send :include, AdditionalHelpers
|
41
|
-
ActionView::Base.new(ActionController::Base.view_paths, assigns, controller)
|
42
|
-
end
|
43
|
-
|
44
|
-
RSpec.configure do |config|
|
45
|
-
config.include Capybara::RSpecMatchers
|
46
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
*.log
|
File without changes
|