nephos-server 0.6.3 → 0.6.4
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +4 -0
- data/CHANGELOG +5 -0
- data/DOCUMENTATION/API_RENDER.md +7 -15
- data/DOCUMENTATION/GUIDE_CONTROLLER.md +65 -1
- data/DOCUMENTATION/GUIDE_ROUTER.md +39 -19
- data/README.md +10 -13
- data/app/image.jpg +0 -0
- data/bin/nephos-generator +1 -1
- data/lib/nephos-server/router/main.rb +1 -1
- data/nephos-server.gemspec +3 -2
- data/test/functional/generator.rb +17 -1
- data/version +1 -1
- metadata +27 -5
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a7a62dad08b09b531aab62f3e9800f65ec7e849d
|
4
|
+
data.tar.gz: ffd36f823891ca5141950551e6e3de7984f8b8d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 58a3d571167c75ccd6ebc97bc56fd4ec44c766b1dccfe3748746b467e44db39d3fe3ea3cd8588fdb3b53f92f692f0fd5b28fafe87537e4e4b7910637a84e90df
|
7
|
+
data.tar.gz: bbf86241ed2a7671d81b84cdea1c32960ef0e698ff29a0b37c246a2f7d0940b0d12ad13f14f5d1a7d606a53c55da93b44bf85ed6f9bb5a52ea0b7235c2882540
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data.tar.gz.sig
ADDED
data/CHANGELOG
CHANGED
data/DOCUMENTATION/API_RENDER.md
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# Render API
|
2
2
|
|
3
3
|
## Understand the API
|
4
|
-
|
5
4
|
The render API is a simple system to allows you to render HTTP responses to a client.
|
6
5
|
The API allows you to customize differents parts of the response:
|
7
6
|
|
@@ -13,22 +12,21 @@ The API use the returns of the Controllers methods to build the HTTP responses.
|
|
13
12
|
|
14
13
|
|
15
14
|
## Use the API
|
16
|
-
|
17
15
|
To use the API, you have to create a new controller.
|
18
|
-
The controller must be placed or requires in the ``app/`` directory
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
16
|
+
The controller must be placed or requires in the ``app/`` directory. Check the
|
17
|
+
[Guide about the controller](GUIDE_CONTROLLER.md).
|
18
|
+
|
19
|
+
It must contain a class, inheriting from ``Nephos::Controller``.
|
20
|
+
Each public method **can** be an entry point, defined in the ``routes.rb`` file.
|
21
|
+
[Routing documentation](GUIDE_ROUTING.md).
|
23
22
|
|
24
23
|
In the controller, you can use few helpers,
|
25
|
-
like the method ``params()
|
24
|
+
like the method ``params()`` and ``cookies``
|
26
25
|
|
27
26
|
The methods used as entry point must return a ``Hash`` described in the following lines.
|
28
27
|
It may optionnaly be an ``Integer``, to return only a status, or ``:empty``.
|
29
28
|
|
30
29
|
## Options
|
31
|
-
|
32
30
|
The returns of a Controller method can include the following keys:
|
33
31
|
|
34
32
|
- :plain
|
@@ -57,14 +55,12 @@ end
|
|
57
55
|
The following sections will describe how each key works and modify the HTTP response.
|
58
56
|
|
59
57
|
### Content
|
60
|
-
|
61
58
|
The ``:content`` key must be associated with a ``String`` (or ``Hash`` is json).
|
62
59
|
|
63
60
|
**Optionnal**:
|
64
61
|
a default value is provided, based on the ``:status`` if no ``:content`` if specified.
|
65
62
|
|
66
63
|
### Type
|
67
|
-
|
68
64
|
The ``:type`` key has to be associated with a ``String`` matching with **"kind/type"**.
|
69
65
|
|
70
66
|
**Optionnal**:
|
@@ -74,13 +70,11 @@ Kinds and Types (called type and sub-type by w3c) are described here:
|
|
74
70
|
[the w3c documentation](http://www.w3.org/Protocols/rfc1341/4_Content-Type.html)
|
75
71
|
|
76
72
|
#### Kind:
|
77
|
-
|
78
73
|
- image
|
79
74
|
- text
|
80
75
|
- ...
|
81
76
|
|
82
77
|
#### Type:
|
83
|
-
|
84
78
|
- plain
|
85
79
|
- javascript
|
86
80
|
- jpeg
|
@@ -88,7 +82,6 @@ Kinds and Types (called type and sub-type by w3c) are described here:
|
|
88
82
|
|
89
83
|
|
90
84
|
### Status
|
91
|
-
|
92
85
|
The ``:status`` key is associable with an Integer. It must represent the HTTP status code.
|
93
86
|
|
94
87
|
**Optionnal**:
|
@@ -98,7 +91,6 @@ The default value is 200.
|
|
98
91
|
|
99
92
|
|
100
93
|
### Plain, HTML, JSON
|
101
|
-
|
102
94
|
The keys ``:plain``, ``:html``, ``:json`` can replace both ``:content`` ``:type``.
|
103
95
|
It is associated like ``:content`` and **replace automaticaly the type**.
|
104
96
|
|
@@ -3,5 +3,69 @@
|
|
3
3
|
## Intern architecture
|
4
4
|
|
5
5
|
### Cookies
|
6
|
+
You can set cookies and get them via ``cookies`` in the body of any controller.
|
6
7
|
|
7
|
-
|
8
|
+
### Params
|
9
|
+
You can access to the parameters (defined by http or via the URI, based on your
|
10
|
+
routing rules).
|
11
|
+
They are accessible via ``params`` in the body of every controller.
|
12
|
+
|
13
|
+
### Hooks
|
14
|
+
You can define hooks, which are some methods, called every times, before or
|
15
|
+
after a call to a routed method. There is 2 kinds of hook actually:
|
16
|
+
|
17
|
+
- after_action
|
18
|
+
- before_action
|
19
|
+
|
20
|
+
Each of them will be called juste before or after calling the method requested.
|
21
|
+
It means that the cookies are not saved yet (so you can change them, etc.)
|
22
|
+
|
23
|
+
The hooks are defined by calling the methods ``after_action`` or
|
24
|
+
``before_action``, out of a method, usually on the top of the controller.
|
25
|
+
|
26
|
+
Hooks take 1 or 2 arguments.
|
27
|
+
- The first is the name of the method to call.
|
28
|
+
- The second, **optional**, is a hash, containing ``:only`` or ``:except``
|
29
|
+
keys, associated to an Array or Symbol or one Symbol. Each symbol represents
|
30
|
+
a method triggering the hook.
|
31
|
+
|
32
|
+
**Note: If there is no 2sd argument, then the hook is triggered every times.**
|
33
|
+
|
34
|
+
**Note: except is not already implemented**
|
35
|
+
|
36
|
+
Example:
|
37
|
+
```ruby
|
38
|
+
class MainController < Nephos::Controller
|
39
|
+
|
40
|
+
before_action :fct_before_all
|
41
|
+
before_action :fct_before_root, only: [:root]
|
42
|
+
after_action :fct_after_root, only: :root
|
43
|
+
|
44
|
+
def fct_before_all
|
45
|
+
# puts "BEFORE ALL"
|
46
|
+
end
|
47
|
+
|
48
|
+
def fct_before_root
|
49
|
+
# puts "BEFORE"
|
50
|
+
end
|
51
|
+
|
52
|
+
def fct_after_root
|
53
|
+
# puts "AFTER"
|
54
|
+
end
|
55
|
+
|
56
|
+
def root
|
57
|
+
# puts "ROOT"
|
58
|
+
cookies["a"] = "b"
|
59
|
+
cookies.delete("b").to_h
|
60
|
+
# puts "Cookies from the root:", cookies
|
61
|
+
{
|
62
|
+
json: {
|
63
|
+
list: $dataset,
|
64
|
+
add: '/add',
|
65
|
+
rm: '/rm',
|
66
|
+
}
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
```
|
@@ -1,25 +1,30 @@
|
|
1
1
|
# Routing Guide
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
### How the routes are inputed by the client ?
|
5
4
|
Each HTTP request made by the client will contains a **REQUEST_URI** value.
|
6
5
|
The web server receive this information, and will choose what to do,
|
7
6
|
based on the rules you will define.
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
You have to write the rules in the ``/routes.rb`` file.
|
8
|
+
### How to define the rules ?
|
9
|
+
The rules definitions are writen in the ``/routes.rb`` file.
|
12
10
|
Few helpers are provided to make the job easier.
|
13
|
-
They will be described in the
|
11
|
+
They will be described in the section ([helpers](#the-helpers)).
|
12
|
+
|
13
|
+
### Is there default rules ?
|
14
|
+
No there is not, but, there is still 2 kind of response that you cannot route:
|
15
|
+
|
16
|
+
1. If you did not write the route requested, then it will be a 404 error.
|
17
|
+
2. If the controller contains errors (not a valid return, or uncaught exception), then a 505 is returned.
|
18
|
+
|
19
|
+
To handle these errors, your should see [error guide](GUIDE_ERRORS.md).
|
14
20
|
|
15
|
-
## The helpers
|
16
21
|
|
22
|
+
## The helpers
|
17
23
|
As every HTTP request requires an HTTP verb, there is 4 helpers to handle them.
|
18
24
|
``get``, ``post``, ``put``, ``add_route``. Indeed, there is 3 main verbs (GET POST PUT).
|
19
25
|
But as you can need to create other verbs (DELETE, PATCH, ...), we allows you to handle them.
|
20
26
|
|
21
27
|
### add_route
|
22
|
-
|
23
28
|
The method ``add_route`` take 2 arguments.
|
24
29
|
|
25
30
|
1. verb (has to be a string, upcase as possible, like **GET**)
|
@@ -32,39 +37,54 @@ The option argument must contains the 3 following keys:
|
|
32
37
|
- ``:method``: the method of the controller that will be used to compute and render a result to the client.
|
33
38
|
|
34
39
|
As example, yuo can write:
|
35
|
-
|
36
40
|
```ruby
|
37
41
|
add_route "GET", url: "/tmp", controller: "MyController", method: "tmp"
|
38
42
|
```
|
39
43
|
|
40
44
|
### get post put
|
41
|
-
|
42
45
|
Theses 3 helpers allows you to use ``add_route`` without the first argument.
|
43
46
|
|
47
|
+
Example:
|
48
|
+
```ruby
|
49
|
+
get url: "/tmp", controller: "MyController", method: "tmp"
|
50
|
+
post url: "/tmp", controller: "MyController", method: "tmp"
|
51
|
+
```
|
44
52
|
### resource
|
45
|
-
|
46
53
|
This method takes 1 parameter and 1 block.
|
47
54
|
The parameter is a partial url, and the bloc, other routes.
|
48
55
|
|
49
56
|
Resource can be chained many times.
|
50
|
-
For Example, you can do this:
|
51
57
|
|
58
|
+
For example, you can do this:
|
52
59
|
```ruby
|
53
60
|
resource "user" do
|
61
|
+
get url: "/index", controller: "UserController", method: "show" # /user/index
|
54
62
|
resource "informations" do
|
55
|
-
get url: "/
|
63
|
+
get url: "/", controller: "UserController", method: "show" # /user/informations/
|
56
64
|
end
|
57
65
|
end
|
58
66
|
```
|
59
67
|
|
60
|
-
It will generate the route ``/home/index``, calling the ``MainController#root`` method.
|
61
|
-
|
62
|
-
|
63
68
|
## URL Parameters
|
69
|
+
The parameters can be passed through the URL. To allow a resource to have
|
70
|
+
parameters, you will have to place a ``/:param`` in your route rules. The
|
71
|
+
parameter will be placed in the controller in the ``params`` method, an be
|
72
|
+
accessible via ``params[:param]``. This is the reason why you should never
|
73
|
+
have 2 URL parameters with the same name, because only the last will be usable.
|
64
74
|
|
65
|
-
|
66
|
-
|
67
|
-
|
75
|
+
Example:
|
76
|
+
```ruby
|
77
|
+
resource "user" do
|
78
|
+
get url: "/:id", controller: "UserController", method: "show" # /user/(anything)
|
79
|
+
end
|
80
|
+
resource "static" do
|
81
|
+
resource ":page" do
|
82
|
+
get url: "/", controller: "StaticPageController", method: "show" # /static/(anything)
|
83
|
+
get url: "/edit", controller: "StaticPageController", method: "edit" # /static/(anything)/edit
|
84
|
+
put url: "/", controller: "StaticPageController", method: "update" # /static/(anything)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
```
|
68
88
|
|
69
89
|
## Notes
|
70
90
|
|
data/README.md
CHANGED
@@ -19,7 +19,6 @@ Features which will not be provided by nserver:
|
|
19
19
|
- [Sequel](DOCUMENTATION/DATABASE/SEQUEL.md)
|
20
20
|
|
21
21
|
# Start
|
22
|
-
|
23
22
|
```sh
|
24
23
|
gem install nephos # download the server and executables
|
25
24
|
ngenerator application MyApp # generate the application
|
@@ -39,7 +38,6 @@ nserver -p 8080 -h 0.0.0.0 # start the server. port is not required, neither hos
|
|
39
38
|
# Documentation
|
40
39
|
|
41
40
|
## Guides
|
42
|
-
|
43
41
|
Theses guides will provide you knowlegde about everything you can use in the application.
|
44
42
|
|
45
43
|
- [Generator GUIDE](DOCUMENTATION/GUIDE_GENERATOR.md)
|
@@ -51,16 +49,16 @@ Theses guides will provide you knowlegde about everything you can use in the app
|
|
51
49
|
|
52
50
|
## Examples
|
53
51
|
|
54
|
-
### Production
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
52
|
+
### Production and environment
|
53
|
+
To avoid information leaks from your application, set the environment variable
|
54
|
+
``export ENVIRONMENT=production``, or run the server with ``-e production``
|
55
|
+
parameter. When an error occurs, the backtrace will be print to the client in
|
56
|
+
the rendered page, unless the server runs in production environment.
|
59
57
|
|
60
58
|
### Controller
|
61
|
-
|
59
|
+
Every routes will call a method from a controller.
|
62
60
|
To create a controller, add a ruby file to ``app/``, with a class inherited by ``Nephos::Controller``
|
63
|
-
|
61
|
+
You should user ``ngenerator --controller NAME`` to generate a new controller.
|
64
62
|
|
65
63
|
```ruby
|
66
64
|
class Example < Nephos::Controller
|
@@ -76,7 +74,6 @@ end
|
|
76
74
|
```
|
77
75
|
|
78
76
|
### Rendering
|
79
|
-
|
80
77
|
To render a content to the client, you can return informations from a Controller method:
|
81
78
|
|
82
79
|
```ruby
|
@@ -91,7 +88,6 @@ return :empty
|
|
91
88
|
```
|
92
89
|
|
93
90
|
### Routing
|
94
|
-
|
95
91
|
The routing (rules to execute the action the user wants), you have to write the ``/routes.rb`` file.
|
96
92
|
If the user try to access an url not described in the file, it will automaticaly render a 404 not found.
|
97
93
|
|
@@ -111,13 +107,14 @@ end
|
|
111
107
|
# Developers: Roadmap
|
112
108
|
|
113
109
|
## TODO v0.6
|
114
|
-
-
|
110
|
+
- Alias for routing
|
115
111
|
- functionnal tests
|
112
|
+
- extension for urls (optional .xxx, with controller effect)
|
116
113
|
|
117
114
|
## TODO v0.7
|
115
|
+
- feature to change HTTP header from controller
|
118
116
|
- Documentation on architecture (UML)
|
119
117
|
- Improved documentation (Tutorial, Improved guides)
|
120
|
-
- Alias for routing
|
121
118
|
|
122
119
|
## v1 requierements
|
123
120
|
- Environement, Daemons, Port, Listen Host, Routables, Arguments
|
data/app/image.jpg
CHANGED
Binary file
|
data/bin/nephos-generator
CHANGED
@@ -73,7 +73,7 @@ module Nephos
|
|
73
73
|
rescue => err
|
74
74
|
STDERR.puts "Error: #{err.message}"
|
75
75
|
STDERR.puts err.backtrace
|
76
|
-
return error_custom(req, 500, "
|
76
|
+
return error_custom(req, 500, "#{err.message}\n---Backtrace---\n#{err.backtrace.join("\n")}\n")
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
data/nephos-server.gemspec
CHANGED
@@ -60,8 +60,9 @@ nephos-status
|
|
60
60
|
)
|
61
61
|
s.homepage = 'https://github.com/pouleta/NephosRubyServer'
|
62
62
|
s.license = 'GNU/GPLv3'
|
63
|
-
|
64
|
-
|
63
|
+
|
64
|
+
s.cert_chain = ['certs/nephos.pem']
|
65
|
+
s.signing_key = File.expand_path('~/.ssh/gem-private_key.pem') if $0 =~ /gem\z/
|
65
66
|
|
66
67
|
# s.add_dependency 'nephos', '~> 1.0'
|
67
68
|
s.add_dependency 'nomorebeer', '~> 1.1'
|
@@ -9,7 +9,23 @@ class TestNephosServerGenerator < Test::Unit::TestCase
|
|
9
9
|
assert(File.exists? "/tmp/nephos-server-test/routes.rb")
|
10
10
|
assert(Dir.exists? "/tmp/nephos-server-test/app")
|
11
11
|
gemfile_data = File.read("/tmp/nephos-server-test/Gemfile").split("\n")
|
12
|
-
assert(gemfile_data.include? "gem 'nephos
|
12
|
+
assert(gemfile_data.include? "gem 'nephos'")
|
13
|
+
`rm -rf /tmp/nephos-server-test 2> /tmp/null`
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_generator_application_with_build
|
17
|
+
`rm -rf /tmp/nephos-server-test 2> /tmp/null`
|
18
|
+
|
19
|
+
`./bin/nephos-generator --test -a /tmp/nephos-server-test --no-git`
|
20
|
+
assert(Dir.exists? "/tmp/nephos-server-test")
|
21
|
+
assert(File.exists? "/tmp/nephos-server-test/Gemfile")
|
22
|
+
assert(File.exists? "/tmp/nephos-server-test/routes.rb")
|
23
|
+
assert(Dir.exists? "/tmp/nephos-server-test/app")
|
24
|
+
gemfile_data = File.read("/tmp/nephos-server-test/Gemfile").split("\n")
|
25
|
+
assert(gemfile_data.include? "gem 'nephos'")
|
26
|
+
gemfile_lock_data = File.read("/tmp/nephos-server-test/Gemfile.lock").split
|
27
|
+
assert(gemfile_lock_data.include? "nephos")
|
28
|
+
assert(gemfile_lock_data.include? "nephos-server")
|
13
29
|
`rm -rf /tmp/nephos-server-test 2> /tmp/null`
|
14
30
|
end
|
15
31
|
|
data/version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
1
|
+
0.6.4
|
metadata
CHANGED
@@ -1,14 +1,37 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nephos-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- poulet_a
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
|
-
cert_chain:
|
11
|
-
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDljCCAn6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBIMRYwFAYDVQQDDA1hcnRo
|
14
|
+
dXIucG91bGV0MRkwFwYKCZImiZPyLGQBGRYJY3J5cHRvbGFiMRMwEQYKCZImiZPy
|
15
|
+
LGQBGRYDbmV0MB4XDTE1MTAwMzIxNTQyMFoXDTE2MTAwMjIxNTQyMFowSDEWMBQG
|
16
|
+
A1UEAwwNYXJ0aHVyLnBvdWxldDEZMBcGCgmSJomT8ixkARkWCWNyeXB0b2xhYjET
|
17
|
+
MBEGCgmSJomT8ixkARkWA25ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
18
|
+
ggEBANnLB9vH7/O0aUWi0f9VtC7F73zMC1OvxDaJq+qIcmGBFiKPOngDCRyKffWf
|
19
|
+
A6gyf7VsJAlDVFYoyNw7bzLFjBT9gkb5xmED3Uaxvt8Ax131YvKv0sTsQeiTVHHW
|
20
|
+
1crq7266hW1McrFU2A1uQRV8FHuruUJBuP7UUYK7fZi0barbkdAIb4VvQFZxXByI
|
21
|
+
lKdQSuhu8k0RcG1vTACEsQXJIUImc8CWMi8/TG3HidJdASMvIWtV2rNQXlQ+UgIc
|
22
|
+
UeHC0p+SNTrc09H6q+5eH8NRYhJ91xKuLXv7NNy8M3quAMHcQ1GM6DWljc+Jc4cm
|
23
|
+
uAPQMYJf7Vy6OzWLoEiv2QU6sE0CAwEAAaOBijCBhzAJBgNVHRMEAjAAMAsGA1Ud
|
24
|
+
DwQEAwIEsDAdBgNVHQ4EFgQU08cDEZOTZNjP/0+E2unJWyw4NzQwJgYDVR0RBB8w
|
25
|
+
HYEbYXJ0aHVyLnBvdWxldEBjcnlwdG9sYWIubmV0MCYGA1UdEgQfMB2BG2FydGh1
|
26
|
+
ci5wb3VsZXRAY3J5cHRvbGFiLm5ldDANBgkqhkiG9w0BAQUFAAOCAQEAo60BuRZM
|
27
|
+
5Vtn0H0kHHTPiXz09lwxx4cFpTqrTTM0T6qM3gKsR5eLyR1Rt5hGmYLPgY4ZW4zI
|
28
|
+
XcuDbgRJrczZs7AZNy5NXyVWpxCwkZzklpbGTuYQdFz7mKfVyALjLjrilOIktXcz
|
29
|
+
PvB7EoLlqYvq9cnwV3WE1MkRcBd07xpofcp0kxae2dCOZPUq24TcNaRe7Utw6jjA
|
30
|
+
iL0bcH7zZkzMsNoNpPAgsd3ovU4Mf9M+A3M8COmd7KzKyZ0k7P12u5InPWUsNQS2
|
31
|
+
tcYkgfqUJPitIJx1RvWZpIyH5uJhRUYK3+vU9nMOxez5WbIlC1TtpByKAPMX+sht
|
32
|
+
gib3AoIT8jh/2w==
|
33
|
+
-----END CERTIFICATE-----
|
34
|
+
date: 2015-10-03 00:00:00.000000000 Z
|
12
35
|
dependencies:
|
13
36
|
- !ruby/object:Gem::Dependency
|
14
37
|
name: nomorebeer
|
@@ -141,7 +164,6 @@ rubyforge_project:
|
|
141
164
|
rubygems_version: 2.4.8
|
142
165
|
signing_key:
|
143
166
|
specification_version: 4
|
144
|
-
summary: "*
|
145
|
-
(router, server, generator) tests * Add new unitary tests"
|
167
|
+
summary: "* Fix application generator (replace in the gemfile nephos-server by nephos)"
|
146
168
|
test_files: []
|
147
169
|
has_rdoc:
|
metadata.gz.sig
ADDED
Binary file
|