erb_component 0.1.9 → 0.2.1

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
  SHA256:
3
- metadata.gz: e662fbd72853e9bfd5788ceb66debf03d28d8bb13dcbd4ed18142dc26d29332f
4
- data.tar.gz: 0c3d0e0435280f432bc54bb14c11b1cda6e460fb678e23b53e49e6ed1ea83f1b
3
+ metadata.gz: 5de384cea9f470c6f868504164cac3c5f3699e7abb745834510770958463fde8
4
+ data.tar.gz: 59b2b4bcaed9977ddd6b37a7666cc6ccc6ce7119d2a1a6eea34ef0032842b59f
5
5
  SHA512:
6
- metadata.gz: 6357e20fb5f55c3e4d6813ff0fb937fba43faa0b15c5fe6cfb340ad6b427e032bee671a1cb0828dd019c658b26811e4738a2510c2900bb9334838847110dedc0
7
- data.tar.gz: 71bceefd23ee82ee445bf4ec81d4cd6852fd2476b26c9037639360792b523cbd100d83e873b180df221d19a9aa915004d9f67c79046305843dff1160e66b2107
6
+ metadata.gz: 0d34289d0b204ba847d9bbdd6467d1dd7fcc10d923703ba8a8d7252718d2093ced3b002888da2f71b45c739842c1d16d55e8bc94accccd49b31a2fd788c1995b
7
+ data.tar.gz: 69c1cc17b40e3b38e4d58733e6b1e5971953166d50d47446152f3d23375f1b93ab825f4274258d57b95bd4b41407cde9aaa74a02b021f1c7eaa6c842cc63a3e2
data/.gitattributes ADDED
@@ -0,0 +1 @@
1
+ * text=auto eol=lf
data/.gitignore CHANGED
@@ -6,3 +6,5 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+
10
+ .idea
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/Gemfile CHANGED
File without changes
data/Gemfile.lock ADDED
@@ -0,0 +1,74 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ erb_component (0.2.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ actionview (6.1.3.2)
10
+ activesupport (= 6.1.3.2)
11
+ builder (~> 3.1)
12
+ erubi (~> 1.4)
13
+ rails-dom-testing (~> 2.0)
14
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
15
+ activesupport (6.1.3.2)
16
+ concurrent-ruby (~> 1.0, >= 1.0.2)
17
+ i18n (>= 1.6, < 2)
18
+ minitest (>= 5.1)
19
+ tzinfo (~> 2.0)
20
+ zeitwerk (~> 2.3)
21
+ builder (3.2.4)
22
+ coderay (1.1.3)
23
+ concurrent-ruby (1.1.8)
24
+ crass (1.0.6)
25
+ diff-lcs (1.4.4)
26
+ erubi (1.10.0)
27
+ i18n (1.8.10)
28
+ concurrent-ruby (~> 1.0)
29
+ loofah (2.9.1)
30
+ crass (~> 1.0.2)
31
+ nokogiri (>= 1.5.9)
32
+ method_source (1.0.0)
33
+ minitest (5.14.4)
34
+ nokogiri (1.11.4-x86_64-linux)
35
+ racc (~> 1.4)
36
+ pry (0.14.1)
37
+ coderay (~> 1.1)
38
+ method_source (~> 1.0)
39
+ racc (1.5.2)
40
+ rails-dom-testing (2.0.3)
41
+ activesupport (>= 4.2.0)
42
+ nokogiri (>= 1.6)
43
+ rails-html-sanitizer (1.3.0)
44
+ loofah (~> 2.3)
45
+ rake (12.3.3)
46
+ rspec (3.10.0)
47
+ rspec-core (~> 3.10.0)
48
+ rspec-expectations (~> 3.10.0)
49
+ rspec-mocks (~> 3.10.0)
50
+ rspec-core (3.10.1)
51
+ rspec-support (~> 3.10.0)
52
+ rspec-expectations (3.10.1)
53
+ diff-lcs (>= 1.2.0, < 2.0)
54
+ rspec-support (~> 3.10.0)
55
+ rspec-mocks (3.10.2)
56
+ diff-lcs (>= 1.2.0, < 2.0)
57
+ rspec-support (~> 3.10.0)
58
+ rspec-support (3.10.2)
59
+ tzinfo (2.0.4)
60
+ concurrent-ruby (~> 1.0)
61
+ zeitwerk (2.4.2)
62
+
63
+ PLATFORMS
64
+ x86_64-linux
65
+
66
+ DEPENDENCIES
67
+ actionview
68
+ erb_component!
69
+ pry (~> 0.14)
70
+ rake (~> 12.0)
71
+ rspec (~> 3.5)
72
+
73
+ BUNDLED WITH
74
+ 2.2.3
data/LICENSE.txt CHANGED
File without changes
data/README.md CHANGED
@@ -1,8 +1,10 @@
1
1
  # ErbComponent
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/erb_component`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ Why not have view components and write them in OOP style? It hides complexity. DRYes views.
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ **FEEL FREE TO OPEN AN ISSUE OR HAVE SOME DISCUSSION**.
6
+
7
+ **USE WITH CAUTION!** This is more like an experiment.
6
8
 
7
9
  ## Installation
8
10
 
@@ -22,17 +24,132 @@ Or install it yourself as:
22
24
 
23
25
  ## Usage
24
26
 
25
- TODO: Write usage instructions here
27
+ ### Easiest example
28
+
29
+ It's important to define `template` method
30
+ ```ruby
31
+ class ImgTag < ErbComponent
32
+ attr_reader :src
33
+
34
+ # req is Rack::Request or ActionDispatch::Request (for Rails)
35
+ def initialize(req, opts)
36
+ @src = opts[:src]
37
+ super
38
+ end
39
+
40
+ def template
41
+ <<ERB
42
+ <img src="<%= src %>" />
43
+ ERB
44
+ end
45
+ end
46
+
47
+ # Somewhere in views:
48
+ url = "https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Ruby_logo.svg/1920px-Ruby_logo.svg.png"
49
+ ImgTag.(request, src: url) # or ImgTag.new(request, src: url).call
50
+ # => "<img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Ruby_logo.svg/1920px-Ruby_logo.svg.png\" />\n"
51
+ ```
52
+
53
+ ### You can use more elegant Rails content_tag
26
54
 
27
- ## Development
55
+ ```ruby
56
+ class ImgContentTag < ErbComponent
57
+ attr_reader :src
58
+
59
+ def initialize(req, opts)
60
+ @src = opts[:src]
61
+ super
62
+ end
63
+
64
+ def template
65
+ content_tag :img, nil, src: src
66
+ end
67
+ end
68
+ ```
69
+
70
+ ### More advanced nested example
28
71
 
29
- After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
72
+ Here `TabNavs.(request, tab_list: %w(overview photos contact accommodations))` will generate Bootstrap's tab navigation, like here: https://getbootstrap.com/docs/5.0/components/navs-tabs/
73
+ ```ruby
74
+ class TabNavs < ErbComponent
75
+ attr_reader :tab_list
76
+
77
+ def initialize(req, tab_list:)
78
+ @tab_list = tab_list
79
+ super
80
+ end
81
+
82
+ def template
83
+ <<ERB
84
+ <ul class="nav nav-tabs" id="myTab" role="tablist">
85
+ <%= tab_list_rendered %>
86
+ </ul>
87
+ ERB
88
+ end
89
+
90
+ def tab_list_rendered
91
+ active_found = false
92
+ opts = tab_list.map do |i|
93
+ if params[:active_tab] == i
94
+ active_found = true
95
+ {target: i, active: true}
96
+ else
97
+ {target: i, active: false}
98
+ end
99
+ end
100
+
101
+ opts[0][:active] = true unless active_found
102
+
103
+ opts.map do |i|
104
+ NavItem.(req, **i)
105
+ end.join("\n")
106
+ end
107
+ end
108
+
109
+ class NavItem < ErbComponent
110
+ attr_reader :target
111
+
112
+ def initialize(req_params, active: false, target:)
113
+ @req_params = req_params
114
+ @active = active
115
+ @target = target
116
+ super
117
+ end
118
+
119
+ def template
120
+ <<ERB
121
+ <li class="nav-item" role="presentation">
122
+ <button class="<%= button_class %>" id="<%= id %>" data-bs-toggle="tab" data-bs-target="#<%= target %>" type="button" role="tab" aria-controls="<%= target %>" aria-selected="true">
123
+ <%= tab_name %>
124
+ </button>
125
+ </li>
126
+ ERB
127
+ end
128
+
129
+ def id
130
+ "#{target}-tab"
131
+ end
132
+
133
+ def tab_name
134
+ target.humanize
135
+ end
136
+
137
+ def button_class
138
+ res = "nav-link"
139
+ res += " active" if active?
140
+ res
141
+ end
142
+
143
+ def active?
144
+ @active
145
+ end
146
+ end
147
+ ```
30
148
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
149
 
33
150
  ## Contributing
34
151
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/erb_component.
152
+ Bug reports and pull requests are welcome on GitHub at https://github.com/arthurkarganyan/erb_component.
36
153
 
37
154
 
38
155
  ## License
data/Rakefile CHANGED
File without changes
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "lib/erb_component/version"
2
4
 
3
5
  Gem::Specification.new do |spec|
@@ -22,7 +24,8 @@ Gem::Specification.new do |spec|
22
24
  spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
23
25
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
26
  end
25
- spec.bindir = "exe"
26
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.add_development_dependency "rspec", "~> 3.5"
28
+ spec.add_development_dependency "pry", "~> 0.14"
29
+ spec.add_development_dependency "actionview"
27
30
  spec.require_paths = ["lib"]
28
31
  end
data/lib/erb_component.rb CHANGED
@@ -1,3 +1,2 @@
1
1
  require "erb_component/version"
2
-
3
- autoload :ErbComponent, "erb_component/erb_component"
2
+ require "erb_component/erb_component"
@@ -4,6 +4,9 @@ require 'erb'
4
4
 
5
5
  class ErbComponent
6
6
  include ReqTools
7
+ if defined? ActionView::Helpers::TagHelper
8
+ include ActionView::Helpers::TagHelper
9
+ end
7
10
 
8
11
  class Error < StandardError;
9
12
  end
@@ -24,19 +27,24 @@ class ErbComponent
24
27
 
25
28
  def render
26
29
  str = ERB.new(template).result(binding)
27
- if parent
28
- parent.render.gsub("{{VIEW}}", str).gsub("{{view}}", str)
30
+ res = if parent
31
+ parent.render.gsub("{{VIEW}}", str).gsub("{{view}}", str)
32
+ else
33
+ str
34
+ end
35
+ if res.respond_to? :html_safe
36
+ res.html_safe
29
37
  else
30
- str
38
+ res
31
39
  end
32
40
  end
33
41
 
34
- def self.render(opts = {})
35
- new(opts).render
42
+ def self.call(req, opts = {})
43
+ new(req, **opts).render
36
44
  end
37
45
 
38
- def self.call(req, opts = {})
39
- new(req, opts).render
46
+ def call
47
+ self.render
40
48
  end
41
49
 
42
50
  def self.current_file=(file)
@@ -14,7 +14,11 @@ module ReqTools
14
14
  res[split[i - 1].singularize + "_id"] = split[i]
15
15
  end
16
16
  end
17
- res.with_indifferent_access
17
+ if res.respond_to? :with_indifferent_access
18
+ res.with_indifferent_access
19
+ else
20
+ res
21
+ end
18
22
  end
19
23
  end
20
24
 
@@ -23,7 +27,11 @@ module ReqTools
23
27
  res = @req.params
24
28
  res.merge!(JSON.parse(req.body.read)) if req.post? || req.put? || req.patch?
25
29
  res.merge!(path_hash)
26
- res.with_indifferent_access
30
+ if res.respond_to? :with_indifferent_access
31
+ res.with_indifferent_access
32
+ else
33
+ res
34
+ end
27
35
  end
28
36
  end
29
37
 
@@ -1,3 +1,3 @@
1
1
  class ErbComponent
2
- VERSION = "0.1.9"
2
+ VERSION = "0.2.1"
3
3
  end
metadata CHANGED
@@ -1,15 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: erb_component
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arthur Karganyan
8
- autorequire:
9
- bindir: exe
8
+ autorequire:
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-05 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2021-05-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.14'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.14'
41
+ - !ruby/object:Gem::Dependency
42
+ name: actionview
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
13
55
  description: React-style front-end components but for ERB?
14
56
  email:
15
57
  - arthur.karganyan@gmail.com
@@ -17,12 +59,14 @@ executables: []
17
59
  extensions: []
18
60
  extra_rdoc_files: []
19
61
  files:
62
+ - ".gitattributes"
20
63
  - ".gitignore"
64
+ - ".rspec"
21
65
  - Gemfile
66
+ - Gemfile.lock
22
67
  - LICENSE.txt
23
68
  - README.md
24
69
  - Rakefile
25
- - bin/erb_component
26
70
  - erb_component.gemspec
27
71
  - lib/erb_component.rb
28
72
  - lib/erb_component/erb_component.rb
@@ -35,7 +79,7 @@ metadata:
35
79
  allowed_push_host: https://rubygems.org
36
80
  homepage_uri: https://github.com/arthurkarganyan/erb_component
37
81
  source_code_uri: https://github.com/arthurkarganyan/erb_component
38
- post_install_message:
82
+ post_install_message:
39
83
  rdoc_options: []
40
84
  require_paths:
41
85
  - lib
@@ -50,9 +94,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
50
94
  - !ruby/object:Gem::Version
51
95
  version: '0'
52
96
  requirements: []
53
- rubyforge_project:
54
- rubygems_version: 2.7.6
55
- signing_key:
97
+ rubygems_version: 3.2.3
98
+ signing_key:
56
99
  specification_version: 4
57
100
  summary: React-style front-end components but for ERB?
58
101
  test_files: []
data/bin/erb_component DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "erb_component"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start(__FILE__)