dome 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 80ed0f4bad448edf1fbdb8b684d76e9d2e12297a
4
- data.tar.gz: 4383ce30c9dacbba4d4b9664f9e659085250323e
3
+ metadata.gz: 642c6ee7484b67026f13af7f79f1b491a3641096
4
+ data.tar.gz: ca74536637c7eda7050c2daf8d4e7dcce7761f55
5
5
  SHA512:
6
- metadata.gz: ae640440aa3d1a12cba2139e655d27d72c725a79732c3d1034f37085b3525ff085bd3384c2f0bd9333f156191ceb12bbb5546c99fc0c5afaa8dec2e6b39a11bb
7
- data.tar.gz: bd7cc6acab9fb1c365281d66563d963ea96ebe11f16412917df17b27e8884e528f3508d686def80754843479c59ac418bf2f54dd0675526a27bdf71a8cef8c67
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
- def initialize(model)
7
- @model = model.freeze
8
- super(model)
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 self.view_path
12
- "app/exhibits"
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
@@ -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(name) { @values[i] }
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
- ActionView::Base.send :extend, Dome::ControllerClassMethods
11
+ ActionController::Base.send :extend, Dome::ControllerClassMethods
9
12
  end
10
13
  end
11
14
  end
data/lib/dome/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Dome
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -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
- to.class.send(:define_method, name) do
28
- to.instance_variable_get("@#{name}") || begin
29
- presented = klass.new(*vals)
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)
@@ -9,88 +9,70 @@ describe 'ViewMethods' do
9
9
  include Dome::ViewMethods
10
10
 
11
11
  def initialize
12
- @some_var = 123
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 "#view_model" do
19
- it "wraps an instance variable" do
20
- subject.view_model(:some_var)
21
- expect(subject.some_var).to eq 123
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(:thing, @some_var) }
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
- class ThingPresenter < Dome::Presenter; end
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
- class ThingPresenter < Dome::Presenter; end
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(@some_var) }
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
- subject.instance_eval { exhibit(@some_var) }
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
- subject.instance_eval { exhibit(@some_var) }.instance_variable_get(:@view_context)
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(@words) }
71
+ subject.instance_eval { exhibit_enum(@symbols) }
89
72
  }.to raise_error(Dome::ExhibitClassNotFound)
90
73
  end
91
74
 
92
- it "returns a FixnumExhibit instances" do
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.1
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-12 00:00:00.000000000 Z
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