dome 0.0.1 → 0.0.2
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/lib/dome/controller_class_methods.rb +134 -0
- data/lib/dome/exhibit.rb +39 -5
- data/lib/dome/helpers/html_drawer.rb +12 -0
- data/lib/dome/helpers/view_model.rb +61 -0
- data/lib/dome/presenter.rb +9 -1
- data/lib/dome/railtie.rb +4 -1
- data/lib/dome/version.rb +1 -1
- data/lib/dome/view_methods.rb +5 -21
- data/spec/view_methods_spec.rb +22 -40
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 642c6ee7484b67026f13af7f79f1b491a3641096
|
4
|
+
data.tar.gz: ca74536637c7eda7050c2daf8d4e7dcce7761f55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1b549dea1b24e8798c2a9c2f1cb8205f41d0ca12347a4212cc1d32042dae49b3a51fa374114ef1e67a8f08d37f70b6269f10e47a848ce4af06d6256755d07b3
|
7
|
+
data.tar.gz: d525458fee81244a1c552a43c29cd426bacae3d056790bfa0c4a3ff5275467caa8038d1170c2750b0babb7fa34aaed4d655fc277373767ec85ca680395cb28e4
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'active_support/inflector'
|
2
|
+
|
3
|
+
require 'dome/errors'
|
4
|
+
|
5
|
+
# TODO: freeze, refactor
|
6
|
+
|
7
|
+
# TODO: defined?(Rails)
|
8
|
+
module Dome
|
9
|
+
module ControllerClassMethods
|
10
|
+
# TODO: view_models
|
11
|
+
# view_model(:dashboard) { UnitDashboard.new(@meeting) }
|
12
|
+
def view_model(name, &block)
|
13
|
+
if block_given?
|
14
|
+
define_method name do
|
15
|
+
instance_variable_get("@#{name}") || begin
|
16
|
+
view_model = self.instance_eval &block
|
17
|
+
view_model.instance_variable_set("@view_context", self)
|
18
|
+
instance_variable_set("@#{name}", view_model)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
_helpers.send :define_method, name do
|
22
|
+
instance_variable_get("@#{name}") || begin
|
23
|
+
view_model = self.instance_eval &block
|
24
|
+
view_model.instance_variable_set("@view_context", self)
|
25
|
+
instance_variable_set("@#{name}", view_model)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
else
|
29
|
+
define_method name do
|
30
|
+
instance_variable_get("@#{name}")
|
31
|
+
end
|
32
|
+
_helpers.send :define_method, name do
|
33
|
+
instance_variable_get("@#{name}")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# present(pair: [:one, :two], ...)
|
39
|
+
def present(pairs, *vals)
|
40
|
+
pairs.each do |name, var_names|
|
41
|
+
class_name = "#{name.to_s.camelize}Presenter"
|
42
|
+
klass = class_name.safe_constantize
|
43
|
+
klass || raise(
|
44
|
+
Dome::ExhibitClassNotFound,
|
45
|
+
"Exhibit class '#{class_name}' for '#{name}' not found."
|
46
|
+
)
|
47
|
+
|
48
|
+
define_method name do
|
49
|
+
instance_variable_get("@dome_#{name}_presenter") || begin
|
50
|
+
things = var_names.map { |x| instance_variable_get("@#{x}") }
|
51
|
+
presented = klass.new(*things)
|
52
|
+
presented.instance_variable_set("@view_context", self)
|
53
|
+
instance_variable_set("@dome_#{name}_presenter", presented)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
_helpers.send :define_method, name do
|
57
|
+
instance_variable_get("@dome_#{name}_presenter") || begin
|
58
|
+
things = var_names.map { |x| instance_variable_get("@#{x}") }
|
59
|
+
presented = klass.new(*things)
|
60
|
+
presented.instance_variable_set("@view_context", self)
|
61
|
+
instance_variable_set("@dome_#{name}_presenter", presented)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# exhibit(:one)
|
68
|
+
# exhibit(:one, :two, by: SomeEx)
|
69
|
+
def exhibit(*names, by: nil)
|
70
|
+
names.each do |name|
|
71
|
+
klass = by || begin
|
72
|
+
class_name = "#{name.to_s.camelize}Exhibit"
|
73
|
+
klass = class_name.safe_constantize
|
74
|
+
klass || raise(
|
75
|
+
Dome::ExhibitClassNotFound,
|
76
|
+
"Exhibit class '#{class_name}' for '#{name}' not found."
|
77
|
+
)
|
78
|
+
end
|
79
|
+
|
80
|
+
define_method name do
|
81
|
+
instance_variable_get("@dome_#{name}_exhibit") || begin
|
82
|
+
exhibited = klass.new(instance_variable_get("@#{name}"))
|
83
|
+
exhibited.instance_variable_set("@view_context", self)
|
84
|
+
instance_variable_set("@dome_#{name}_exhibit", exhibited)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
_helpers.send :define_method, name do
|
88
|
+
instance_variable_get("@dome_#{name}_exhibit") || begin
|
89
|
+
exhibited = klass.new(instance_variable_get("@#{name}"))
|
90
|
+
exhibited.instance_variable_set("@view_context", self)
|
91
|
+
instance_variable_set("@dome_#{name}_exhibit", exhibited)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# exhibit_enum(:ones)
|
98
|
+
# exhibit_enum(:ones, :twos, by: SomeEx)
|
99
|
+
def exhibit_enum(*names, by: nil)
|
100
|
+
names.each do |name|
|
101
|
+
klass = by || begin
|
102
|
+
class_name = "#{name.to_s.singularize.camelize}Exhibit"
|
103
|
+
klass = class_name.safe_constantize
|
104
|
+
klass || raise(
|
105
|
+
Dome::ExhibitClassNotFound,
|
106
|
+
"Exhibit class '#{class_name}' for '#{name}' not found."
|
107
|
+
)
|
108
|
+
end
|
109
|
+
|
110
|
+
define_method name do
|
111
|
+
instance_variable_get("@dome_#{name}_exhibit") || begin
|
112
|
+
enum = instance_variable_get("@#{name}").to_a.map do |x|
|
113
|
+
exhibited = klass.new(x)
|
114
|
+
exhibited.instance_variable_set("@view_context", self)
|
115
|
+
exhibited
|
116
|
+
end
|
117
|
+
instance_variable_set("@dome_#{name}_exhibit", enum)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
_helpers.send :define_method, name do
|
121
|
+
instance_variable_get("@dome_#{name}_exhibit") || begin
|
122
|
+
enum = instance_variable_get("@#{name}").to_a.map do |x|
|
123
|
+
exhibited = klass.new(x)
|
124
|
+
exhibited.instance_variable_set("@view_context", self)
|
125
|
+
exhibited
|
126
|
+
end
|
127
|
+
instance_variable_set("@dome_#{name}_exhibit", enum)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
alias :exhibit_enums :exhibit_enum
|
133
|
+
end
|
134
|
+
end
|
data/lib/dome/exhibit.rb
CHANGED
@@ -1,15 +1,38 @@
|
|
1
|
+
require 'dome/helpers/view_model'
|
2
|
+
|
1
3
|
module Dome
|
2
4
|
class Exhibit < SimpleDelegator
|
5
|
+
include Helpers::ViewModel
|
6
|
+
|
7
|
+
TIMESTAMP_ATTRS = %i(
|
8
|
+
created_at updated_at deleted_at created_on updated_on deleted_on
|
9
|
+
)
|
10
|
+
|
3
11
|
attr_reader :model
|
4
12
|
delegate :id, to: :model
|
5
13
|
|
6
|
-
|
7
|
-
|
8
|
-
|
14
|
+
class << self
|
15
|
+
def view_path
|
16
|
+
"app/exhibits"
|
17
|
+
end
|
18
|
+
|
19
|
+
# decorate_methods(*names) { |x, *ys| ... }
|
20
|
+
def decorate_methods(*names, &block)
|
21
|
+
names.each do |name|
|
22
|
+
define_method(name) { |*xs| instance_exec(@model.send(name), *xs, &block) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def localize_timestamps(attrs = TIMESTAMP_ATTRS, format: :default)
|
27
|
+
decorate_methods(*attrs) { |x| l(x, format: format) }
|
28
|
+
end
|
9
29
|
end
|
10
30
|
|
11
|
-
def
|
12
|
-
|
31
|
+
def initialize(_model, view_context = nil)
|
32
|
+
raise 'Decorationg Nil object not allowed!' unless _model
|
33
|
+
|
34
|
+
@model, @view_context = _model, view_context
|
35
|
+
super(_model)
|
13
36
|
end
|
14
37
|
|
15
38
|
def class
|
@@ -19,5 +42,16 @@ module Dome
|
|
19
42
|
def to_model
|
20
43
|
self
|
21
44
|
end
|
45
|
+
|
46
|
+
def attr_name_with_value(attr_name, separator: ': ')
|
47
|
+
unless self.class.respond_to?(:human_attribute_name)
|
48
|
+
raise "You must implement 'human_attribute_name' method on a class"
|
49
|
+
end
|
50
|
+
[self.class.human_attribute_name(attr_name), send(attr_name)].join(separator)
|
51
|
+
end
|
52
|
+
|
53
|
+
def attr_names_with_values(*attr_names, separator: ': ')
|
54
|
+
attr_names.map { |name| attr_name_with_value(name, separator: separator) }
|
55
|
+
end
|
22
56
|
end
|
23
57
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Dome::Helpers
|
2
|
+
class HtmlDrawer
|
3
|
+
def initialize(context, &tpl)
|
4
|
+
@context = context
|
5
|
+
@tpl = tpl || -> x { x }
|
6
|
+
end
|
7
|
+
|
8
|
+
def matching(proc = nil, &block)
|
9
|
+
-> *args, &fn { @tpl.call(fn.call(*args)) if (proc || block).call(*args) }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
require 'dome/helpers/html_drawer'
|
4
|
+
|
5
|
+
module Dome::Helpers
|
6
|
+
module ViewModel
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
attr_reader :view_context
|
11
|
+
alias :h :view_context
|
12
|
+
|
13
|
+
# Added for compatibility with Devise, Rails, etc.
|
14
|
+
delegate :request, :translate, :localize, to: :view_context
|
15
|
+
alias :t :translate
|
16
|
+
alias :l :localize
|
17
|
+
end
|
18
|
+
|
19
|
+
module ClassMethods
|
20
|
+
def view_path
|
21
|
+
"app/views"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# TODO: if respond_to? :render
|
26
|
+
def render(name = nil, vars = {}, opts = {})
|
27
|
+
setup_view_path
|
28
|
+
@view_context.render(
|
29
|
+
name ? { file: name, locals: vars }.merge(opts) : opts
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
def compile(args, separator = "\n", do_compact = true, &block)
|
34
|
+
separator = h.tag(separator) if separator.is_a?(Symbol)
|
35
|
+
(do_compact ? args.compact : args)
|
36
|
+
.join(block_given? ? block.() : separator)
|
37
|
+
.html_safe
|
38
|
+
end
|
39
|
+
|
40
|
+
def draw(&block)
|
41
|
+
Dome::Helpers::HtmlDrawer.new(@view_context, &block)
|
42
|
+
end
|
43
|
+
|
44
|
+
def draw_with(&block)
|
45
|
+
draw { |x| [x, block.call(x)].join("\n").html_safe }
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
# TODO: if respond_to? :controller; if respond_to? :prepend_view_path
|
51
|
+
def setup_view_path
|
52
|
+
return if @setup_view_path
|
53
|
+
|
54
|
+
c = @view_context.respond_to?(:controller) ? @view_context.controller : @view_context
|
55
|
+
@setup_view_path = c.prepend_view_path File.join [
|
56
|
+
self.class.view_path,
|
57
|
+
self.class.name.underscore
|
58
|
+
]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/dome/presenter.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
|
+
require 'dome/helpers/view_model'
|
2
|
+
|
1
3
|
module Dome
|
2
4
|
class Presenter
|
5
|
+
include Helpers::ViewModel
|
6
|
+
|
3
7
|
attr_reader :values
|
4
8
|
|
5
9
|
class_attribute :presenter_value_names
|
@@ -9,10 +13,14 @@ module Dome
|
|
9
13
|
self.presenter_value_names = names
|
10
14
|
end
|
11
15
|
|
16
|
+
def self.view_path
|
17
|
+
"app/presenters"
|
18
|
+
end
|
19
|
+
|
12
20
|
def initialize(*vals)
|
13
21
|
@values = vals.freeze
|
14
22
|
presenter_value_names.each_with_index do |name, i|
|
15
|
-
self.class.define_method
|
23
|
+
self.class.send(:define_method, name) { @values[i] }
|
16
24
|
end
|
17
25
|
end
|
18
26
|
end
|
data/lib/dome/railtie.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'dome/view_methods'
|
2
|
+
require 'dome/controller_class_methods'
|
3
|
+
|
1
4
|
module Dome
|
2
5
|
class Railtie < Rails::Railtie
|
3
6
|
initializer "action_view.initialize_dome" do
|
@@ -5,7 +8,7 @@ module Dome
|
|
5
8
|
ActionView::Base.send :include, Dome::ViewMethods
|
6
9
|
end
|
7
10
|
ActiveSupport.on_load(:action_controller) do
|
8
|
-
|
11
|
+
ActionController::Base.send :extend, Dome::ControllerClassMethods
|
9
12
|
end
|
10
13
|
end
|
11
14
|
end
|
data/lib/dome/version.rb
CHANGED
data/lib/dome/view_methods.rb
CHANGED
@@ -1,20 +1,9 @@
|
|
1
1
|
require 'active_support/inflector'
|
2
2
|
|
3
|
+
# TODO: freeze, refactor
|
4
|
+
|
3
5
|
module Dome
|
4
6
|
module ViewMethods
|
5
|
-
# view_model(:var_name)
|
6
|
-
# view_model(:dashboard) { UnitDashboard.new(@meeting) }
|
7
|
-
def view_model(name, to: dome_view_context, &block)
|
8
|
-
if block_given?
|
9
|
-
to.class.send(:define_method, name, &block)
|
10
|
-
else
|
11
|
-
to.class.send(:define_method, name) do
|
12
|
-
to.instance_variable_get("@#{name}")
|
13
|
-
end
|
14
|
-
end
|
15
|
-
to.send(name)
|
16
|
-
end
|
17
|
-
|
18
7
|
# present(:pair, @one, @two)
|
19
8
|
def present(name, *vals, to: dome_view_context)
|
20
9
|
class_name = "#{name.to_s.camelize}Presenter"
|
@@ -24,14 +13,9 @@ module Dome
|
|
24
13
|
"Presenter class '#{class_name}' for '#{name}' not found."
|
25
14
|
)
|
26
15
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
presented.instance_variable_set("@view_context", to)
|
31
|
-
to.instance_variable_set("@#{name}", presented)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
to.send(name)
|
16
|
+
presented = klass.new(*vals)
|
17
|
+
presented.instance_variable_set("@view_context", to)
|
18
|
+
presented
|
35
19
|
end
|
36
20
|
|
37
21
|
# exhibit(@one)
|
data/spec/view_methods_spec.rb
CHANGED
@@ -9,88 +9,70 @@ describe 'ViewMethods' do
|
|
9
9
|
include Dome::ViewMethods
|
10
10
|
|
11
11
|
def initialize
|
12
|
-
@
|
12
|
+
@num = 123
|
13
|
+
@float = 1.5
|
14
|
+
@symbols = [:l, :m, :n]
|
13
15
|
@words = ["abc", "xyz"]
|
14
16
|
end
|
15
17
|
end.new
|
16
18
|
end
|
17
19
|
|
18
|
-
describe "#
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
it "defines method from a block" do
|
25
|
-
subject.view_model(:some_var) { @some_var * 100 }
|
26
|
-
expect(subject.some_var).to eq 12300
|
27
|
-
end
|
28
|
-
|
29
|
-
it "calls a defined method" do
|
30
|
-
expect(subject.view_model(:some_var) { @some_var * 100 }).to eq 12300
|
20
|
+
describe "#present" do
|
21
|
+
class ThingPresenter < Dome::Presenter; end
|
22
|
+
let(:set_presenter) do
|
23
|
+
subject.instance_eval { present(:thing, @num) }
|
31
24
|
end
|
32
|
-
end
|
33
25
|
|
34
|
-
describe "#present" do
|
35
26
|
it "raises error if presenter class is absent" do
|
36
27
|
expect {
|
37
|
-
subject.instance_eval { present(:
|
28
|
+
subject.instance_eval { present(:anything, @num) }
|
38
29
|
}.to raise_error(Dome::PresenterClassNotFound)
|
39
30
|
end
|
40
31
|
|
41
|
-
it "defines a method returning a ThingPresenter instance" do
|
42
|
-
class ThingPresenter < Dome::Presenter; end
|
43
|
-
subject.instance_eval { present(:thing, @some_var) }
|
44
|
-
expect(subject.thing).to be_a ThingPresenter
|
45
|
-
end
|
46
|
-
|
47
32
|
it "sets @view_context variable to subject" do
|
48
|
-
|
49
|
-
subject.instance_eval { present(:thing, @some_var) }
|
50
|
-
expect(
|
51
|
-
subject.thing.instance_variable_get(:@view_context)
|
52
|
-
).to eq subject
|
33
|
+
expect(set_presenter.instance_variable_get(:@view_context)).to eq subject
|
53
34
|
end
|
54
35
|
|
55
36
|
it "calls a defined method" do
|
56
|
-
|
57
|
-
expect(
|
58
|
-
subject.instance_eval { present(:thing, @some_var) }
|
59
|
-
).to be_a ThingPresenter
|
37
|
+
expect(set_presenter).to be_a ThingPresenter
|
60
38
|
end
|
61
39
|
end
|
62
40
|
|
63
41
|
describe "#exhibit" do
|
42
|
+
class FixnumExhibit < Dome::Exhibit; end
|
43
|
+
let(:set_exhibit) do
|
44
|
+
subject.instance_eval { exhibit(@num) }
|
45
|
+
end
|
46
|
+
|
64
47
|
it "raises error if exhibit class is absent" do
|
65
48
|
expect {
|
66
|
-
subject.instance_eval { exhibit(@
|
49
|
+
subject.instance_eval { exhibit(@float) }
|
67
50
|
}.to raise_error(Dome::ExhibitClassNotFound)
|
68
51
|
end
|
69
52
|
|
70
53
|
it "returns a FixnumExhibit instance" do
|
71
|
-
class FixnumExhibit < Dome::Exhibit; end
|
72
54
|
expect(
|
73
|
-
|
55
|
+
set_exhibit
|
74
56
|
).to be_a FixnumExhibit
|
75
57
|
end
|
76
58
|
|
77
59
|
it "sets @view_context variable to subject" do
|
78
|
-
class FixnumExhibit < Dome::Exhibit; end
|
79
60
|
expect(
|
80
|
-
|
61
|
+
set_exhibit.instance_variable_get(:@view_context)
|
81
62
|
).to eq subject
|
82
63
|
end
|
83
64
|
end
|
84
65
|
|
85
66
|
describe "#exhibit_enum" do
|
67
|
+
class StringExhibit < Dome::Exhibit; end
|
68
|
+
|
86
69
|
it "raises error if exhibit class is absent" do
|
87
70
|
expect {
|
88
|
-
subject.instance_eval { exhibit_enum(@
|
71
|
+
subject.instance_eval { exhibit_enum(@symbols) }
|
89
72
|
}.to raise_error(Dome::ExhibitClassNotFound)
|
90
73
|
end
|
91
74
|
|
92
|
-
it "returns a
|
93
|
-
class StringExhibit < Dome::Exhibit; end
|
75
|
+
it "returns a StringExhibit instances" do
|
94
76
|
ary = subject.instance_eval { exhibit_enum(@words) }
|
95
77
|
expect(ary.first).to be_a StringExhibit
|
96
78
|
expect(ary.second).to be_a StringExhibit
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dome
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dmitry Novikov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -81,8 +81,11 @@ files:
|
|
81
81
|
- Rakefile
|
82
82
|
- dome.gemspec
|
83
83
|
- lib/dome.rb
|
84
|
+
- lib/dome/controller_class_methods.rb
|
84
85
|
- lib/dome/errors.rb
|
85
86
|
- lib/dome/exhibit.rb
|
87
|
+
- lib/dome/helpers/html_drawer.rb
|
88
|
+
- lib/dome/helpers/view_model.rb
|
86
89
|
- lib/dome/presenter.rb
|
87
90
|
- lib/dome/railtie.rb
|
88
91
|
- lib/dome/version.rb
|