blocks 3.0.4 → 4.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +5 -5
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +61 -17
  4. data/CHANGELOG.rdoc +27 -0
  5. data/Gemfile +11 -10
  6. data/Guardfile +1 -0
  7. data/README.md +2 -0
  8. data/bin/deploy_docs +1 -1
  9. data/blocks.gemspec +3 -1
  10. data/docs/_includes/configuration.md +3 -6
  11. data/docs/_includes/defining.md +7 -7
  12. data/docs/_includes/{introduction.md → features.md} +2 -2
  13. data/docs/_includes/helper-blocks.md +5 -0
  14. data/docs/_includes/helper-blocks/content_tag.md +44 -0
  15. data/docs/_includes/installation.md +16 -2
  16. data/docs/_includes/overview.md +21 -0
  17. data/docs/_includes/templating.md +1 -1
  18. data/docs/_includes/templating/bootstrap_4_cards.md +9 -9
  19. data/docs/_layouts/slate.html +11 -9
  20. data/docs/index.md +3 -1
  21. data/gemfiles/Gemfile.rails-3-0-stable +1 -0
  22. data/gemfiles/Gemfile.rails-3-1-stable +1 -0
  23. data/gemfiles/Gemfile.rails-3-2-stable +1 -0
  24. data/gemfiles/Gemfile.rails-4-0-stable +2 -1
  25. data/gemfiles/Gemfile.rails-4-1-stable +2 -1
  26. data/gemfiles/Gemfile.rails-4-2-stable +2 -1
  27. data/gemfiles/Gemfile.rails-5-0-stable +4 -3
  28. data/gemfiles/Gemfile.rails-5-1-stable +4 -3
  29. data/gemfiles/Gemfile.rails-5-2-stable +13 -0
  30. data/lib/blocks.rb +37 -29
  31. data/lib/blocks/builders/block_definition.rb +45 -43
  32. data/lib/blocks/builders/builder.rb +96 -60
  33. data/lib/blocks/builders/hook_definition.rb +19 -4
  34. data/lib/blocks/engine.rb +14 -0
  35. data/lib/blocks/helpers/controller_extensions.rb +13 -0
  36. data/lib/blocks/helpers/haml_capture.rb +44 -0
  37. data/lib/blocks/{action_view_extensions → helpers}/view_extensions.rb +10 -4
  38. data/lib/blocks/renderers/adjacent_blocks_renderer.rb +9 -7
  39. data/lib/blocks/renderers/block_placeholder.rb +2 -0
  40. data/lib/blocks/renderers/block_renderer.rb +26 -5
  41. data/lib/blocks/renderers/block_with_hooks_renderer.rb +29 -19
  42. data/lib/blocks/renderers/collection_renderer.rb +19 -6
  43. data/lib/blocks/renderers/nesting_blocks_renderer.rb +9 -11
  44. data/lib/blocks/renderers/partial_renderer.rb +16 -14
  45. data/lib/blocks/renderers/renderer.rb +9 -24
  46. data/lib/blocks/renderers/runtime_context.rb +174 -152
  47. data/lib/blocks/renderers/wrapper_renderer.rb +21 -10
  48. data/lib/blocks/utilities/configurator.rb +30 -6
  49. data/lib/blocks/utilities/hash_with_caller.rb +36 -32
  50. data/lib/blocks/utilities/hash_with_render_strategy.rb +67 -19
  51. data/lib/blocks/utilities/options_set.rb +38 -63
  52. data/lib/blocks/version.rb +3 -1
  53. metadata +22 -21
  54. data/docs/_includes/wip.md +0 -34
  55. data/lib/blocks/experimental/builder_permissions.rb +0 -52
  56. data/lib/blocks/experimental/invalid_permissions_handler.rb +0 -27
  57. data/lib/blocks/renderers/abstract_renderer.rb +0 -69
  58. data/lib/blocks/utilities/dynamic_configuration.rb +0 -71
metadata CHANGED
@@ -1,45 +1,45 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blocks
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.4
4
+ version: 4.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Hunter
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-02-05 00:00:00.000000000 Z
11
+ date: 2020-01-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: call_with_params
14
+ name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 3.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 3.0.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: rails
28
+ name: simplecov
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 3.0.0
34
- type: :runtime
33
+ version: '0'
34
+ type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 3.0.0
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: simplecov
42
+ name: memory_profiler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -82,10 +82,13 @@ files:
82
82
  - docs/_includes/custom-builders.md
83
83
  - docs/_includes/defining.md
84
84
  - docs/_includes/demos/hooks-and-wrappers-output.html
85
+ - docs/_includes/features.md
86
+ - docs/_includes/helper-blocks.md
87
+ - docs/_includes/helper-blocks/content_tag.md
85
88
  - docs/_includes/hooks.md
86
89
  - docs/_includes/installation.md
87
- - docs/_includes/introduction.md
88
90
  - docs/_includes/option-merging.md
91
+ - docs/_includes/overview.md
89
92
  - docs/_includes/rendering.md
90
93
  - docs/_includes/reserved-keywords.md
91
94
  - docs/_includes/skipping.md
@@ -94,7 +97,6 @@ files:
94
97
  - docs/_includes/templating.md
95
98
  - docs/_includes/templating/bootstrap_4_cards.md
96
99
  - docs/_includes/use-cases.md
97
- - docs/_includes/wip.md
98
100
  - docs/_includes/wrappers.md
99
101
  - docs/_layouts/slate.html
100
102
  - docs/_plugins/gem_version.rb
@@ -147,14 +149,15 @@ files:
147
149
  - gemfiles/Gemfile.rails-4-2-stable
148
150
  - gemfiles/Gemfile.rails-5-0-stable
149
151
  - gemfiles/Gemfile.rails-5-1-stable
152
+ - gemfiles/Gemfile.rails-5-2-stable
150
153
  - lib/blocks.rb
151
- - lib/blocks/action_view_extensions/view_extensions.rb
152
154
  - lib/blocks/builders/block_definition.rb
153
155
  - lib/blocks/builders/builder.rb
154
156
  - lib/blocks/builders/hook_definition.rb
155
- - lib/blocks/experimental/builder_permissions.rb
156
- - lib/blocks/experimental/invalid_permissions_handler.rb
157
- - lib/blocks/renderers/abstract_renderer.rb
157
+ - lib/blocks/engine.rb
158
+ - lib/blocks/helpers/controller_extensions.rb
159
+ - lib/blocks/helpers/haml_capture.rb
160
+ - lib/blocks/helpers/view_extensions.rb
158
161
  - lib/blocks/renderers/adjacent_blocks_renderer.rb
159
162
  - lib/blocks/renderers/block_placeholder.rb
160
163
  - lib/blocks/renderers/block_renderer.rb
@@ -166,7 +169,6 @@ files:
166
169
  - lib/blocks/renderers/runtime_context.rb
167
170
  - lib/blocks/renderers/wrapper_renderer.rb
168
171
  - lib/blocks/utilities/configurator.rb
169
- - lib/blocks/utilities/dynamic_configuration.rb
170
172
  - lib/blocks/utilities/hash_with_caller.rb
171
173
  - lib/blocks/utilities/hash_with_render_strategy.rb
172
174
  - lib/blocks/utilities/options_set.rb
@@ -187,12 +189,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
187
189
  version: '0'
188
190
  required_rubygems_version: !ruby/object:Gem::Requirement
189
191
  requirements:
190
- - - ">="
192
+ - - ">"
191
193
  - !ruby/object:Gem::Version
192
- version: '0'
194
+ version: 1.3.1
193
195
  requirements: []
194
- rubyforge_project:
195
- rubygems_version: 2.6.13
196
+ rubygems_version: 3.1.2
196
197
  signing_key:
197
198
  specification_version: 4
198
199
  summary: Blocks gives you total control over how your blocks of code render.
@@ -1,34 +0,0 @@
1
- <!-- Defining multiple blocks at once -->
2
- ## Multiple Blocks at Once
3
-
4
- ```haml
5
- - namer = Proc.new {|i| "block #{i}" }
6
- blocks.define_each ["a", 1, "b"],
7
- namer do |item|
8
- ="Hello from #{item}"
9
- &br
10
-
11
- = blocks.render("block a")
12
- = blocks.render("block 1")
13
- = blocks.render("block b")
14
- ```
15
-
16
- ```ruby
17
- # where builder is an instance of
18
- # Blocks::Builder
19
- namer = Proc.new {|i| "block #{i}" }
20
- builder.define_each ["a", 1, "b"],
21
- namer do |item|
22
- "Hello from #{item}<br>".html_safe
23
- end
24
-
25
- builder.render("block a") +
26
- builder.render("block 1") +
27
- builder.render("block b")
28
- ```
29
-
30
- Multiple different blocks may be defined at once using the #define_each method.
31
-
32
- #define_each expects at least two parameters: the collection and a proc that can be used to calculate the block name. The proc must at least one parameter, the first being the item in the collection.
33
-
34
- The method also expects either an options hash designating the render strategy or a Ruby block.
@@ -1,52 +0,0 @@
1
- # WIP
2
- module Blocks
3
- module BuilderPermissions
4
- extend ActiveSupport::Concern
5
-
6
- METHODS_TO_PROTECT = [:render, :define, :deferred_render, :replace, :skip]
7
-
8
- included do
9
- attr_writer :permitted_blocks
10
- attr_accessor :allow_all_blocks
11
- attr_accessor :allow_anonymous_blocks
12
-
13
- METHODS_TO_PROTECT.each do |method_name|
14
- alias_method "original_#{method_name}", method_name
15
- define_method(method_name) do |*args, &block|
16
- if permitted?(args.first)
17
- self.send("original_#{method_name}", *args, &block)
18
- else
19
- InvalidPermissionsHandler.build(method_name, args.first)
20
- end
21
- end
22
- end
23
- end
24
-
25
- def restrict_blocks
26
- self.allow_all_blocks = false
27
- end
28
-
29
- def permitted_blocks
30
- @permitted_blocks ||= []
31
- end
32
-
33
- def permit(*names)
34
- self.permitted_blocks += names
35
- end
36
-
37
- def permit_all
38
- self.allow_all_blocks = true
39
- end
40
-
41
- def permit_anonymous_blocks
42
- self.allow_anonymous_blocks = true
43
- end
44
-
45
- def permitted?(name)
46
- allow_all_blocks ||
47
- (block_definitions[name].try(:anonymous) && allow_anonymous_blocks) ||
48
- !name.respond_to?(:to_sym) ||
49
- permitted_blocks.any? {|e| e.to_sym == name.to_sym }
50
- end
51
- end
52
- end
@@ -1,27 +0,0 @@
1
- # WIP
2
- module Blocks
3
- class InvalidPermissionsHandler
4
- LOG = :log
5
- RAISE = :raise
6
-
7
- def self.build(method_name, block_name)
8
- message = "Cannot #{method_name} #{block_name}; #{block_name} is not in the permitted_blocks list"
9
- new(message)
10
- nil
11
- end
12
-
13
- def initialize(message)
14
- send("handle_#{Blocks.invalid_permissions_approach}", message)
15
- end
16
-
17
- private
18
-
19
- def handle_log(message)
20
- Rails.logger.info message
21
- end
22
-
23
- def handle_raise(message)
24
- raise message
25
- end
26
- end
27
- end
@@ -1,69 +0,0 @@
1
- module Blocks
2
- class AbstractRenderer
3
- RENDERERS = [
4
- AdjacentBlocksRenderer,
5
- BlockRenderer,
6
- BlockWithHooksRenderer,
7
- CollectionRenderer,
8
- PartialRenderer,
9
- NestingBlocksRenderer,
10
- WrapperRenderer
11
- ]
12
-
13
- attr_accessor :main_renderer
14
-
15
- delegate :builder, *(RENDERERS.map {|r| r.to_s.demodulize.underscore }), to: :main_renderer
16
- delegate :block_definitions, :block_for, :view, to: :builder
17
- delegate :with_output_buffer, :output_buffer, to: :view
18
-
19
- def initialize(main_renderer=nil)
20
- self.main_renderer = main_renderer
21
- end
22
-
23
- def render(*args)
24
- raise NotImplementedError
25
- end
26
-
27
- def capture(*args, &block)
28
- without_haml_interference do
29
- if block.arity > 0
30
- args = args[0, block.arity]
31
- end
32
-
33
- with_output_buffer do
34
- output_buffer << view.capture(*args, &block)
35
- end
36
- end
37
- end
38
-
39
- protected
40
-
41
- # Complete hack to get around issues with Haml
42
- # Haml does some hacking to ActionView's with_output_buffer and
43
- # output_buffer. In doing so, they make certain assumptions about
44
- # the layout and the view template. The Blocks gem doesn't capture
45
- # blocks immediately but rather stores them for later capturing.
46
- # This can produce an issue if a block that is stored was in Haml
47
- # but the Layout is in ERB. Haml will think that any blocks it
48
- # captures while rendering the layout will be in ERB format. However,
49
- # the block would need to be captured in Haml using a Haml buffer.
50
- # This workaround accomplishes that.
51
- def without_haml_interference(&block)
52
- if defined?(::Haml) && view.instance_variables.include?(:@haml_buffer)
53
- haml_buffer = view.instance_variable_get(:@haml_buffer)
54
- if haml_buffer
55
- was_active = haml_buffer.active?
56
- haml_buffer.active = false
57
- else
58
- haml_buffer = Haml::Buffer.new(nil, Haml::Options.new.for_buffer)
59
- haml_buffer.active = false
60
- kill_buffer = true
61
- view.instance_variable_set(:@haml_buffer, haml_buffer)
62
- end
63
- end
64
- yield
65
- ensure
66
- haml_buffer.active = was_active if haml_buffer
67
- end
68
- end
69
- end
@@ -1,71 +0,0 @@
1
- module Blocks
2
- module DynamicConfiguration
3
- extend ActiveSupport::Concern
4
-
5
- module ClassMethods
6
- def add_config(*attrs)
7
- options = attrs.extract_options!
8
- instance_reader = options.fetch(:instance_accessor, true) && options.fetch(:instance_reader, true)
9
- instance_writer = options.fetch(:instance_accessor, true) && options.fetch(:instance_writer, true)
10
- instance_predicate = options.fetch(:instance_predicate, true)
11
- default_value = options.fetch(:default, nil)
12
-
13
- attrs.each do |name|
14
- define_singleton_method(name) do |value="UNDEFINED"|
15
- if value == "UNDEFINED"
16
- default_value
17
- else
18
- public_send("#{name}=", value)
19
- end
20
- end
21
- define_singleton_method("#{name}?") { !!public_send(name) } if instance_predicate
22
-
23
- ivar = "@#{name}"
24
-
25
- define_singleton_method("#{name}=") do |val|
26
- singleton_class.class_eval do
27
- remove_possible_method(name)
28
- define_method(name) do |value="UNDEFINED"|
29
- if value == "UNDEFINED"
30
- val
31
- else
32
- public_send("#{name}=", value)
33
- end
34
- end
35
- end
36
-
37
- class_eval do
38
- remove_possible_method(name)
39
- define_method(name) do
40
- if instance_variable_defined? ivar
41
- instance_variable_get ivar
42
- else
43
- singleton_class.send name
44
- end
45
- end
46
- end
47
- val
48
- end
49
-
50
- if instance_reader
51
- remove_possible_method name
52
- define_method(name) do
53
- if instance_variable_defined?(ivar)
54
- instance_variable_get ivar
55
- else
56
- self.class.public_send name
57
- end
58
- end
59
- define_method("#{name}?") { !!public_send(name) } if instance_predicate
60
- end
61
-
62
- attr_writer name if instance_writer
63
- end
64
- end
65
-
66
- def configure
67
- yield self
68
- end
69
- end
70
- end
71
- end