phaedra 0.3.0 → 0.3.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: f9629e11c78d2a35fa9929d69a79f57fe1711fa4c6f6b4d73e70f8be43019918
4
- data.tar.gz: 65a0caf688ea9172723fe398e29861f2c22f99df02dce2d2e34523fbbb4c929b
3
+ metadata.gz: 1ac7eff901bd41a6da00ead154dc726635a7663597f5dd263fbe07c6f8df8821
4
+ data.tar.gz: 3eaafe5f99657959f22bd097191329404469087fc864ea980ba85a15156c87ce
5
5
  SHA512:
6
- metadata.gz: 8c54e4a03e0cbbd16c4d444215ce29102315e1be92942a9c1d3542eb6eeb948de8b78fff6f5f5913e3ef1ee2c7eae11aaac70545682bcc8f4884987cdb5c28a1
7
- data.tar.gz: 666994b4fbb211c6a3bc555ac4f663997d6ed9ae24fcae4d670c76fe6392bb1f3761206000657edaa21e51778a2ebac5dad5a0171cfa45f032d9dbd69939f7d6
6
+ metadata.gz: 83c5681c356986221a82202728e3efdfe912f9db5c82bf66b388bb38a1e9450aac8269bda442fbca528230f64e8615446e7f8231cae9080fabd11c02fefee216
7
+ data.tar.gz: 5631c0968e80834d7b571547151e1e9addcc64136e07e73c91828afcde277996763bf05b9591896ec530eefabbd2ede670f3fffbbdd902d26cadbcfe3a173138
data/README.md CHANGED
@@ -53,7 +53,7 @@ Your function can support `get`, `post`, `put`, `patch`, and `delete` methods wh
53
53
 
54
54
  Each method is provided access to `request` and `response` objects. If your function was directly instantiated by WEBrick, those will be `WEBrick::HTTPRequest` and `WEBrick::HTTPResponse` respectively. If your function was instantiated by Rack, those will be `Phaedra::Request` (a thin wrapper around `Rack::Request`) and `Rack::Response` respectively.
55
55
 
56
- ## Callbacks
56
+ ### Callbacks
57
57
 
58
58
  Functions can define `action` callbacks:
59
59
 
@@ -77,30 +77,106 @@ end
77
77
 
78
78
  You can modify the `request` object in a `before_action` callback to perform setup tasks before the actions are executed, or you can modify `response` in a `after_action` to further process the response.
79
79
 
80
- ## OpenFaaS
80
+ ### Shared Code You Only Want to Run Once
81
81
 
82
- We recommend using OpenFaaS' [ruby-http template](https://github.com/openfaas-incubator/ruby-http). It boots up a Sinatra/WEBrick server and then passes all requests along to a Handler object.
83
-
84
- In your OpenFaaS project's function folder (e.g., `testphaedra`), simply define a file `handler.rb` which will load Phaedra's default Rack app:
82
+ You can use `require_relative` to load and execute shared Ruby code from another folder, say `lib`. This is particularly useful when setting up a database connection or performing expensive operations you only want to do once, rather than for every request.
85
83
 
86
84
  ```ruby
87
- # testphaedra/handler.rb
85
+ # api/run-it-once.rb
88
86
 
89
87
  require "phaedra"
88
+ require_relative "../lib/shared_code"
90
89
 
91
- class Handler
92
- def run(_body, env)
93
- status, headers, body = Phaedra::RackApp.new({
94
- "root_dir" => File.join(Dir.pwd, "function")
95
- }).call(env)
90
+ class PhaedraFunction < Phaedra::Base
91
+ def get(params)
92
+ "Run it once! #{SharedCode.run_once}"
93
+ end
94
+ end
95
+ ```
96
96
 
97
- # The OpenFaaS ruby-http return array is backwards from Rack :/
98
- [body.join(""), headers, status]
97
+ ```ruby
98
+ # lib/shared_code.rb
99
+ module SharedCode
100
+ def self.run_once
101
+ @one_time ||= Time.now
99
102
  end
100
103
  end
101
104
  ```
102
105
 
103
- Next, add a YAML file that lives alongside your function folder:
106
+ Now each time you invoke the function at `/api/run-it-once`, the timestamp will never change until the next redeployment.
107
+
108
+ ## Deployment
109
+
110
+ ### Vercel
111
+
112
+ All you have to do is create a static site repo ([Bridgetown](https://www.bridgetownrb.com), Jekyll, Middleman, etc.) with an `api` folder and Vercel will automatically set up the serverless functions every time there's a new branch or production deployment. As mentioned above, you'll need to ensure you add `Handler = PhaedraFunction` to the bottom of each Ruby function.
113
+
114
+ ### OpenFaaS
115
+
116
+ We recommend using OpenFaaS' dockerfile template so you can define your own `Dockerfile` to book Rack + Phaedra using the Puma web server. This also allows you to customize the Docker image configuration to install and configure other tools as necessary.
117
+
118
+ First, make sure you've pulled down the template:
119
+
120
+ ```sh
121
+ faas-cli template store pull dockerfile
122
+ ```
123
+
124
+ Then add a `Dockerfile` to your OpenFaaS project's function folder (e.g., `testphaedra`):
125
+
126
+ ```dockerfile
127
+ # testphaedra/Dockerfile
128
+
129
+ FROM openfaas/of-watchdog:0.7.7 as watchdog
130
+
131
+ FROM ruby:2.6.6-slim-stretch
132
+
133
+ COPY --from=watchdog /fwatchdog /usr/bin/fwatchdog
134
+ RUN chmod +x /usr/bin/fwatchdog
135
+
136
+ ARG ADDITIONAL_PACKAGE
137
+ RUN apt-get update \
138
+ && apt-get install -qy --no-install-recommends build-essential ${ADDITIONAL_PACKAGE}
139
+
140
+ WORKDIR /home/app
141
+
142
+ # Use cache layer for Gemfile
143
+ COPY Gemfile .
144
+ RUN bundle install
145
+ RUN gem install puma -N
146
+
147
+ # Copy over the rest
148
+ COPY . .
149
+
150
+ # Create a non-root user
151
+ RUN addgroup --system app \
152
+ && adduser --system --ingroup app app
153
+ RUN chown app:app -R /home/app
154
+ USER app
155
+
156
+ # Run Puma as the server process
157
+ ENV fprocess="puma -p 5000"
158
+
159
+ EXPOSE 8080
160
+
161
+ HEALTHCHECK --interval=2s CMD [ -e /tmp/.lock ] || exit 1
162
+
163
+ ENV upstream_url="http://127.0.0.1:5000"
164
+ ENV mode="http"
165
+
166
+ CMD ["fwatchdog"]
167
+ ```
168
+
169
+ Next add the `config.ru` file to boot Rack:
170
+
171
+ ```ruby
172
+ # testphaedra/config.ru
173
+
174
+ require "phaedra"
175
+
176
+ run Phaedra::RackApp.new
177
+ ```
178
+
179
+ Finally, add a YAML file that lives alongside your function folder:
104
180
 
105
181
  ```yaml
106
182
  # testphaedra.yml
@@ -111,24 +187,24 @@ provider:
111
187
  gateway: http://127.0.0.1:8080
112
188
  functions:
113
189
  testphaedra:
114
- lang: ruby-http
190
+ lang: dockerfile
115
191
  handler: ./testphaedra
116
192
  image: yourdockerusername/testphaedra:latest
117
193
  ```
118
194
 
195
+ (Replace `yourdockerusername` with your [Docker Hub](https://hub.docker.com) username.)
196
+
119
197
  Now run `faas-cli up -f testphaedra.yml` to build and deploy the function. Given the Ruby function `testphaedra/api/run-me.rb`, you'd call it like so:
120
198
 
121
199
  ```sh
122
200
  curl http://127.0.0.1:8080/function/testphaedra/api/run-me
123
-
124
- # output of the Ruby function
125
201
  ```
126
202
 
127
- In case you're wondering: yes, with Phaedra you can write multiple Ruby functions accessible via different URL paths that will all get handled by a single OpenFaaS function. Obviously you're welcome to set up multiple Phaedra projects and deploy them as separate OpenFaaS functions if you wish.
203
+ In case you're wondering: yes, with Phaedra you can write multiple Ruby functions which will be accessible via different URL pathsall handled by a single OpenFaaS function. Of course it's possible set up multiple Phaedra projects and deploy them as separate OpenFaaS functions if you wish.
128
204
 
129
- ## Rack
205
+ ### Rack
130
206
 
131
- Booting Phaedra up as Rack app is very simple. All you need is a `config.ru` file alongside your `api` folder:
207
+ Booting Phaedra up as Rack app is very simple. All you need to do is add a `config.ru` file alongside your `api` folder:
132
208
 
133
209
  ```ruby
134
210
  require "phaedra"
@@ -138,7 +214,16 @@ run Phaedra::RackApp.new
138
214
 
139
215
  Then run `rackup` in the terminal.
140
216
 
141
- ## WEBrick
217
+ The settings (and their defaults) you can pass to the `new` method are as follows:
218
+
219
+ ```ruby
220
+ {
221
+ "root_dir" => Dir.pwd,
222
+ "serverless_api_dir" => "api"
223
+ }
224
+ ```
225
+
226
+ ### WEBrick
142
227
 
143
228
  Integrating Phaedra into a WEBrick server is pretty straightforward. Given a `server` object, it can be accomplished thusly:
144
229
 
@@ -172,6 +257,8 @@ load File.join(Dir.pwd, "api", "func.rb")
172
257
  @server.mount '/path', Handler
173
258
  ```
174
259
 
260
+ This method precludes any automatic routing by Phaedra, so it's discouraged unless you are using WEBrick within a larger setup that utilizes its own routing method. (Interestingly enough, that's how Vercel works under the hood.)
261
+
175
262
  ----
176
263
 
177
264
  ## Development
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "phaedra", path: ".."
4
+ gem "puma"
@@ -11,7 +11,7 @@ module Phaedra
11
11
  end
12
12
 
13
13
  def body
14
- @request_body ||= get_header(Rack::RACK_INPUT).read
14
+ @request_body ||= "" + get_header(Rack::RACK_INPUT).read
15
15
  end
16
16
  end
17
17
 
@@ -1,3 +1,3 @@
1
1
  module Phaedra
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phaedra
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jared White
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-07 00:00:00.000000000 Z
11
+ date: 2020-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -80,6 +80,7 @@ files:
80
80
  - LICENSE.txt
81
81
  - README.md
82
82
  - Rakefile
83
+ - example/Gemfile
83
84
  - example/api/simple.rb
84
85
  - example/api/the-time.rb
85
86
  - example/config.ru