slotmachine 0.1.0
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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +144 -0
- data/Rakefile +27 -0
- data/lib/slot_machine.rb +7 -0
- data/lib/slot_machine/application_controller_concern.rb +9 -0
- data/lib/slot_machine/config.rb +31 -0
- data/lib/slot_machine/helper.rb +77 -0
- data/lib/slot_machine/railtie.rb +4 -0
- data/lib/slot_machine/version.rb +3 -0
- metadata +67 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2281198bcb524876b314972ead2c826386193349
|
4
|
+
data.tar.gz: d740f4abfa0e853b81481bb9f7430b98d9f5d1ee
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3f2ca18a9a64f4d4634fc90d27952a3e086f4748388bb462db31ce7ce6dfb8c81a86d1b98ae9e18d5df5c0b4c3d5c55f009cff8e31ad8ca331d18d34c107a5e3
|
7
|
+
data.tar.gz: bb5ce7aadc08b0e8ee655eef878093d92336e40af865f82bb5160f70b5c63bab6cf52fc141f9629999f6dae4663b38c6e3521982a53aec4d68742fcd4e27a06a
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2018 Cedric Feyaerts
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
# SlotMachine
|
2
|
+
|
3
|
+
Slot Machine is a rails plugin to help you write clean, readable views. It hides the ugly css in partials away from your views.
|
4
|
+
Slot Machine transforms partials into helper methods. Each partial contains slots into which you can insert data, html or other partials.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'slot_machine'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
```bash
|
15
|
+
$ bundle
|
16
|
+
```
|
17
|
+
|
18
|
+
Or install it yourself as:
|
19
|
+
```bash
|
20
|
+
$ gem install slot_machine
|
21
|
+
```
|
22
|
+
|
23
|
+
Create an initializer : `config/initializers/slot_machine.rb`
|
24
|
+
```ruby
|
25
|
+
require "slot_machine"
|
26
|
+
|
27
|
+
# The path where your partials will be stored
|
28
|
+
# default is Rails.root.join('app/views/slots/_*')
|
29
|
+
SlotMachine::Config.path = MyEngine::Engine.root.join('app/views/slots/_*')
|
30
|
+
```
|
31
|
+
|
32
|
+
## Usage
|
33
|
+
|
34
|
+
### The simplest case
|
35
|
+
|
36
|
+
Create your first partial (app/views/slots/_my_first_partial.html.slim)
|
37
|
+
|
38
|
+
```slim
|
39
|
+
.my_first_partial #This is not required just an example
|
40
|
+
h2 = slots[:title]
|
41
|
+
h3 = slots[:subtitle]
|
42
|
+
.content
|
43
|
+
= slots[:content]
|
44
|
+
```
|
45
|
+
|
46
|
+
You can now write in your view:
|
47
|
+
|
48
|
+
```slim
|
49
|
+
= my_first_partial title: 'foo', subtitle: 'bar', content: 'awesome content'
|
50
|
+
```
|
51
|
+
|
52
|
+
or more usefull
|
53
|
+
|
54
|
+
```slim
|
55
|
+
= my_first_partial title: 'foo', subtitle: 'bar' do |mfp|
|
56
|
+
- mfp.slot :content
|
57
|
+
div this is great
|
58
|
+
```
|
59
|
+
### A more interesting example
|
60
|
+
|
61
|
+
So far you could do the same with a partial. I know let's try something better.
|
62
|
+
|
63
|
+
#### The slot main
|
64
|
+
|
65
|
+
First there is a special slot by default: `slots[main]`
|
66
|
+
|
67
|
+
_card.html.slim
|
68
|
+
```slim
|
69
|
+
.card
|
70
|
+
.card__title = slots[:title]
|
71
|
+
.card__content
|
72
|
+
= slots[:main] # yep that's the one
|
73
|
+
```
|
74
|
+
|
75
|
+
you can now do:
|
76
|
+
|
77
|
+
```slim
|
78
|
+
= card title: 'foo' do
|
79
|
+
div this is great
|
80
|
+
```
|
81
|
+
|
82
|
+
#### More then one slot
|
83
|
+
|
84
|
+
_modal.html.slim
|
85
|
+
```slim
|
86
|
+
.modal
|
87
|
+
.modal__title = slots[:title]
|
88
|
+
.modal__content
|
89
|
+
= slots[:main]
|
90
|
+
.modal__footer
|
91
|
+
= slots[:footer]
|
92
|
+
```
|
93
|
+
|
94
|
+
It allows you to write something like this:
|
95
|
+
|
96
|
+
```slim
|
97
|
+
= modal title: 'foo' do |modal|
|
98
|
+
div hey look I'm a modal
|
99
|
+
- modal.slot :footer
|
100
|
+
div With a footer
|
101
|
+
```
|
102
|
+
|
103
|
+
#### And combine
|
104
|
+
|
105
|
+
With the two partials from before (modal and card) we can now do this:
|
106
|
+
|
107
|
+
```slim
|
108
|
+
= modal title: 'foo' do |modal|
|
109
|
+
= card title: 'a card in a modal do
|
110
|
+
div And wait there is still more
|
111
|
+
|
112
|
+
- modal.slot :footer
|
113
|
+
= card title: 'a card in a modal's foot do
|
114
|
+
div My example are getting a bit far fetched
|
115
|
+
```
|
116
|
+
|
117
|
+
There is a shortener for that last one
|
118
|
+
|
119
|
+
```slim
|
120
|
+
= modal title: 'foo' do |modal|
|
121
|
+
- modal.card slot: :main, title: 'a card in a modal do
|
122
|
+
div And wait there is still more
|
123
|
+
|
124
|
+
- modal.card slot: :footer title: 'a card in a modal's foot do
|
125
|
+
div My example are getting a bit far fetched
|
126
|
+
```
|
127
|
+
|
128
|
+
You can also call the slot several times like thus:
|
129
|
+
|
130
|
+
```slim
|
131
|
+
= modal title: 'foo' do |modal|
|
132
|
+
- modal.card slot: :footer title: 'first card'
|
133
|
+
- modal.card slot: :footer title: 'second card'
|
134
|
+
- modal.card slot: :footer title: 'third card in a modal'
|
135
|
+
```
|
136
|
+
|
137
|
+
## What else?
|
138
|
+
|
139
|
+
You noticed all my example are with slim. But it work great with yaml or erb.
|
140
|
+
|
141
|
+
I also name my partials with the [BEM notation](http://getbem.com/). I find it easier to organise them by components specialy if you already use this same notation with your css.
|
142
|
+
|
143
|
+
## License
|
144
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'SlotMachine'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.md')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'bundler/gem_tasks'
|
18
|
+
|
19
|
+
require 'rake/testtask'
|
20
|
+
|
21
|
+
Rake::TestTask.new(:test) do |t|
|
22
|
+
t.libs << 'test'
|
23
|
+
t.pattern = 'test/**/*_test.rb'
|
24
|
+
t.verbose = false
|
25
|
+
end
|
26
|
+
|
27
|
+
task default: :test
|
data/lib/slot_machine.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# Config where is store all informations
|
2
|
+
module SlotMachine::Config
|
3
|
+
def self.read_slots
|
4
|
+
slots_array = Dir[path].map do |path|
|
5
|
+
basename = File.basename(path, File.extname(path))
|
6
|
+
basename = basename.split('.').first
|
7
|
+
basename.slice!(0)
|
8
|
+
method_name = basename.parameterize.underscore.to_sym
|
9
|
+
partial = File.join('slots', basename)
|
10
|
+
[method_name, partial]
|
11
|
+
end
|
12
|
+
|
13
|
+
@slots = Hash[slots_array]
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.method_names
|
17
|
+
@slots.keys
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.partial(method_name)
|
21
|
+
@slots[method_name]
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.path
|
25
|
+
@path || Rails.root.join('app/views/slots/_*')
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.path=(value)
|
29
|
+
@path = value
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# Helper to be included in application_controller
|
2
|
+
module SlotMachine::Helper
|
3
|
+
# In the the view:
|
4
|
+
# `= foo label: 'toto' do 'something awesome' end`
|
5
|
+
#
|
6
|
+
# In the partial foo:
|
7
|
+
# `slots[:label] == label == 'toto'`
|
8
|
+
# `slots[:main] == main == 'something awesome'`
|
9
|
+
#
|
10
|
+
# so you should use `slots[:something]` when it could be unassigned
|
11
|
+
extend ActiveSupport::Concern
|
12
|
+
|
13
|
+
included do
|
14
|
+
SlotMachine::Config.read_slots
|
15
|
+
SlotMachine::Config.method_names.each do |method_name|
|
16
|
+
define_method(method_name) do |locals = {}, &block|
|
17
|
+
# that is some weird shit but il allow to access all the local_assigns
|
18
|
+
# within the slots and still access the directly
|
19
|
+
locals[:slots] = locals
|
20
|
+
|
21
|
+
# Here we create the builder
|
22
|
+
# we execute the block while passing the builder
|
23
|
+
# all the slotted partial will be in the builder
|
24
|
+
# and activeview buffer is captured and slotted
|
25
|
+
# in the main slot
|
26
|
+
if block
|
27
|
+
builder = Builder.new(self)
|
28
|
+
captured = capture { block.call(builder) }
|
29
|
+
builder.append_slot(:main, captured)
|
30
|
+
locals[:slots] = locals[:slots].merge(builder.slots)
|
31
|
+
locals[:m] = builder
|
32
|
+
end
|
33
|
+
render SlotMachine::Config.partial(method_name), locals
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# A builder for the different partial
|
38
|
+
class Builder
|
39
|
+
attr_internal :slots
|
40
|
+
|
41
|
+
def initialize(template)
|
42
|
+
@template = template
|
43
|
+
end
|
44
|
+
|
45
|
+
# attribute reader
|
46
|
+
def slots
|
47
|
+
@slots ||= Hash.new { |h, k| h[k] = ActiveSupport::SafeBuffer.new('') }
|
48
|
+
end
|
49
|
+
|
50
|
+
def slot?(name)
|
51
|
+
!slots[name].blank?
|
52
|
+
end
|
53
|
+
|
54
|
+
# append the named slot
|
55
|
+
def append_slot(name = :main, string = nil, &block)
|
56
|
+
slots[name].concat(@template.get_buffer(string, &block))
|
57
|
+
nil # why the fuck do I need this. It shouldn't put anything in the buffer but it does.
|
58
|
+
end
|
59
|
+
alias_method :slot, :append_slot
|
60
|
+
|
61
|
+
SlotMachine::Config.method_names.each do |method_name|
|
62
|
+
define_method(method_name) do |args = { slot: :main }, &block|
|
63
|
+
slot_name = args.delete(:slot)
|
64
|
+
rendered_partial = @template.send(method_name, args, &block)
|
65
|
+
append_slot(slot_name, rendered_partial)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# this one should be in the builder but it doesnt have the builder method
|
72
|
+
def get_buffer(string = nil, &block)
|
73
|
+
return string unless block
|
74
|
+
|
75
|
+
capture { yield }
|
76
|
+
end
|
77
|
+
end
|
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: slotmachine
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Cedric Feyaerts
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-12-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 4.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 4.0.0
|
27
|
+
description: It hide the ugly css and html from your views
|
28
|
+
email:
|
29
|
+
- c.feyaerts@adhoc-gti.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- MIT-LICENSE
|
35
|
+
- README.md
|
36
|
+
- Rakefile
|
37
|
+
- lib/slot_machine.rb
|
38
|
+
- lib/slot_machine/application_controller_concern.rb
|
39
|
+
- lib/slot_machine/config.rb
|
40
|
+
- lib/slot_machine/helper.rb
|
41
|
+
- lib/slot_machine/railtie.rb
|
42
|
+
- lib/slot_machine/version.rb
|
43
|
+
homepage: https://gitlab.com/cedricfeyaerts/slot-machine
|
44
|
+
licenses:
|
45
|
+
- MIT
|
46
|
+
metadata: {}
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
requirements: []
|
62
|
+
rubyforge_project:
|
63
|
+
rubygems_version: 2.6.13
|
64
|
+
signing_key:
|
65
|
+
specification_version: 4
|
66
|
+
summary: A Simple gem to write readable views
|
67
|
+
test_files: []
|