phaedra 0.2.0 → 0.3.0

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: 50fe608ca2567e6f1262fcfd1d7a9cc4171a5b467989b115692442dd1ae82e4a
4
- data.tar.gz: 3a0da1de124ebd66b6d70ab25a9eee6e9288f28bad0adca7b800e8d82ecd0c31
3
+ metadata.gz: f9629e11c78d2a35fa9929d69a79f57fe1711fa4c6f6b4d73e70f8be43019918
4
+ data.tar.gz: 65a0caf688ea9172723fe398e29861f2c22f99df02dce2d2e34523fbbb4c929b
5
5
  SHA512:
6
- metadata.gz: 6ef12e516dbbbfdbc487554d6422bfba931933598934a960c71bb4946b31c3d0b9e2e568bd818b1dd3c2bfbda5ebd556af99f8df62284f33d14ff8578b30c1b9
7
- data.tar.gz: ae9bd0c2850334dd67b58e18e19a3444b7230539c45fb1b995b7441240930abecb3ff47c6211da5cb2bd2998b4454f3a7a6390fe7f2509d2718e2af13b0932f5
6
+ metadata.gz: 8c54e4a03e0cbbd16c4d444215ce29102315e1be92942a9c1d3542eb6eeb948de8b78fff6f5f5913e3ef1ee2c7eae11aaac70545682bcc8f4884987cdb5c28a1
7
+ data.tar.gz: 666994b4fbb211c6a3bc555ac4f663997d6ed9ae24fcae4d670c76fe6392bb1f3761206000657edaa21e51778a2ebac5dad5a0171cfa45f032d9dbd69939f7d6
data/README.md CHANGED
@@ -1,10 +1,8 @@
1
1
  # Phaedra: Serverless Ruby Functions
2
2
 
3
- _NOTE: not yet released! Check back in June 2020!_
3
+ Phaedra is a web microframework for writing serverless Ruby functions. They are isolated pieces of logic which respond to HTTP requests (GET, POST, etc.) and typically get mounted at a particular URL path. They can be tested locally and deployed to a supported serverless hosting platform or to any [Rack-compatible web server](https://github.com/rack/rack).
4
4
 
5
- Phaedra is a REST microframework for writing serverless Ruby functions. They are isolated pieces of logic which respond to HTTP requests (GET, POST, etc.) and typically get mounted at a particular URL path. They can be tested locally and deployed to a supported serverless hosting platform or to any [Rack-compatible web server](https://github.com/rack/rack).
6
-
7
- Serverless compatibility is presently focused on [Vercel](https://vercel.com), but there are likely additional platforms we'll be adding support for in the future (OpenFaaS, Fission, etc.).
5
+ Serverless compatibility is presently focused on [Vercel](https://vercel.com) and [OpenFaaS](https://openfaas.com), but there are likely additional platforms we'll be adding support for in the future.
8
6
 
9
7
  ## Installation
10
8
 
@@ -32,7 +30,7 @@ Functions are single Ruby files which respond to a URL path (aka `/api/path/to/f
32
30
 
33
31
  Functions are written as subclasses of `Phaedra::Base` using the name `PhaedraFunction`. The `params` argument is a Hash containing the parsed contents of the incoming query string, form data, or body JSON. The response object returned by your function is typically a Hash which will be transformed into JSON output automatically, but it can also be plain text.
34
32
 
35
- Some platforms require the function class name to be `Handler`, so you can put that at the bottom of your file for full compatibility.
33
+ Some platforms such as Vercel require the function class name to be `Handler`, so you can put that at the bottom of your file for full compatibility.
36
34
 
37
35
  Here's a basic example:
38
36
 
@@ -79,6 +77,55 @@ end
79
77
 
80
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.
81
79
 
80
+ ## OpenFaaS
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:
85
+
86
+ ```ruby
87
+ # testphaedra/handler.rb
88
+
89
+ require "phaedra"
90
+
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)
96
+
97
+ # The OpenFaaS ruby-http return array is backwards from Rack :/
98
+ [body.join(""), headers, status]
99
+ end
100
+ end
101
+ ```
102
+
103
+ Next, add a YAML file that lives alongside your function folder:
104
+
105
+ ```yaml
106
+ # testphaedra.yml
107
+
108
+ version: 1.0
109
+ provider:
110
+ name: openfaas
111
+ gateway: http://127.0.0.1:8080
112
+ functions:
113
+ testphaedra:
114
+ lang: ruby-http
115
+ handler: ./testphaedra
116
+ image: yourdockerusername/testphaedra:latest
117
+ ```
118
+
119
+ 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
+
121
+ ```sh
122
+ curl http://127.0.0.1:8080/function/testphaedra/api/run-me
123
+
124
+ # output of the Ruby function
125
+ ```
126
+
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.
128
+
82
129
  ## Rack
83
130
 
84
131
  Booting Phaedra up as Rack app is very simple. All you need is a `config.ru` file alongside your `api` folder:
@@ -105,13 +152,13 @@ server.mount_proc "/#{base_api_folder}" do |req, res|
105
152
  ruby_path = File.join(full_api_path, api_folder, "#{endpoint}.rb")
106
153
 
107
154
  if File.exist?(ruby_path)
108
- original_verbosity = $VERBOSE
109
- $VERBOSE = nil
155
+ if Object.constants.include?(:PhaedraFunction)
156
+ Object.send(:remove_const, :PhaedraFunction)
157
+ end
110
158
  load ruby_path
111
- $VERBOSE = original_verbosity
112
159
 
113
- handler = Handler.new(server)
114
- handler.service(req, res)
160
+ func = PhaedraFunction.new
161
+ func.service(req, res)
115
162
  else
116
163
  raise HTTPStatus::NotFound, "`#{req.path}' not found."
117
164
  end
@@ -0,0 +1,10 @@
1
+ require "phaedra"
2
+
3
+ class PhaedraFunction < Phaedra::Base
4
+ def get(params)
5
+ response["Content-Type"] = "text/html"
6
+ "<p>This is Interesting. 😁</p>"
7
+ end
8
+ end
9
+
10
+ Handler = PhaedraFunction
@@ -4,7 +4,6 @@ class PhaedraFunction < Phaedra::Base
4
4
  before_action :earlier_stuff
5
5
 
6
6
  def get(params)
7
- response["Content-Type"] = 'text/plain; charset=utf-8'
8
7
  "The Current Time is: #{Time.new} and Search Param is #{params[:search]}."
9
8
  end
10
9
 
@@ -112,7 +112,7 @@ module Phaedra
112
112
 
113
113
  def set_initial_status
114
114
  @res.status = 200
115
- @res["Content-Type"] = 'application/json'
115
+ @res["Content-Type"] = "application/json"
116
116
  end
117
117
 
118
118
  def call_method_action(params)
@@ -121,7 +121,11 @@ module Phaedra
121
121
  end
122
122
 
123
123
  def complete_response
124
- @res.body = @res.body.to_json if @res["Content-Type"] == "application/json"
124
+ if @res.body.is_a?(String) && !@res["Content-Type"].start_with?("text/")
125
+ @res["Content-Type"] = "text/plain"
126
+ elsif @res["Content-Type"] == "application/json"
127
+ @res.body = @res.body.to_json
128
+ end
125
129
  end
126
130
 
127
131
  def error_condition
@@ -33,10 +33,10 @@ module Phaedra
33
33
  endpoint = File.basename(req.path)
34
34
  ruby_path = File.join(full_api_path, api_folder, "#{endpoint}.rb")
35
35
  if File.exist?(ruby_path)
36
- original_verbosity = $VERBOSE
37
- $VERBOSE = nil
36
+ if Object.constants.include?(:PhaedraFunction)
37
+ Object.send(:remove_const, :PhaedraFunction)
38
+ end
38
39
  load ruby_path
39
- $VERBOSE = original_verbosity
40
40
 
41
41
  func = PhaedraFunction.new
42
42
  func.service(req, res)
@@ -1,3 +1,3 @@
1
1
  module Phaedra
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -6,7 +6,7 @@ Gem::Specification.new do |spec|
6
6
  spec.authors = ["Jared White"]
7
7
  spec.email = ["jared@whitefusion.io"]
8
8
 
9
- spec.summary = %q{Write serverless Ruby functions via a REST microframework compatible with Rack or WEBrick.}
9
+ spec.summary = %q{Write serverless Ruby functions via a REST-like microframework compatible with Rack or WEBrick.}
10
10
  spec.description = spec.summary
11
11
  spec.homepage = "https://github.com/whitefusionhq/phaedra"
12
12
  spec.license = "MIT"
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.2.0
4
+ version: 0.3.0
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-06 00:00:00.000000000 Z
11
+ date: 2020-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -66,7 +66,7 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '12.0'
69
- description: Write serverless Ruby functions via a REST microframework compatible
69
+ description: Write serverless Ruby functions via a REST-like microframework compatible
70
70
  with Rack or WEBrick.
71
71
  email:
72
72
  - jared@whitefusion.io
@@ -80,6 +80,7 @@ files:
80
80
  - LICENSE.txt
81
81
  - README.md
82
82
  - Rakefile
83
+ - example/api/simple.rb
83
84
  - example/api/the-time.rb
84
85
  - example/config.ru
85
86
  - lib/phaedra.rb
@@ -110,6 +111,6 @@ requirements: []
110
111
  rubygems_version: 3.0.8
111
112
  signing_key:
112
113
  specification_version: 4
113
- summary: Write serverless Ruby functions via a REST microframework compatible with
114
- Rack or WEBrick.
114
+ summary: Write serverless Ruby functions via a REST-like microframework compatible
115
+ with Rack or WEBrick.
115
116
  test_files: []