dockerfile-rails 0.4.1 → 0.4.3
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 +4 -4
- data/README.md +4 -1
- data/lib/generators/dockerfile_generator.rb +27 -2
- data/lib/generators/templates/Dockerfile.erb +21 -45
- data/lib/generators/templates/_apt_install.erb +10 -0
- data/lib/generators/templates/_install_node.erb +21 -0
- data/lib/generators/templates/_node_client.erb +2 -18
- data/lib/generators/templates/_npm_install.erb +17 -0
- data/lib/generators/templates/docker-entrypoint.erb +10 -0
- metadata +5 -3
- data/lib/erbtest.rb +0 -56
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 68a853a1d2a0a40c1912a99dd77fe1664abe12bf1678eb4dc07a17873259bc39
|
|
4
|
+
data.tar.gz: 90bcd80ae9f8a6c8c27cc806235bdec6b9bf308ca3a3ebf10712304f7a52a10e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 693b078d6d664fdd7366c036dbbb9f95732c79b0f058a2bfe7300c886c479885b33ba075d9d598a1266b2a030bf6bfc588aee6c9074a570e6bd9720749765d28
|
|
7
|
+
data.tar.gz: a74d6fe97db12495762f5b6dfcd5ff3cf9c32f2807f9402f9e159f485a5e5c8562347811d12fbdf7601ce6755592c7413ebb6402b2c8c606a90c7c0d5e43148e
|
data/README.md
CHANGED
|
@@ -17,6 +17,7 @@ General options:
|
|
|
17
17
|
|
|
18
18
|
* `--force` - overwrite existing files
|
|
19
19
|
* `--ci` - include test gems in deployed image
|
|
20
|
+
* `--platform=s` - specify target platform. See [FROM](https://docs.docker.com/engine/reference/builder/#from) for details.
|
|
20
21
|
* `--cache` - use build caching to speed up builds
|
|
21
22
|
* `--parallel` - use multi-stage builds to install gems and node modules in parallel
|
|
22
23
|
* `--compose` - generate a `docker-compose.yml` file
|
|
@@ -36,7 +37,8 @@ Optimizations:
|
|
|
36
37
|
|
|
37
38
|
* `--fullstaq` - use [fullstaq](https://fullstaqruby.org/) [images](https://github.com/evilmartians/fullstaq-ruby-docker) on [quay.io](https://quay.io/repository/evl.ms/fullstaq-ruby?tab=tags&tag=latest)
|
|
38
39
|
* `--jemalloc` - use [jemalloc](https://jemalloc.net/) memory allocator
|
|
39
|
-
* `--yjit` - enable [YJIT](https://github.com/ruby/ruby/blob/master/doc/yjit/yjit.md) optimizing compiler
|
|
40
|
+
* `--yjit` - enable [YJIT](https://github.com/ruby/ruby/blob/master/doc/yjit/yjit.md) optimizing compiler
|
|
41
|
+
* `--swap=n` - allocate swap space. See [falloc options](https://man7.org/linux/man-pages/man1/fallocate.1.html#OPTIONS) for suffixes
|
|
40
42
|
|
|
41
43
|
Links:
|
|
42
44
|
|
|
@@ -44,3 +46,4 @@ Links:
|
|
|
44
46
|
* [Preparations for Rails 7.1](https://community.fly.io/t/preparations-for-rails-7-1/9512)
|
|
45
47
|
* [Rails Dockerfile futures](https://discuss.rubyonrails.org/t/rails-dockerfile-futures/82091/1)
|
|
46
48
|
* [Fly Cookbooks](https://fly.io/docs/rails/cookbooks/)
|
|
49
|
+
* [app/templates/Dockerfile.tt](https://github.com/rails/rails/blob/main/railties/lib/rails/generators/rails/app/templates/Dockerfile.tt)
|
|
@@ -12,6 +12,9 @@ class DockerfileGenerator < Rails::Generators::Base
|
|
|
12
12
|
class_option :parallel, type: :boolean, default: false,
|
|
13
13
|
desc: 'use build stages to install gems and node modules in parallel'
|
|
14
14
|
|
|
15
|
+
class_option :swap, type: :string, default: nil,
|
|
16
|
+
desc: 'allocate swapspace'
|
|
17
|
+
|
|
15
18
|
class_option :compose, type: :boolean, default: false,
|
|
16
19
|
desc: 'generate a docker-compose.yml file'
|
|
17
20
|
|
|
@@ -27,6 +30,9 @@ class DockerfileGenerator < Rails::Generators::Base
|
|
|
27
30
|
class_option :mysql, type: :boolean, default: false,
|
|
28
31
|
desc: 'include mysql libraries'
|
|
29
32
|
|
|
33
|
+
class_option :platform, type: :string, default: nil,
|
|
34
|
+
desc: 'image platform (example: linux/arm64)'
|
|
35
|
+
|
|
30
36
|
class_option :jemalloc, type: :boolean, default: false,
|
|
31
37
|
desc: 'use jemalloc alternative malloc implementation'
|
|
32
38
|
|
|
@@ -75,7 +81,15 @@ private
|
|
|
75
81
|
end).new(self, options[:locals] || {})
|
|
76
82
|
|
|
77
83
|
template = IO.read(File.join(source_paths.last, "_#{options[:partial]}.erb"))
|
|
78
|
-
ERB.new(template
|
|
84
|
+
ERB.new(template, trim_mode: '-').result(scope.get_binding).strip
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def platform
|
|
88
|
+
if options.platform
|
|
89
|
+
"--platform #{options.platform} "
|
|
90
|
+
else
|
|
91
|
+
""
|
|
92
|
+
end
|
|
79
93
|
end
|
|
80
94
|
|
|
81
95
|
def using_node?
|
|
@@ -87,6 +101,10 @@ private
|
|
|
87
101
|
options.redis? or @redis
|
|
88
102
|
end
|
|
89
103
|
|
|
104
|
+
def using_execjs?
|
|
105
|
+
@gemfile.include? 'execjs'
|
|
106
|
+
end
|
|
107
|
+
|
|
90
108
|
def parallel?
|
|
91
109
|
using_node? && options.parallel
|
|
92
110
|
end
|
|
@@ -114,9 +132,13 @@ private
|
|
|
114
132
|
# ActiveStorage preview support
|
|
115
133
|
packages << "libvips" if @gemfile.include? 'ruby-vips'
|
|
116
134
|
|
|
135
|
+
# Rmagick gem
|
|
136
|
+
packages += %w[pkg-config libmagickwand-dev] if @gemfile.include? 'rmagick'
|
|
137
|
+
|
|
117
138
|
# node support, including support for building native modules
|
|
118
139
|
if using_node?
|
|
119
|
-
packages += %w(
|
|
140
|
+
packages += %w(node-gyp pkg-config)
|
|
141
|
+
packages += %w(curl unzip) unless using_execjs?
|
|
120
142
|
|
|
121
143
|
# module build process depends on Python, and debian changed
|
|
122
144
|
# how python is installed with the bullseye release. Below
|
|
@@ -155,6 +177,9 @@ private
|
|
|
155
177
|
# ActiveStorage preview support
|
|
156
178
|
packages << "libvips" if @gemfile.include? 'ruby-vips'
|
|
157
179
|
|
|
180
|
+
# Rmagick gem
|
|
181
|
+
packages << 'imagemagick' if @gemfile.include? 'rmagick'
|
|
182
|
+
|
|
158
183
|
packages.sort
|
|
159
184
|
end
|
|
160
185
|
|
|
@@ -8,9 +8,9 @@ ARG RUBY_VERSION=<%= RUBY_VERSION %>
|
|
|
8
8
|
|
|
9
9
|
<% end -%>
|
|
10
10
|
<% if options.fullstaq -%>
|
|
11
|
-
FROM quay.io/evl.ms/fullstaq-ruby:${RUBY_VERSION}-<%= @options.jemalloc ? 'jemalloc-' : '' %>slim as base
|
|
11
|
+
FROM <%= platform %>quay.io/evl.ms/fullstaq-ruby:${RUBY_VERSION}-<%= @options.jemalloc ? 'jemalloc-' : '' %>slim as base
|
|
12
12
|
<% else -%>
|
|
13
|
-
FROM ruby:$RUBY_VERSION-slim as base
|
|
13
|
+
FROM <%= platform %>ruby:$RUBY_VERSION-slim as base
|
|
14
14
|
<% end -%>
|
|
15
15
|
|
|
16
16
|
# Rails app lives here
|
|
@@ -21,23 +21,24 @@ ENV RAILS_ENV="production" \
|
|
|
21
21
|
BUNDLE_PATH="vendor/bundle" \
|
|
22
22
|
BUNDLE_WITHOUT="<%= options.ci? ? 'test' : 'development:test' %>"
|
|
23
23
|
|
|
24
|
+
# Update gems and preinstall the desired version of bundler
|
|
24
25
|
ARG BUNDLER_VERSION=<%= Bundler::VERSION %>
|
|
25
26
|
RUN gem update --system --no-document && \
|
|
26
27
|
gem install -N bundler -v ${BUNDLER_VERSION}
|
|
27
28
|
|
|
29
|
+
<% if using_execjs? -%>
|
|
30
|
+
# Install packages needed to install nodejs
|
|
31
|
+
<%= render partial: 'apt_install', locals: {packages: %w(curl unzip), clean: true} %>
|
|
32
|
+
|
|
33
|
+
<%= render partial: 'install_node', locals: {yarn_version: nil} %>
|
|
34
|
+
|
|
35
|
+
<% end -%>
|
|
28
36
|
|
|
29
37
|
# Throw-away build stage<%= parallel? ? 's' : '' %> to reduce size of final image
|
|
30
38
|
FROM base as <%= parallel? ? 'pre' : '' %>build
|
|
31
39
|
|
|
32
|
-
# Install packages
|
|
33
|
-
|
|
34
|
-
RUN --mount=type=cache,id=dev-apt-cache,sharing=locked,target=/var/cache/apt \
|
|
35
|
-
--mount=type=cache,id=dev-apt-lib,sharing=locked,target=/var/lib/apt \
|
|
36
|
-
apt-get update -qq && \
|
|
37
|
-
<% else -%>
|
|
38
|
-
RUN apt-get update -qq && \
|
|
39
|
-
<% end -%>
|
|
40
|
-
apt-get install -y <%= build_packages.join(" ") %>
|
|
40
|
+
# Install packages needed to build gems<%= using_node? ? " and node modules" : "" %>
|
|
41
|
+
<%= render partial: 'apt_install', locals: {packages: build_packages, clean: false} %>
|
|
41
42
|
|
|
42
43
|
<% if parallel? -%>
|
|
43
44
|
|
|
@@ -45,24 +46,11 @@ FROM prebuild as node
|
|
|
45
46
|
|
|
46
47
|
<% end -%>
|
|
47
48
|
<% if using_node? -%>
|
|
48
|
-
|
|
49
|
-
ARG NODE_VERSION=<%= node_version %>
|
|
50
|
-
ARG YARN_VERSION=<%= yarn_version %>
|
|
51
|
-
RUN curl -fsSL https://fnm.vercel.app/install | bash && \
|
|
52
|
-
/root/.local/share/fnm/fnm install $NODE_VERSION
|
|
53
|
-
ENV PATH=/root/.local/share/fnm/aliases/default/bin/:$PATH
|
|
54
|
-
RUN npm install -g yarn@$YARN_VERSION
|
|
49
|
+
<%= render partial: 'install_node', locals: {node_version: using_execjs? ? nil : node_version} %>
|
|
55
50
|
|
|
56
51
|
<% end -%>
|
|
57
52
|
<% if parallel? -%>
|
|
58
|
-
|
|
59
|
-
COPY package.json yarn.lock ./
|
|
60
|
-
<% if options.cache? -%>
|
|
61
|
-
RUN --mount=type=cache,id=bld-yarn-cache,target=/root/.yarn \
|
|
62
|
-
YARN_CACHE_FOLDER=/root/.yarn yarn install
|
|
63
|
-
<% else -%>
|
|
64
|
-
RUN yarn install
|
|
65
|
-
<% end -%>
|
|
53
|
+
<%= render partial: 'npm_install', locals: {sources: %w(package.json yarn.lock)} %>
|
|
66
54
|
|
|
67
55
|
|
|
68
56
|
FROM prebuild as build
|
|
@@ -91,14 +79,7 @@ RUN bundle _${BUNDLER_VERSION}_ install<% if depend_on_bootsnap? -%> && \
|
|
|
91
79
|
<% if parallel? -%>
|
|
92
80
|
asdf
|
|
93
81
|
<% elsif using_node? -%>
|
|
94
|
-
|
|
95
|
-
COPY package.json yarn.lock ./
|
|
96
|
-
<% if options.cache? -%>
|
|
97
|
-
RUN --mount=type=cache,id=bld-yarn-cache,target=/root/.yarn \
|
|
98
|
-
YARN_CACHE_FOLDER=/root/.yarn yarn install
|
|
99
|
-
<% else -%>
|
|
100
|
-
RUN yarn install
|
|
101
|
-
<% end -%>
|
|
82
|
+
<%= render partial: 'npm_install', locals: {sources: %w(package.json yarn.lock)} %>
|
|
102
83
|
|
|
103
84
|
<% end -%>
|
|
104
85
|
# Copy application code
|
|
@@ -124,17 +105,8 @@ RUN SECRET_KEY_BASE<%= Rails::VERSION::MAJOR<7 || Rails::VERSION::STRING.start_w
|
|
|
124
105
|
FROM base
|
|
125
106
|
<% unless deploy_packages.empty? -%>
|
|
126
107
|
|
|
127
|
-
# Install packages
|
|
128
|
-
|
|
129
|
-
RUN --mount=type=cache,id=dev-apt-cache,sharing=locked,target=/var/cache/apt \
|
|
130
|
-
--mount=type=cache,id=dev-apt-lib,sharing=locked,target=/var/lib/apt \
|
|
131
|
-
apt-get update -qq && \
|
|
132
|
-
apt-get install --no-install-recommends -y <%= deploy_packages.join(" ") %>
|
|
133
|
-
<% else -%>
|
|
134
|
-
RUN apt-get update -qq && \
|
|
135
|
-
apt-get install --no-install-recommends -y <%= deploy_packages.join(" ") %> && \
|
|
136
|
-
rm -rf /var/lib/apt/lists /var/cache/apt/archives
|
|
137
|
-
<% end -%>
|
|
108
|
+
# Install packages needed for deployment
|
|
109
|
+
<%= render partial: 'apt_install', locals: {packages: deploy_packages, clean: true} %>
|
|
138
110
|
<% end -%>
|
|
139
111
|
|
|
140
112
|
# Copy built application from previous stage
|
|
@@ -152,7 +124,11 @@ COPY --from=client /rails/<%= api_client_dir %>/build /rails/public
|
|
|
152
124
|
ENV RAILS_LOG_TO_STDOUT="1" \
|
|
153
125
|
RAILS_SERVE_STATIC_FILES="true"<% if options.yjit %> \
|
|
154
126
|
RUBY_YJIT_ENABLE="1"<% end %><% if options.jemalloc and not options.fullstaq %> \
|
|
127
|
+
<% if (options.platform || Gem::Platform::local.cpu).include? 'arm' -%>
|
|
128
|
+
LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libjemalloc.so.2" \
|
|
129
|
+
<% else -%>
|
|
155
130
|
LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libjemalloc.so.2" \
|
|
131
|
+
<% end -%>
|
|
156
132
|
MALLOC_CONF="dirty_decay_ms:1000,narenas:2,background_thread:true"<% end %>
|
|
157
133
|
|
|
158
134
|
# Entrypoint prepares the database.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<% if options.cache? -%>
|
|
2
|
+
RUN --mount=type=cache,id=dev-apt-cache,sharing=locked,target=/var/cache/apt \
|
|
3
|
+
--mount=type=cache,id=dev-apt-lib,sharing=locked,target=/var/lib/apt \
|
|
4
|
+
apt-get update -qq && \
|
|
5
|
+
apt-get install --no-install-recommends -y <%= packages.join(" ") %>
|
|
6
|
+
<% else -%>
|
|
7
|
+
RUN apt-get update -qq && \
|
|
8
|
+
apt-get install --no-install-recommends -y <%= packages.join(" ") %><% if clean %> && \
|
|
9
|
+
rm -rf /var/lib/apt/lists /var/cache/apt/archives<% end %>
|
|
10
|
+
<% end -%>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<% if node_version and yarn_version -%>
|
|
2
|
+
# Install JavaScript dependencies
|
|
3
|
+
<% elsif node_version -%>
|
|
4
|
+
# Install Node.js
|
|
5
|
+
<% elsif yarn_version -%>
|
|
6
|
+
# Install yarn
|
|
7
|
+
<% end -%>
|
|
8
|
+
<% if node_version -%>
|
|
9
|
+
ARG NODE_VERSION=<%= node_version %>
|
|
10
|
+
<% end -%>
|
|
11
|
+
<% if yarn_version -%>
|
|
12
|
+
ARG YARN_VERSION=<%= yarn_version %>
|
|
13
|
+
<% end -%>
|
|
14
|
+
<% if node_version -%>
|
|
15
|
+
RUN curl -fsSL https://fnm.vercel.app/install | bash && \
|
|
16
|
+
/root/.local/share/fnm/fnm install $NODE_VERSION
|
|
17
|
+
ENV PATH=/root/.local/share/fnm/aliases/default/bin/:$PATH
|
|
18
|
+
<% end -%>
|
|
19
|
+
<% if yarn_version -%>
|
|
20
|
+
RUN npm install -g yarn@$YARN_VERSION
|
|
21
|
+
<% end -%>
|
|
@@ -1,28 +1,12 @@
|
|
|
1
1
|
ARG NODE_VERSION=<%= node_version %>
|
|
2
2
|
|
|
3
|
-
FROM node:$NODE_VERSION-slim as client
|
|
3
|
+
FROM <%= platform %>node:$NODE_VERSION-slim as client
|
|
4
4
|
|
|
5
5
|
WORKDIR /rails/<%= api_client_dir %>
|
|
6
6
|
|
|
7
7
|
ENV NODE_ENV=production
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
COPY <%= api_client_files.join(' ') %> .
|
|
11
|
-
<% if api_client_files.join.include? 'yarn' -%>
|
|
12
|
-
<% if options.cache? -%>
|
|
13
|
-
RUN --mount=type=cache,id=bld-yarn-cache,target=/root/.yarn \
|
|
14
|
-
YARN_CACHE_FOLDER=/root/.yarn yarn install
|
|
15
|
-
<% else -%>
|
|
16
|
-
RUN yarn install
|
|
17
|
-
<% end -%>
|
|
18
|
-
<% else -%>
|
|
19
|
-
<% if options.cache? -%>
|
|
20
|
-
RUN --mount=type=cache,id=bld-yarn-cache,target=/root/.npm \
|
|
21
|
-
npm install
|
|
22
|
-
<% else -%>
|
|
23
|
-
RUN npm install
|
|
24
|
-
<% end -%>
|
|
25
|
-
<% end -%>
|
|
9
|
+
<%= render partial: 'npm_install', locals: {sources: api_client_files} %>
|
|
26
10
|
|
|
27
11
|
# build client application
|
|
28
12
|
COPY <%= api_client_dir %> .
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Install node modules
|
|
2
|
+
COPY <%=sources.join(' ') %> .
|
|
3
|
+
<% if sources.join.include? 'yarn' -%>
|
|
4
|
+
<% if options.cache? -%>
|
|
5
|
+
RUN --mount=type=cache,id=bld-yarn-cache,target=/root/.yarn \
|
|
6
|
+
YARN_CACHE_FOLDER=/root/.yarn yarn install
|
|
7
|
+
<% else -%>
|
|
8
|
+
RUN yarn install
|
|
9
|
+
<% end -%>
|
|
10
|
+
<% else -%>
|
|
11
|
+
<% if options.cache? -%>
|
|
12
|
+
RUN --mount=type=cache,id=bld-npm-cache,target=/root/.npm \
|
|
13
|
+
npm install
|
|
14
|
+
<% else -%>
|
|
15
|
+
RUN npm install
|
|
16
|
+
<% end -%>
|
|
17
|
+
<% end -%>
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
|
|
3
|
+
<% if options.swap -%>
|
|
4
|
+
# allocate swap space
|
|
5
|
+
fallocate -l <%= options.swap %> /swapfile
|
|
6
|
+
chmod 0600 /swapfile
|
|
7
|
+
mkswap /swapfile
|
|
8
|
+
echo 10 > /proc/sys/vm/swappiness
|
|
9
|
+
swapon /swapfile
|
|
10
|
+
echo 1 > /proc/sys/vm/overcommit_memory
|
|
11
|
+
|
|
12
|
+
<% end -%>
|
|
3
13
|
# If running the rails server then create or migrate existing database
|
|
4
14
|
if [ "${*}" == "./bin/rails server" ]; then
|
|
5
15
|
./bin/rails <%= dbprep_command %>
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dockerfile-rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.4.
|
|
4
|
+
version: 0.4.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sam Ruby
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-01-
|
|
11
|
+
date: 2023-01-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
@@ -36,10 +36,12 @@ files:
|
|
|
36
36
|
- Rakefile
|
|
37
37
|
- lib/dockerfile-rails.rb
|
|
38
38
|
- lib/dockerfile-rails/scanner.rb
|
|
39
|
-
- lib/erbtest.rb
|
|
40
39
|
- lib/generators/dockerfile_generator.rb
|
|
41
40
|
- lib/generators/templates/Dockerfile.erb
|
|
41
|
+
- lib/generators/templates/_apt_install.erb
|
|
42
|
+
- lib/generators/templates/_install_node.erb
|
|
42
43
|
- lib/generators/templates/_node_client.erb
|
|
44
|
+
- lib/generators/templates/_npm_install.erb
|
|
43
45
|
- lib/generators/templates/docker-compose.yml.erb
|
|
44
46
|
- lib/generators/templates/docker-entrypoint.erb
|
|
45
47
|
- lib/generators/templates/dockerignore.erb
|
data/lib/erbtest.rb
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
TEMPLATE = <<-EOF
|
|
2
|
-
value is <%= five %>
|
|
3
|
-
other is <%= three %>
|
|
4
|
-
EOF
|
|
5
|
-
|
|
6
|
-
require 'delegate'
|
|
7
|
-
require 'forwardable'
|
|
8
|
-
require 'ostruct'
|
|
9
|
-
class Scope < SimpleDelegator
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
require 'erb'
|
|
13
|
-
class ShoppingList
|
|
14
|
-
def five
|
|
15
|
-
'FiVe'
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def initialize
|
|
19
|
-
renderer = ERB.new(TEMPLATE)
|
|
20
|
-
puts '***'
|
|
21
|
-
|
|
22
|
-
values = {one: 'One', three: 'tHrEe'}
|
|
23
|
-
|
|
24
|
-
scope = (Class.new do
|
|
25
|
-
def initialize(obj, locals)
|
|
26
|
-
@_obj = obj
|
|
27
|
-
@_locals = OpenStruct.new(locals)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def method_missing(method, *args, &block)
|
|
31
|
-
if @_locals.respond_to? method
|
|
32
|
-
@_locals.send method, *args, &block
|
|
33
|
-
else
|
|
34
|
-
@_obj.send method, *args, &block
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def get_binding
|
|
39
|
-
binding
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def three
|
|
43
|
-
3
|
|
44
|
-
end
|
|
45
|
-
end).new(self, values)
|
|
46
|
-
|
|
47
|
-
puts renderer.result(scope.get_binding)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def get_binding
|
|
51
|
-
binding
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
puts '?'
|
|
56
|
-
test = ShoppingList.new
|