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 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