jb 0.7.1 → 0.8.1

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
  SHA256:
3
- metadata.gz: 59eb01a4bdc65f57ef3be62f4d48adf07bfba844153648ed67d99040524b6574
4
- data.tar.gz: 32ea214a1d1d0a0cc1cf8d066e13788d0427313d44ef0719d6e2f229efe03628
3
+ metadata.gz: 59c07bc2a0d9dd1b6e304a1f6c3037ccd2234cda1a5273ff8f0d12bb1e814270
4
+ data.tar.gz: 545f3b027f587ab30de9d2e93fad5b3ea399ad8a6695b9090d3e7b55085ab505
5
5
  SHA512:
6
- metadata.gz: de7988c0db6f46a64562f9dbb3b072887fb0120157e853b92819008674ca4ebaff564adf6c635b6885074e8dfea2769bf34cb34db7d659af038073362cd02398
7
- data.tar.gz: a8a754d42c80ea3db3bed9d55b63f704b16531ba0ed16ce6fa9bfa15af18599958743f4c3dff836a464345a3e6c3868cb0e1f4385a193da049985e1dfba2a4c1
6
+ metadata.gz: b9ef88b516a5bee2132af07f394a00f03bfda2928764b538189aa061d9af1c60c4942cb874d416e5d36265839bac1df8463cb5c8e795536000a903bbbecadc25
7
+ data.tar.gz: e0b272e833109cd995104fa033208eca904922a3ef66148dcbe583665917393efd99120800605ae9c35c3527f2530ee96762ee5bb991f650538f7dd0c896fab7
@@ -0,0 +1,63 @@
1
+ name: Ruby
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+ schedule:
7
+ - cron: '26 13 * * *'
8
+
9
+ jobs:
10
+ build:
11
+ strategy:
12
+ matrix:
13
+ ruby_version: [ruby-head, '3.2', '3.1', '3.0', '2.7']
14
+ rails_version: [edge, '7.0', '6.1']
15
+
16
+ include:
17
+ - ruby_version: '3.0'
18
+ rails_version: '6.0'
19
+
20
+ - ruby_version: '2.7'
21
+ rails_version: '6.0'
22
+
23
+ - ruby_version: '2.6'
24
+ rails_version: '6.1'
25
+ - ruby_version: '2.6'
26
+ rails_version: '6.0'
27
+ - ruby_version: '2.6'
28
+ rails_version: '5.2'
29
+ - ruby_version: '2.6'
30
+ rails_version: '5.1'
31
+ - ruby_version: '2.6'
32
+ rails_version: '5.0'
33
+ - ruby_version: '2.6'
34
+ rails_version: '4.2'
35
+ bundler_version: '1'
36
+
37
+ - ruby_version: '2.5'
38
+ rails_version: '5.2'
39
+ - ruby_version: '2.5'
40
+ rails_version: '4.2'
41
+ bundler_version: '1'
42
+
43
+ - ruby_version: '2.4'
44
+ rails_version: '5.2'
45
+ - ruby_version: '2.4'
46
+ rails_version: '4.2'
47
+ bundler_version: '1'
48
+
49
+ env:
50
+ RAILS_VERSION: ${{ matrix.rails_version }}
51
+
52
+ runs-on: ubuntu-latest
53
+
54
+ steps:
55
+ - uses: actions/checkout@v4
56
+ - uses: ruby/setup-ruby@v1
57
+ with:
58
+ ruby-version: ${{ matrix.ruby_version }}
59
+ bundler: ${{ matrix.bundler_version }}
60
+ bundler-cache: true
61
+ continue-on-error: ${{ (matrix.ruby_version == 'ruby-head') || (matrix.allow_failures == 'true') }}
62
+ - run: bundle exec rake
63
+ continue-on-error: ${{ (matrix.ruby_version == 'ruby-head') || (matrix.allow_failures == 'true') }}
data/Gemfile CHANGED
@@ -5,5 +5,18 @@ source 'https://rubygems.org'
5
5
  # Specify your gem's dependencies in jb.gemspec
6
6
  gemspec
7
7
 
8
+ if ENV['RAILS_VERSION'] == 'edge'
9
+ gem 'rails', git: 'https://github.com/rails/rails.git', branch: 'main'
10
+ elsif ENV['RAILS_VERSION']
11
+ gem 'rails', "~> #{ENV['RAILS_VERSION']}.0"
12
+ else
13
+ gem 'rails'
14
+ end
15
+
16
+ gem 'nokogiri', RUBY_VERSION < '2.1' ? '~> 1.6.0' : '>= 1.7'
17
+ gem 'loofah', RUBY_VERSION < '2.5' ? '< 2.21.0' : '>= 0'
18
+ gem 'selenium-webdriver'
19
+ gem 'net-smtp' if RUBY_VERSION >= '3.1'
20
+
8
21
  # For benchmarking
9
22
  gem 'action_args'
data/README.md CHANGED
@@ -21,19 +21,34 @@ Put a template file named `*.jb` in your Rails app's `app/views/*` directory, an
21
21
 
22
22
  ## Features
23
23
 
24
- * No ugly builder syntax
24
+ * No original builder syntax that you have to learn
25
25
  * No `method_missing` calls
26
26
  * `render_partial` with :collection option actually renders the collection (unlike Jbuilder)
27
27
 
28
28
 
29
29
  ## Syntax
30
30
 
31
- A `.jb` template should contain Ruby code that returns any Ruby Object that responds_to `to_json` (generally Hash or Array).
32
- Then the return value will be `to_json`ed to a JSON String.
31
+ A `.jb` template should contain Ruby code that returns any Ruby Object that responds\_to `to_json` (generally Hash or Array). Then the return value will be `to_json`ed to a JSON String.
33
32
 
34
33
 
35
34
  ## Examples
36
35
 
36
+ Let's start with a very simple one. Just write a Ruby Hash as a template:
37
+
38
+ ``` ruby
39
+ {language: 'Ruby', author: {name: 'Matz'}}
40
+ ```
41
+
42
+ This renders the following JSON text:
43
+
44
+ ``` javascript
45
+ {"language": "Ruby", "author": {"name": "Matz"}}
46
+ ```
47
+
48
+ Note that modern Ruby Hash syntax pretty much looks alike JSON syntax. It's super-straight forward. Who needs a DSL to do this?
49
+
50
+ Next one is a little bit advanced usage. The template doesn't have to be a single literal but can be any code that returns a Hash object:
51
+
37
52
  ``` ruby
38
53
  # app/views/messages/show.json.jb
39
54
 
@@ -97,18 +112,17 @@ This will build the following structure:
97
112
  }
98
113
  ```
99
114
 
100
- To define attribute and structure names dynamically, just use Ruby Hash.
101
- Note that modern Ruby Hash syntax pretty much looks alike JSON syntax.
102
- It's super-straight forward. Who needs a DSL to do this?
115
+ If you want to define attribute and structure names dynamically, of course you still can do this with a Ruby Hash literal.
103
116
 
104
117
  ``` ruby
105
- {author: {name: 'Matz'}}
118
+ # model_name, column_name = :author, :name
119
+
120
+ {model_name => {column_name => 'Matz'}}
106
121
 
107
122
  # => {"author": {"name": "Matz"}}
108
123
  ```
109
124
 
110
- Top level arrays can be handled directly. Useful for index and other collection actions.
111
- And you know, Ruby is such a powerful language for manipulating collections:
125
+ Top level arrays can be handled directly. Useful for index and other collection actions. And you know, Ruby is such a powerful language for manipulating collections:
112
126
 
113
127
  ``` ruby
114
128
  # @comments = @post.comments
@@ -136,11 +150,7 @@ Jb has no special DSL method for extracting attributes from array directly, but
136
150
  # => [{"id": 1, "name": "Matz"}, {"id": 2, "name": "Nobu"}]
137
151
  ```
138
152
 
139
- You can use Jb directly as an Action View template language.
140
- When required in Rails, you can create views ala show.json.jb.
141
- You'll notice in the following example that the `.jb` template
142
- doesn't have to be one big Ruby Hash literal as a whole
143
- but it can be any Ruby code that finally returns a Hash instance.
153
+ You can use Jb directly as an Action View template language. When required in Rails, you can create views ala `show.json.jb`. You'll notice in the following example that the `.jb` template doesn't have to be one big Ruby Hash literal as a whole but it can be any Ruby code that finally returns a Hash instance.
144
154
 
145
155
  ``` ruby
146
156
  # Any helpers available to views are available in the template
@@ -163,10 +173,7 @@ end
163
173
  json
164
174
  ```
165
175
 
166
- You can use partials as well. The following will render the file
167
- `views/comments/_comments.json.jb`, and set a local variable
168
- `comments` with all this message's comments, which you can use inside
169
- the partial.
176
+ You can use partials as well. The following will render the file `views/comments/_comments.json.jb`, and set a local variable `comments` with all this message's comments, which you can use inside the partial.
170
177
 
171
178
  ```ruby
172
179
  render 'comments/comments', comments: @message.comments
@@ -178,8 +185,7 @@ It's also possible to render collections of partials:
178
185
  render partial: 'posts/post', collection: @posts, as: :post
179
186
  ```
180
187
 
181
- > NOTE: Don't use `render @post.comments` because if the collection is empty,
182
- `render` will return `nil` instead of an empty array.
188
+ > NOTE: Don't use `render @post.comments` because if the collection is empty, `render` will return `nil` instead of an empty array.
183
189
 
184
190
  You can pass any objects into partial templates with or without `:locals` option.
185
191
 
@@ -211,8 +217,7 @@ end
211
217
 
212
218
 
213
219
  ## The Generator
214
- Jb extends the default Rails scaffold generator and adds some .jb templates.
215
- If you don't need them, please configure like so.
220
+ Jb extends the default Rails scaffold generator and adds some `.jb` templates. If you don't need them, please configure like so.
216
221
 
217
222
  ```ruby
218
223
  Rails.application.config.generators.jb false
data/jb.gemspec CHANGED
@@ -21,12 +21,11 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
- spec.add_dependency 'multi_json'
25
-
26
24
  spec.add_development_dependency 'bundler'
27
25
  spec.add_development_dependency 'rake'
28
26
  spec.add_development_dependency 'test-unit-rails'
29
27
  spec.add_development_dependency 'rails'
30
28
  spec.add_development_dependency 'action_args'
31
- spec.add_development_dependency 'byebug'
29
+ spec.add_development_dependency 'debug'
30
+ spec.add_development_dependency 'selenium-webdriver'
32
31
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- # Mokey-patches for Action View 4 and 5
2
+ # Monkey-patches for Action View 4 and 5
3
3
 
4
4
  module Jb
5
5
  module PartialRenderer
@@ -44,7 +44,7 @@ module Jb
44
44
  module TemplateRenderer
45
45
  module JSONizer
46
46
  def render_template(template, *)
47
- template.respond_to?(:handler) && (template.handler == Jb::Handler) ? MultiJson.dump(super) : super
47
+ template.respond_to?(:handler) && (template.handler == Jb::Handler) ? super.to_json : super
48
48
  end
49
49
  end
50
50
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- # Mokey-patches for Action View 6+
2
+ # Monkey-patches for Action View 6+
3
3
 
4
4
  module Jb
5
5
  # A monkey-patch that converts non-partial result to a JSON String
@@ -7,13 +7,41 @@ module Jb
7
7
  module JSONizer
8
8
  def render_template(_view, template, *)
9
9
  rendered_template = super
10
- rendered_template.instance_variable_set :@body, MultiJson.dump(rendered_template.body) if template.respond_to?(:handler) && (template.handler == Jb::Handler)
10
+ rendered_template.instance_variable_set :@body, rendered_template.body.to_json if template.respond_to?(:handler) && (template.handler == Jb::Handler)
11
11
  rendered_template
12
12
  end
13
13
  end
14
14
  end
15
15
 
16
- # A monkey-patch for jb template collection result's `body` not to return a String but an Array
16
+ # Rails 7.1+: A monkey-patch not to stringify rendered object from JB templates
17
+ module BaseToSCanceller
18
+ def _run(method, template, *, **)
19
+ val = super
20
+ if template.respond_to?(:handler) && (template.handler == Jb::Handler)
21
+ def val.to_s
22
+ self
23
+ end
24
+ end
25
+ val
26
+ end
27
+ end
28
+
29
+ # Rails 6.1+: A monkey-patch for jb template collection result's `body` not to return a String but an Array
30
+ module CollectionRendererExtension
31
+ private def render_collection(_collection, _view, _path, template, _layout, _block)
32
+ obj = super
33
+ if template.respond_to?(:handler) && (template.handler == Jb::Handler)
34
+ if ActionView::AbstractRenderer::RenderedCollection::EmptyCollection === obj
35
+ def obj.body; []; end
36
+ else
37
+ def obj.body; @rendered_templates.map(&:body); end
38
+ end
39
+ end
40
+ obj
41
+ end
42
+ end
43
+
44
+ # Rails 6.0: A monkey-patch for jb template collection result's `body` not to return a String but an Array
17
45
  module PartialRendererExtension
18
46
  private def render_collection(_view, template)
19
47
  obj = super
@@ -30,4 +58,10 @@ module Jb
30
58
  end
31
59
 
32
60
  ::ActionView::TemplateRenderer.prepend ::Jb::TemplateRenderer::JSONizer
33
- ::ActionView::PartialRenderer.prepend ::Jb::PartialRendererExtension
61
+ ::ActionView::Base.prepend ::Jb::BaseToSCanceller if (ActionView::VERSION::MAJOR >= 7) && (ActionView::VERSION::MINOR >= 1)
62
+ begin
63
+ # ActionView::CollectionRenderer is a newly added class since 6.1
64
+ ::ActionView::CollectionRenderer.prepend ::Jb::CollectionRendererExtension
65
+ rescue NameError
66
+ ::ActionView::PartialRenderer.prepend ::Jb::PartialRendererExtension
67
+ end
data/lib/jb/railtie.rb CHANGED
@@ -4,7 +4,6 @@ module Jb
4
4
  class Railtie < ::Rails::Railtie
5
5
  initializer 'jb' do
6
6
  ActiveSupport.on_load :action_view do
7
- require 'multi_json'
8
7
  if Rails::VERSION::MAJOR >= 6
9
8
  require 'jb/action_view_monkeys'
10
9
  else
data/lib/jb/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Jb
4
- VERSION = '0.7.1'
4
+ VERSION = '0.8.1'
5
5
  end
metadata CHANGED
@@ -1,23 +1,23 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Akira Matsuda
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-04 00:00:00.000000000 Z
11
+ date: 2023-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: multi_json
14
+ name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
- type: :runtime
20
+ type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: bundler
28
+ name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rake
42
+ name: test-unit-rails
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: test-unit-rails
56
+ name: rails
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rails
70
+ name: action_args
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: action_args
84
+ name: debug
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: byebug
98
+ name: selenium-webdriver
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -115,8 +115,8 @@ executables: []
115
115
  extensions: []
116
116
  extra_rdoc_files: []
117
117
  files:
118
+ - ".github/workflows/main.yml"
118
119
  - ".gitignore"
119
- - ".travis.yml"
120
120
  - Gemfile
121
121
  - LICENSE.txt
122
122
  - README.md
@@ -125,11 +125,6 @@ files:
125
125
  - bin/console
126
126
  - bin/setup
127
127
  - gemfiles/benchmark.gemfile
128
- - gemfiles/rails_42.gemfile
129
- - gemfiles/rails_50.gemfile
130
- - gemfiles/rails_51.gemfile
131
- - gemfiles/rails_52.gemfile
132
- - gemfiles/rails_60.gemfile
133
128
  - jb.gemspec
134
129
  - lib/generators/rails/jb_generator.rb
135
130
  - lib/generators/rails/scaffold_controller_generator.rb
@@ -145,7 +140,7 @@ homepage: https://github.com/amatsuda/jb
145
140
  licenses:
146
141
  - MIT
147
142
  metadata: {}
148
- post_install_message:
143
+ post_install_message:
149
144
  rdoc_options: []
150
145
  require_paths:
151
146
  - lib
@@ -160,8 +155,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
160
155
  - !ruby/object:Gem::Version
161
156
  version: '0'
162
157
  requirements: []
163
- rubygems_version: 3.0.3
164
- signing_key:
158
+ rubygems_version: 3.5.0.dev
159
+ signing_key:
165
160
  specification_version: 4
166
161
  summary: Faster and simpler Jbuilder alternative
167
162
  test_files: []
data/.travis.yml DELETED
@@ -1,24 +0,0 @@
1
- language: ruby
2
-
3
- rvm:
4
- - 2.7.0
5
- - 2.6.5
6
- - 2.5.7
7
-
8
- gemfile:
9
- - gemfiles/rails_60.gemfile
10
- - gemfiles/rails_52.gemfile
11
- - gemfiles/rails_51.gemfile
12
- - gemfiles/rails_50.gemfile
13
- - gemfiles/rails_42.gemfile
14
-
15
- matrix:
16
- exclude:
17
- - rvm: 2.7.0
18
- gemfile: gemfiles/rails_52.gemfile
19
- - rvm: 2.7.0
20
- gemfile: gemfiles/rails_51.gemfile
21
- - rvm: 2.7.0
22
- gemfile: gemfiles/rails_50.gemfile
23
- - rvm: 2.7.0
24
- gemfile: gemfiles/rails_42.gemfile
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- gemspec :path => '../'
6
-
7
- gem 'rails', '~> 4.2.0'
8
- gem 'nokogiri', RUBY_VERSION < '2.1' ? '~> 1.6.0' : '>= 1.7'
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- gemspec :path => '../'
6
-
7
- gem 'rails', '~> 5.0.0'
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- gemspec :path => '../'
6
-
7
- gem 'rails', '~> 5.1.0'
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- gemspec :path => '../'
6
-
7
- gem 'rails', '~> 5.2.0'
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- gemspec :path => '../'
6
-
7
- gem 'rails', '~> 6.0.0.beta3'
8
- gem 'selenium-webdriver'