styleus 0.0.3 → 0.0.4
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.
- data/README.rdoc +5 -0
- data/app/assets/stylesheets/styleus.css +13 -2
- data/app/assets/stylesheets/styleus/core.css.scss +0 -0
- data/app/assets/stylesheets/styleus/default_dimensions.css.scss.erb +10 -0
- data/app/assets/stylesheets/styleus/themes/base.css.scss +11 -0
- data/app/assets/stylesheets/{coderay.css.scss → styleus/themes/base/coderay.css.scss} +5 -5
- data/app/assets/stylesheets/styleus/themes/base/components/_article.css.scss +56 -0
- data/app/assets/stylesheets/styleus/{components → themes/base/components}/_representation_helpers.css.scss +0 -0
- data/app/assets/stylesheets/styleus/themes/base/layout/main.css.scss +15 -0
- data/app/assets/stylesheets/styleus/themes/base/settings/_colors.css.scss +7 -0
- data/app/controllers/components_controller.rb +29 -0
- data/app/helpers/styleus_helper.rb +20 -14
- data/app/models/styleus/base.rb +36 -0
- data/app/models/styleus/component.rb +5 -0
- data/app/models/styleus/view_component.rb +24 -0
- data/app/views/layouts/_styleus.html.erb +8 -2
- data/app/views/layouts/_styleus_context.html.erb +1 -0
- data/config/initializers/01_styleus_config.rb +8 -0
- data/config/initializers/02_init_container_routes.rb +1 -0
- data/config/routes.rb +7 -0
- data/lib/styleus.rb +1 -0
- data/lib/styleus/engine.rb +17 -4
- data/lib/styleus/spacable.rb +14 -0
- data/lib/styleus/version.rb +1 -1
- metadata +18 -11
- data/app/assets/stylesheets/styleus/_defaults.css.scss +0 -6
- data/app/assets/stylesheets/styleus/components/_mq_presenter.css.scss +0 -49
- data/app/assets/stylesheets/styleus/main.css.scss +0 -8
- data/app/assets/stylesheets/styleus/settings/_colors.css.scss +0 -2
- data/app/models/base.rb +0 -31
- data/app/models/component.rb +0 -3
- data/app/models/component_list.rb +0 -15
data/README.rdoc
CHANGED
@@ -10,4 +10,9 @@ of component lists with a simple anchor link menu.
|
|
10
10
|
The representations are done via partials
|
11
11
|
for each component with a _plain and a _sample file.
|
12
12
|
|
13
|
+
=== Conventions
|
14
|
+
* classes used by styleus are prefixed with __styleus
|
15
|
+
* classes are used only for css styles in styleus context
|
16
|
+
* javascripts are applied via data-* attributes
|
17
|
+
|
13
18
|
This project uses MIT-LICENSE.
|
@@ -1,4 +1,15 @@
|
|
1
1
|
/*
|
2
|
-
|
3
|
-
|
2
|
+
* # Including styles responsible for a clean representation
|
3
|
+
* # of foreign app styles.
|
4
|
+
*= require styleus/core
|
5
|
+
*
|
6
|
+
* # Styleus code highlighting is based on coderay so we
|
7
|
+
* # include a basic coderay styling, adjusted for our
|
8
|
+
* # base style.
|
9
|
+
*= require styleus/themes/base/coderay
|
10
|
+
*
|
11
|
+
* # Requiring a basic theme for the styleus layout frame
|
12
|
+
* # TODO (fh): think about moving this "decision" to the app.
|
13
|
+
*= require styleus/default_dimensions
|
14
|
+
*= require styleus/themes/base
|
4
15
|
*/
|
File without changes
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<% if Rails.configuration.styleus.use_default_dimensions %>
|
2
|
+
/* The maximum screen width should give all components
|
3
|
+
displayed in this guide enought space to unfold. */
|
4
|
+
$maximum_screen_width: <%= Rails.configuration.styleus.maximum_screen_size || 1680 %>px;
|
5
|
+
|
6
|
+
/* limiting the page width to a configurable maximum */
|
7
|
+
.__styleus_wrapper { width: 100%; }
|
8
|
+
<% end %>
|
9
|
+
|
10
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
@import url(http://fonts.googleapis.com/css?family=Oleo+Script:700);
|
2
|
+
@import url(http://fonts.googleapis.com/css?family=Didact+Gothic);
|
3
|
+
|
4
|
+
@import "compass";
|
5
|
+
@import "compass/reset";
|
6
|
+
@import "compass/css3";
|
7
|
+
|
8
|
+
@import 'base/settings/colors';
|
9
|
+
@import 'base/layout/main';
|
10
|
+
|
11
|
+
@import 'base/components/article';
|
@@ -1,8 +1,8 @@
|
|
1
1
|
.CodeRay {
|
2
|
-
|
3
|
-
|
2
|
+
|
3
|
+
background-color: #2B2B2B;
|
4
4
|
font-family: 'Courier New', 'Terminal', monospace;
|
5
|
-
color: #
|
5
|
+
color: #fff;
|
6
6
|
padding: 3px 5px;
|
7
7
|
overflow: auto;
|
8
8
|
font-size: 14px;
|
@@ -12,7 +12,7 @@
|
|
12
12
|
padding: 0px;
|
13
13
|
}
|
14
14
|
|
15
|
-
.tag { color: #
|
16
|
-
.string { color: #A5C261; }
|
15
|
+
.tag, .attribute-name { color: #E8BF6A; }
|
16
|
+
.string, .content { color: #A5C261; }
|
17
17
|
.comment { color: #BC9458; }
|
18
18
|
}
|
@@ -0,0 +1,56 @@
|
|
1
|
+
@mixin component {
|
2
|
+
overflow: hidden;
|
3
|
+
position: relative;
|
4
|
+
top: 0; left: 0;
|
5
|
+
}
|
6
|
+
|
7
|
+
@mixin ambient-font {
|
8
|
+
font-family: 'Didact Gothic';
|
9
|
+
color: $soft-text;
|
10
|
+
}
|
11
|
+
|
12
|
+
@mixin ambient-headline {
|
13
|
+
@include ambient-font;
|
14
|
+
font-size: 1.2em;
|
15
|
+
font-weight: bold;
|
16
|
+
}
|
17
|
+
|
18
|
+
@mixin article-side-padding {
|
19
|
+
@include box-sizing(border-box);
|
20
|
+
padding-left: 1em;
|
21
|
+
padding-right: 1em;
|
22
|
+
}
|
23
|
+
|
24
|
+
.__sg_article {
|
25
|
+
@include border-radius(3px);
|
26
|
+
@include box-shadow(0 2px 3px 0 #cdcdcd);
|
27
|
+
@include component;
|
28
|
+
background: $content_background;
|
29
|
+
margin-bottom: 1em;
|
30
|
+
min-height: 3em;
|
31
|
+
padding-top: 1em;
|
32
|
+
|
33
|
+
> h3 {
|
34
|
+
@include ambient-headline;
|
35
|
+
@include article-side-padding;
|
36
|
+
margin-bottom: 0.5em;
|
37
|
+
text-align: right;
|
38
|
+
}
|
39
|
+
|
40
|
+
.__sg_component, .CodeRay, .__code_note {
|
41
|
+
@include article-side-padding;
|
42
|
+
}
|
43
|
+
|
44
|
+
.__code_note {
|
45
|
+
@include ambient-font;
|
46
|
+
text-align: right;
|
47
|
+
margin-top: 0.5em;
|
48
|
+
margin-bottom: 0.3em;
|
49
|
+
}
|
50
|
+
|
51
|
+
.CodeRay {
|
52
|
+
@include border-radius(0 0 3px 3px);
|
53
|
+
padding-top: 1em;
|
54
|
+
padding-bottom: 1em;
|
55
|
+
}
|
56
|
+
}
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
body { background: $main_background; }
|
2
|
+
|
3
|
+
.__styleus_wrapper {
|
4
|
+
@include box-sizing(border-box);
|
5
|
+
padding: 3em 1em 1em 4em;
|
6
|
+
|
7
|
+
header {
|
8
|
+
h1 {
|
9
|
+
font-size: 5em;
|
10
|
+
font-family: "Oleo Script";
|
11
|
+
margin-bottom: 0.2em;
|
12
|
+
color: #332717;
|
13
|
+
}
|
14
|
+
}
|
15
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class ComponentsController < ApplicationController
|
2
|
+
layout 'components'
|
3
|
+
|
4
|
+
def index
|
5
|
+
render_for_components
|
6
|
+
end
|
7
|
+
|
8
|
+
def show
|
9
|
+
render_for_components
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def render_for_components
|
15
|
+
if components?
|
16
|
+
render "components/#{components}/#{params[:action]}"
|
17
|
+
else
|
18
|
+
render
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def components
|
23
|
+
params[:components]
|
24
|
+
end
|
25
|
+
|
26
|
+
def components?
|
27
|
+
!!params[:components]
|
28
|
+
end
|
29
|
+
end
|
@@ -1,17 +1,16 @@
|
|
1
1
|
module StyleusHelper
|
2
2
|
def styleus(comp_list = [])
|
3
|
-
|
3
|
+
@components = Styleus::ViewComponent.from_hashes(comp_list)
|
4
4
|
|
5
|
-
|
5
|
+
@component_list = @components.map do |component|
|
6
6
|
wrap_component component
|
7
7
|
end
|
8
8
|
|
9
|
-
component_menu
|
9
|
+
component_menu.concat(_joined_component_list)
|
10
10
|
end
|
11
11
|
|
12
|
+
|
12
13
|
def wrap_component(component)
|
13
|
-
# add component to linked list menu
|
14
|
-
#menu.push({ id: component.id, headline: component.headline }) if menu
|
15
14
|
_styleus_article_wrap(headline: component.headline, anchor_id: component.id) do
|
16
15
|
styleus_partials(component.partial_path)
|
17
16
|
end
|
@@ -23,24 +22,23 @@ module StyleusHelper
|
|
23
22
|
end
|
24
23
|
|
25
24
|
plain_template = _coderay_highlight_wrap("#{partial_path}.html.erb") do
|
26
|
-
render partial: "#{partial_path}
|
25
|
+
render partial: "#{partial_path}"
|
27
26
|
end
|
28
27
|
|
29
28
|
sample_template.concat(plain_template)
|
30
29
|
end
|
31
30
|
|
32
|
-
def component_menu
|
31
|
+
def component_menu
|
32
|
+
return if @components.empty?
|
33
33
|
content_tag 'nav' do
|
34
34
|
content_tag 'ul' do
|
35
|
-
content_tag_for(:li,
|
35
|
+
content_tag_for(:li, @components) do |component|
|
36
36
|
link_to component.headline, anchor: component.id
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
|
43
|
-
|
44
42
|
def _styleus_article_wrap(options = { }, &block)
|
45
43
|
captured_block = capture(&block)
|
46
44
|
|
@@ -55,18 +53,26 @@ module StyleusHelper
|
|
55
53
|
|
56
54
|
def _styleus_representation_wrap(options = { }, &block)
|
57
55
|
captured_block = capture(&block)
|
58
|
-
|
56
|
+
|
57
|
+
classes = '__sg_component'.concat(" #{options[:class].to_s}")
|
59
58
|
content_tag('section', class: classes) do
|
60
|
-
|
59
|
+
render layout: 'layouts/styleus_context' do
|
60
|
+
captured_block.to_s.html_safe
|
61
|
+
end
|
61
62
|
end
|
62
63
|
end
|
63
64
|
|
64
65
|
def _coderay_highlight_wrap(note = nil, &block)
|
65
|
-
captured_block
|
66
|
-
code_block
|
66
|
+
captured_block = capture(&block)
|
67
|
+
code_block = CodeRay.scan(captured_block.to_s, :html)
|
68
|
+
|
67
69
|
note_tag = note ? content_tag('p', note, class: '__code_note') : ''
|
68
70
|
|
69
71
|
highlighted_code = "#{note_tag}#{code_block.div(:css => :class)}"
|
70
72
|
highlighted_code.html_safe
|
71
73
|
end
|
74
|
+
|
75
|
+
def _joined_component_list
|
76
|
+
@component_list.join.html_safe
|
77
|
+
end
|
72
78
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Styleus
|
2
|
+
# Provides a basic model, with attribute and
|
3
|
+
# naming capabilities.
|
4
|
+
# TODO: replace with ActiveModel::Model or something like that
|
5
|
+
class Base
|
6
|
+
extend ActiveModel::Naming
|
7
|
+
include ActiveModel::AttributeMethods
|
8
|
+
include ActiveModel::Serialization
|
9
|
+
|
10
|
+
def initialize(attributes)
|
11
|
+
@attributes = attributes
|
12
|
+
end
|
13
|
+
|
14
|
+
def id
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
|
18
|
+
# as implemented as in ActiveRecord
|
19
|
+
def to_key
|
20
|
+
key = self.id
|
21
|
+
[key] if key
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def attribute(attr)
|
27
|
+
@attributes[attr.to_sym]
|
28
|
+
end
|
29
|
+
|
30
|
+
class << self
|
31
|
+
def with_attributes(*attribute_names)
|
32
|
+
define_attribute_methods attribute_names.map(&:to_s)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Styleus
|
2
|
+
class ViewComponent < Styleus::Base
|
3
|
+
with_attributes :headline, :partial_path
|
4
|
+
|
5
|
+
# id is used as anchor id in the anchor menu,
|
6
|
+
# so it has to be a uid.
|
7
|
+
# TODO: make sure the uid-ness :)
|
8
|
+
def id
|
9
|
+
headline.underscore
|
10
|
+
end
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def components
|
14
|
+
@components ||= []
|
15
|
+
end
|
16
|
+
|
17
|
+
def from_hashes(hashes)
|
18
|
+
components.clear
|
19
|
+
hashes.each { |comp_hash| components << new(comp_hash) }
|
20
|
+
components
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -7,8 +7,14 @@
|
|
7
7
|
<%= csrf_meta_tags %>
|
8
8
|
</head>
|
9
9
|
<body>
|
10
|
-
|
10
|
+
<!-- class __styleus is the styleus context class,
|
11
|
+
providing a minimal css setting. -->
|
12
|
+
<section class="__styleus_wrapper">
|
13
|
+
<header>
|
14
|
+
<h1>Component Guide</h1>
|
15
|
+
</header>
|
16
|
+
|
11
17
|
<%= yield :components %>
|
12
|
-
</
|
18
|
+
</section>
|
13
19
|
</body>
|
14
20
|
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= yield %>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
Rails.application.config.before_configuration do |app|
|
2
|
+
# initialize styleus configuration
|
3
|
+
app.config.styleus = Styleus::Engine::Configuration.new unless app.config.respond_to? :styleus
|
4
|
+
|
5
|
+
# some defaults
|
6
|
+
app.config.styleus.maximum_screen_size = 1680
|
7
|
+
app.config.styleus.use_default_dimensions = true
|
8
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Styleus::COMPONENT_SPACES = Styleus::Component.spaces || []
|
data/config/routes.rb
CHANGED
data/lib/styleus.rb
CHANGED
data/lib/styleus/engine.rb
CHANGED
@@ -1,9 +1,22 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
1
3
|
module Styleus
|
2
4
|
class Engine < ::Rails::Engine
|
3
|
-
initializer '
|
4
|
-
# All assets required by templates provided by this engine
|
5
|
-
# must be added here for precompilation.
|
6
|
-
app.config.assets.precompile += ['styleus.css'
|
5
|
+
initializer 'config.assets.precompile' do |app|
|
6
|
+
# # All assets required by templates provided by this engine
|
7
|
+
# # must be added here for precompilation.
|
8
|
+
app.config.assets.precompile += ['styleus.css']
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
class Configuration < OpenStruct
|
13
|
+
def to_s
|
14
|
+
instance_variable_get(:@table).to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
def inspect
|
18
|
+
to_s
|
19
|
+
end
|
7
20
|
end
|
8
21
|
end
|
9
22
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Styleus
|
2
|
+
module Spacable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
module ClassMethods
|
6
|
+
def spaces(*collection)
|
7
|
+
@spaces ||= []
|
8
|
+
return @spaces if collection.empty?
|
9
|
+
@spaces.concat(collection).uniq! if collection.respond_to? :to_ary
|
10
|
+
@spaces
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/styleus/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: styleus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -67,21 +67,28 @@ executables: []
|
|
67
67
|
extensions: []
|
68
68
|
extra_rdoc_files: []
|
69
69
|
files:
|
70
|
-
- app/assets/stylesheets/
|
71
|
-
- app/assets/stylesheets/styleus/
|
72
|
-
- app/assets/stylesheets/styleus/
|
73
|
-
- app/assets/stylesheets/styleus/components/
|
74
|
-
- app/assets/stylesheets/styleus/
|
75
|
-
- app/assets/stylesheets/styleus/
|
70
|
+
- app/assets/stylesheets/styleus/core.css.scss
|
71
|
+
- app/assets/stylesheets/styleus/default_dimensions.css.scss.erb
|
72
|
+
- app/assets/stylesheets/styleus/themes/base/coderay.css.scss
|
73
|
+
- app/assets/stylesheets/styleus/themes/base/components/_article.css.scss
|
74
|
+
- app/assets/stylesheets/styleus/themes/base/components/_representation_helpers.css.scss
|
75
|
+
- app/assets/stylesheets/styleus/themes/base/layout/main.css.scss
|
76
|
+
- app/assets/stylesheets/styleus/themes/base/settings/_colors.css.scss
|
77
|
+
- app/assets/stylesheets/styleus/themes/base.css.scss
|
76
78
|
- app/assets/stylesheets/styleus.css
|
79
|
+
- app/controllers/components_controller.rb
|
77
80
|
- app/helpers/styleus_helper.rb
|
78
|
-
- app/models/base.rb
|
79
|
-
- app/models/component.rb
|
80
|
-
- app/models/
|
81
|
+
- app/models/styleus/base.rb
|
82
|
+
- app/models/styleus/component.rb
|
83
|
+
- app/models/styleus/view_component.rb
|
81
84
|
- app/views/layouts/_styleus.html.erb
|
85
|
+
- app/views/layouts/_styleus_context.html.erb
|
82
86
|
- app/views/styleus/_screen_size_viewer.html.erb
|
87
|
+
- config/initializers/01_styleus_config.rb
|
88
|
+
- config/initializers/02_init_container_routes.rb
|
83
89
|
- config/routes.rb
|
84
90
|
- lib/styleus/engine.rb
|
91
|
+
- lib/styleus/spacable.rb
|
85
92
|
- lib/styleus/version.rb
|
86
93
|
- lib/styleus.rb
|
87
94
|
- MIT-LICENSE
|
@@ -1,49 +0,0 @@
|
|
1
|
-
$spacing_width: 3px;
|
2
|
-
|
3
|
-
$first_col_width: 1024px;
|
4
|
-
$second_col_width: 1480px - $first_col_width - $spacing_width;
|
5
|
-
$third_col_width: $styleguide_width - $second_col_width - $first_col_width - 2*$spacing_width;
|
6
|
-
|
7
|
-
@mixin __mq_font_styles {
|
8
|
-
text-align: center;
|
9
|
-
font-size: 0.8em;
|
10
|
-
font-weight: bold;
|
11
|
-
color: #333;
|
12
|
-
padding-top: 0.2em;
|
13
|
-
}
|
14
|
-
|
15
|
-
@mixin __mq_step_markers {
|
16
|
-
border: 3px solid red;
|
17
|
-
border-bottom: none;
|
18
|
-
margin-left: $spacing_width;
|
19
|
-
|
20
|
-
&:first-child { margin-left: 0; }
|
21
|
-
|
22
|
-
// < 1024px
|
23
|
-
&.one { width: $first_col_width; border-color: #a1ff2c; }
|
24
|
-
//1025px <> 1480px
|
25
|
-
&.two { width: $second_col_width; border-color: #50c7ff; }
|
26
|
-
// > 1480px
|
27
|
-
&.three { width: $third_col_width; border-color: #e43b37; }
|
28
|
-
}
|
29
|
-
|
30
|
-
.__mq_presenter {
|
31
|
-
height: 5em;
|
32
|
-
|
33
|
-
.__mq_screen_size_list {
|
34
|
-
height: 3em;
|
35
|
-
padding: 1em 0;
|
36
|
-
overflow: hidden;
|
37
|
-
position: fixed;
|
38
|
-
background: #fff;
|
39
|
-
border-bottom: 1px solid #ccc;
|
40
|
-
width: $styleguide_width;
|
41
|
-
}
|
42
|
-
|
43
|
-
.__mq_step {
|
44
|
-
@include box-sizing(border-box);
|
45
|
-
float: left;
|
46
|
-
@include __mq_font_styles;
|
47
|
-
@include __mq_step_markers;
|
48
|
-
}
|
49
|
-
}
|
data/app/models/base.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
class Base
|
2
|
-
extend ActiveModel::Naming
|
3
|
-
include ActiveModel::AttributeMethods
|
4
|
-
include ActiveModel::Serialization
|
5
|
-
|
6
|
-
def initialize(attributes)
|
7
|
-
@attributes = attributes
|
8
|
-
end
|
9
|
-
|
10
|
-
def id
|
11
|
-
@id ||= rand(99999999)
|
12
|
-
end
|
13
|
-
|
14
|
-
# as implemented as in ActiveRecord
|
15
|
-
def to_key
|
16
|
-
key = self.id
|
17
|
-
[key] if key
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def attribute(attr)
|
23
|
-
@attributes[attr.to_sym]
|
24
|
-
end
|
25
|
-
|
26
|
-
class << self
|
27
|
-
def with_attributes(*attribute_names)
|
28
|
-
define_attribute_methods attribute_names.map(&:to_s)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
data/app/models/component.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
class ComponentList
|
2
|
-
|
3
|
-
def components
|
4
|
-
@components ||= []
|
5
|
-
end
|
6
|
-
|
7
|
-
class << self
|
8
|
-
def from_hashes(hashes)
|
9
|
-
@component_list = ComponentList.new
|
10
|
-
hashes.each { |comp_hash| @component_list.components << Component.new(comp_hash)}
|
11
|
-
@component_list
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|