rails-nm 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 28d5ade7ba4b58db524bb448069fdbb5e835219c52d1f6752a8d957579673846
4
+ data.tar.gz: c916a8f719b6ce6deaf3ea2a5b5cdecf5692ad068ab83304546dc11b4bc72905
5
+ SHA512:
6
+ metadata.gz: 6c72873a32837fefa91df64a3b65b01ce16f6745d5605e10543e69cd173dc3959206e2a119711f60a64294c6ea53ff4337dbe44b32db9957bc268b332b7c5801
7
+ data.tar.gz: ffadba6668badcb01e0880ff4116673d4023f6aa74d16c84614fa5c836af1ab8b37ceafbadf441a19494a883c263e6d07f828d6e46f6b25a3a390ae868283429
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ ruby "~> 2.5"
6
+
7
+ gemspec
8
+
9
+ gem "pry"
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2021-Present Kelly Redding and Collin Redding
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # RailsNm
2
+
3
+ Render `.json.nm` [Nm](https://github.com/redding/nm) templates in Rails.
4
+
5
+ ## Usage
6
+
7
+ There is nothing to do other than add the gem to your Gemfile. You can then add .json.nm templates to your JSON resource actions in `app/views`. See https://github.com/redding/nm#nm for details on the Nm template syntax.
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ gem "rails-nm"
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install rails-nm
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am "Added some feature"`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/lib/rails-nm.rb ADDED
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "much-config"
5
+ require "nm"
6
+ require "rails-nm/version"
7
+
8
+ module RailsNm
9
+ include MuchConfig
10
+
11
+ add_config
12
+
13
+ def self.source
14
+ @source ||= config.source
15
+ end
16
+
17
+ def self.encode(hash_or_array)
18
+ config.encoder.call(hash_or_array)
19
+ end
20
+
21
+ def self.render_content(
22
+ content,
23
+ template_identifier:,
24
+ context: Nm.default_context)
25
+ encode(
26
+ Nm::Context
27
+ .new(context, source: source, locals: config.locals.to_h)
28
+ .render_content(content, file_path: template_identifier),
29
+ )
30
+ end
31
+
32
+ class Config
33
+ attr_accessor :default_format, :extension, :locals, :encoder
34
+ attr_writer :views_path, :cache
35
+
36
+ def initialize
37
+ @default_format = :json
38
+ @extension = :nm
39
+ @locals = {}
40
+
41
+ @encoder = ->(hash_or_array){ ::JSON.dump(hash_or_array) }
42
+ end
43
+
44
+ def views_path
45
+ @views_path ||= ::Rails.root.join("app/views")
46
+ end
47
+
48
+ def cache
49
+ @cache = !::Rails.env.development? unless defined?(@cache)
50
+ @cache
51
+ end
52
+
53
+ def source
54
+ Nm::Source.new(
55
+ views_path,
56
+ cache: cache,
57
+ extension: extension,
58
+ locals: locals,
59
+ )
60
+ end
61
+ end
62
+ end
63
+
64
+ require "rails-nm/railtie" if defined?(::Rails)
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/railtie"
4
+ require "rails-nm"
5
+ require "rails-nm/template_handler"
6
+
7
+ module RailsNm; end
8
+
9
+ class RailsNm::Railtie < ::Rails::Railtie
10
+ initializer(:rails_nm) do
11
+ ::ActiveSupport.on_load(:action_view) do
12
+ ::ActionView::Template.register_template_handler(
13
+ RailsNm.config.extension,
14
+ ::RailsNm::TemplateHandler,
15
+ )
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails-nm"
4
+
5
+ module RailsNm; end
6
+
7
+ class RailsNm::TemplateHandler
8
+ cattr_accessor :default_format
9
+ self.default_format = RailsNm.config.default_format
10
+
11
+ def self.call(template, source = nil)
12
+ %{
13
+ RailsNm.render_content(
14
+ %{#{source || template.source}},
15
+ context: self,
16
+ template_identifier: "#{template.identifier}",
17
+ )
18
+ }
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsNm
4
+ VERSION = "0.1.0"
5
+ end
data/log/.keep ADDED
File without changes
data/rails-nm.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # frozen_string_literal: true
3
+
4
+ lib = File.expand_path("../lib", __FILE__)
5
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
+ require "rails-nm/version"
7
+
8
+ Gem::Specification.new do |gem|
9
+ gem.name = "rails-nm"
10
+ gem.version = RailsNm::VERSION
11
+ gem.authors = ["Kelly Redding", "Collin Redding"]
12
+ gem.email = ["kelly@kellyredding.com", "collin.redding@me.com"]
13
+ gem.summary = "Render .json.nm templates in Rails."
14
+ gem.description = "Render .json.nm templates in Rails."
15
+ gem.homepage = "https://github.com/redding/rails-nm"
16
+ gem.license = "MIT"
17
+
18
+ gem.files = `git ls-files | grep "^[^.]"`.split($INPUT_RECORD_SEPARATOR)
19
+
20
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
21
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
22
+ gem.require_paths = ["lib"]
23
+
24
+ gem.required_ruby_version = "~> 2.5"
25
+
26
+ gem.add_development_dependency("much-style-guide", ["~> 0.6.6"])
27
+ gem.add_development_dependency("assert", ["~> 2.19.6"])
28
+ gem.add_development_dependency("rails", ["> 5.0", "< 7.0"])
29
+
30
+ gem.add_dependency("nm", ["~> 0.6.0"])
31
+ gem.add_dependency("much-config", ["~> 0.1.0"])
32
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file is automatically required when you run `assert`; put any test
4
+ # helpers here.
5
+
6
+ # Add the root dir to the load path.
7
+ ROOT = Pathname.new(File.expand_path("../..", __FILE__))
8
+ $LOAD_PATH.unshift(ROOT.to_s)
9
+
10
+ TEST_SUPPORT_ROOT = ROOT.join("test/support")
11
+
12
+ # Require pry for debugging (`binding.pry`).
13
+ require "pry"
14
+
15
+ require "test/support/factory"
16
+
17
+ require "active_support"
18
+ require "action_view"
19
+ require "rails/version"
20
+
21
+ def Rails.root
22
+ TEST_SUPPORT_ROOT
23
+ end
24
+
25
+ def Rails.env
26
+ @env ||= FakeEnv.new
27
+ end
28
+
29
+ class FakeEnv
30
+ def development?
31
+ true
32
+ end
33
+ end
34
+
35
+ require "rails-nm"
36
+ require "rails-nm/template_handler"
37
+ ActionView::Template.register_template_handler(:nm, RailsNm::TemplateHandler)
38
+
39
+ require "test/support/test_action_view"
40
+
41
+ class Assert::Context
42
+ private
43
+
44
+ def render(source, **locals)
45
+ TestActionView.render(source, **locals)
46
+ end
47
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ node "id", user.id
4
+ node "firstName", user.first_name
5
+ node "lastName", user.last_name
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "assert/factory"
4
+
5
+ module Factory
6
+ extend Assert::Factory
7
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "action_view/testing/resolvers"
4
+
5
+ module TestActionView
6
+ def self.render(source, **ivars)
7
+ JSON.parse(new(source, **ivars).render(template: "source"))
8
+ end
9
+
10
+ def self.new(source, **ivars)
11
+ resolver = ActionView::FixtureResolver.new({ "source.json.nm" => source })
12
+ lookup_context = ActionView::LookupContext.new([resolver], {}, [""])
13
+ controller = ActionView::TestCase::TestController.new
14
+
15
+ view =
16
+ ActionView::Base.with_empty_template_cache.new(
17
+ lookup_context,
18
+ ivars.to_h,
19
+ controller,
20
+ )
21
+ def view.view_cache_dependencies
22
+ []
23
+ end
24
+
25
+ view
26
+ end
27
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "assert"
4
+ require "rails-nm"
5
+
6
+ module RailsNm
7
+ class SystemTests < Assert::Context
8
+ desc "RailsNm"
9
+ subject{ RailsNm }
10
+ end
11
+
12
+ class RenderTests < SystemTests
13
+ desc "when rendering an Nm template in Rails"
14
+
15
+ let(:user_class){ Struct.new(:id, :first_name, :last_name) }
16
+ let(:users) do
17
+ Array.new(Factory.integer(3)) do
18
+ user_class.new(Factory.integer, Factory.string, Factory.string)
19
+ end
20
+ end
21
+
22
+ let(:template_source) do
23
+ <<~SOURCE
24
+ map @users do |user|
25
+ partial "users/user.json", :user => user
26
+ end
27
+ SOURCE
28
+ end
29
+
30
+ should "should render as expected" do
31
+ exp =
32
+ users.map do |user|
33
+ {
34
+ "id" => user.id,
35
+ "firstName" => user.first_name,
36
+ "lastName" => user.last_name,
37
+ }
38
+ end
39
+
40
+ assert_that(render(template_source, users: users)).equals(exp)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "assert"
4
+ require "rails-nm"
5
+
6
+ require "much-config"
7
+ require "nm/source"
8
+
9
+ module RailsNm
10
+ class UnitTests < Assert::Context
11
+ desc "RailsNm"
12
+ subject{ unit_module }
13
+
14
+ let(:unit_module){ RailsNm }
15
+
16
+ should have_imeths :source, :encode, :render_content
17
+
18
+ should "be configured as expected" do
19
+ assert_that(subject).includes(MuchConfig)
20
+ assert_that(subject.config).is_a(unit_module::Config)
21
+ end
22
+
23
+ should "know its attributes" do
24
+ assert_that(subject.source).equals(subject.config.source)
25
+ end
26
+
27
+ should "encode using the configured encoder" do
28
+ object = [{ key: "value" }, ["key", "value"]].sample
29
+ assert_that(subject.encode(object)).equals(JSON.dump(object))
30
+ end
31
+
32
+ # See test/system/rails-nm_tests.rb for system tests that test rendering
33
+ # template content.
34
+ end
35
+
36
+ class ConfigTests < UnitTests
37
+ desc "Config"
38
+ subject{ config_class }
39
+
40
+ let(:config_class){ unit_module::Config }
41
+ end
42
+
43
+ class ConfigInitTests < ConfigTests
44
+ desc "when init"
45
+ subject{ config_class.new }
46
+
47
+ should have_accessors :views_path, :default_format, :extension
48
+ should have_accessors :locals, :cache, :encoder
49
+ should have_imeths :source
50
+
51
+ should "know its attributes" do
52
+ assert_that(subject.views_path).equals(::Rails.root.join("app/views"))
53
+ assert_that(subject.default_format).equals(:json)
54
+ assert_that(subject.extension).equals(:nm)
55
+ assert_that(subject.locals).equals({})
56
+ assert_that(subject.cache).equals(!Rails.env.development?)
57
+ assert_that(subject.encoder).is_a(Proc)
58
+ assert_that(subject.source)
59
+ .equals(
60
+ Nm::Source.new(
61
+ subject.views_path,
62
+ cache: subject.cache,
63
+ extension: subject.extension,
64
+ locals: subject.locals,
65
+ ),
66
+ )
67
+ end
68
+ end
69
+ end
data/tmp/.keep ADDED
File without changes
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails-nm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Kelly Redding
8
+ - Collin Redding
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2021-06-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: much-style-guide
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 0.6.6
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 0.6.6
28
+ - !ruby/object:Gem::Dependency
29
+ name: assert
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 2.19.6
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 2.19.6
42
+ - !ruby/object:Gem::Dependency
43
+ name: rails
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">"
47
+ - !ruby/object:Gem::Version
48
+ version: '5.0'
49
+ - - "<"
50
+ - !ruby/object:Gem::Version
51
+ version: '7.0'
52
+ type: :development
53
+ prerelease: false
54
+ version_requirements: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">"
57
+ - !ruby/object:Gem::Version
58
+ version: '5.0'
59
+ - - "<"
60
+ - !ruby/object:Gem::Version
61
+ version: '7.0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: nm
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.6.0
69
+ type: :runtime
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.6.0
76
+ - !ruby/object:Gem::Dependency
77
+ name: much-config
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.1.0
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.1.0
90
+ description: Render .json.nm templates in Rails.
91
+ email:
92
+ - kelly@kellyredding.com
93
+ - collin.redding@me.com
94
+ executables: []
95
+ extensions: []
96
+ extra_rdoc_files: []
97
+ files:
98
+ - Gemfile
99
+ - LICENSE
100
+ - README.md
101
+ - lib/rails-nm.rb
102
+ - lib/rails-nm/railtie.rb
103
+ - lib/rails-nm/template_handler.rb
104
+ - lib/rails-nm/version.rb
105
+ - log/.keep
106
+ - rails-nm.gemspec
107
+ - test/helper.rb
108
+ - test/support/app/views/users/user.json.nm
109
+ - test/support/factory.rb
110
+ - test/support/test_action_view.rb
111
+ - test/system/rails-nm_tests.rb
112
+ - test/unit/rails-nm_tests.rb
113
+ - tmp/.keep
114
+ homepage: https://github.com/redding/rails-nm
115
+ licenses:
116
+ - MIT
117
+ metadata: {}
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - "~>"
125
+ - !ruby/object:Gem::Version
126
+ version: '2.5'
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubygems_version: 3.1.6
134
+ signing_key:
135
+ specification_version: 4
136
+ summary: Render .json.nm templates in Rails.
137
+ test_files:
138
+ - test/helper.rb
139
+ - test/support/app/views/users/user.json.nm
140
+ - test/support/factory.rb
141
+ - test/support/test_action_view.rb
142
+ - test/system/rails-nm_tests.rb
143
+ - test/unit/rails-nm_tests.rb