sober_swag 0.21.0 → 0.22.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 +4 -4
- data/.rubocop.yml +1 -0
- data/CHANGELOG.md +5 -0
- data/bin/console +30 -10
- data/docs/reporting.md +190 -0
- data/example/Gemfile +2 -2
- data/example/Gemfile.lock +92 -101
- data/example/app/controllers/application_controller.rb +4 -0
- data/example/app/controllers/people_controller.rb +44 -28
- data/example/app/output_objects/identified_output.rb +7 -0
- data/example/app/output_objects/person_output_object.rb +37 -11
- data/example/app/output_objects/post_output_object.rb +0 -4
- data/example/app/output_objects/reporting_post_output.rb +18 -0
- data/example/bin/rspec +29 -0
- data/example/spec/requests/people/create_spec.rb +3 -2
- data/example/spec/requests/people/index_spec.rb +1 -1
- data/lib/sober_swag/compiler/path.rb +3 -1
- data/lib/sober_swag/compiler.rb +58 -12
- data/lib/sober_swag/controller/route.rb +44 -8
- data/lib/sober_swag/controller.rb +18 -5
- data/lib/sober_swag/reporting/compiler.rb +39 -0
- data/lib/sober_swag/reporting/input/base.rb +11 -0
- data/lib/sober_swag/reporting/input/bool.rb +19 -0
- data/lib/sober_swag/reporting/input/converting/bool.rb +24 -0
- data/lib/sober_swag/reporting/input/converting/date.rb +30 -0
- data/lib/sober_swag/reporting/input/converting/date_time.rb +28 -0
- data/lib/sober_swag/reporting/input/converting/decimal.rb +24 -0
- data/lib/sober_swag/reporting/input/converting/integer.rb +19 -0
- data/lib/sober_swag/reporting/input/converting.rb +16 -0
- data/lib/sober_swag/reporting/input/defer.rb +29 -0
- data/lib/sober_swag/reporting/input/described.rb +38 -0
- data/lib/sober_swag/reporting/input/dictionary.rb +37 -0
- data/lib/sober_swag/reporting/input/either.rb +51 -0
- data/lib/sober_swag/reporting/input/enum.rb +44 -0
- data/lib/sober_swag/reporting/input/format.rb +39 -0
- data/lib/sober_swag/reporting/input/interface.rb +87 -0
- data/lib/sober_swag/reporting/input/list.rb +44 -0
- data/lib/sober_swag/reporting/input/mapped.rb +36 -0
- data/lib/sober_swag/reporting/input/merge_objects.rb +72 -0
- data/lib/sober_swag/reporting/input/null.rb +34 -0
- data/lib/sober_swag/reporting/input/number.rb +19 -0
- data/lib/sober_swag/reporting/input/object/property.rb +53 -0
- data/lib/sober_swag/reporting/input/object.rb +100 -0
- data/lib/sober_swag/reporting/input/pattern.rb +46 -0
- data/lib/sober_swag/reporting/input/referenced.rb +38 -0
- data/lib/sober_swag/reporting/input/struct.rb +271 -0
- data/lib/sober_swag/reporting/input/text.rb +42 -0
- data/lib/sober_swag/reporting/input.rb +54 -0
- data/lib/sober_swag/reporting/invalid_schema_error.rb +21 -0
- data/lib/sober_swag/reporting/output/base.rb +25 -0
- data/lib/sober_swag/reporting/output/bool.rb +25 -0
- data/lib/sober_swag/reporting/output/defer.rb +69 -0
- data/lib/sober_swag/reporting/output/described.rb +42 -0
- data/lib/sober_swag/reporting/output/dictionary.rb +46 -0
- data/lib/sober_swag/reporting/output/interface.rb +83 -0
- data/lib/sober_swag/reporting/output/list.rb +54 -0
- data/lib/sober_swag/reporting/output/merge_objects.rb +97 -0
- data/lib/sober_swag/reporting/output/null.rb +25 -0
- data/lib/sober_swag/reporting/output/number.rb +25 -0
- data/lib/sober_swag/reporting/output/object/property.rb +45 -0
- data/lib/sober_swag/reporting/output/object.rb +54 -0
- data/lib/sober_swag/reporting/output/partitioned.rb +77 -0
- data/lib/sober_swag/reporting/output/pattern.rb +50 -0
- data/lib/sober_swag/reporting/output/referenced.rb +42 -0
- data/lib/sober_swag/reporting/output/struct.rb +262 -0
- data/lib/sober_swag/reporting/output/text.rb +25 -0
- data/lib/sober_swag/reporting/output/via_map.rb +67 -0
- data/lib/sober_swag/reporting/output/viewed.rb +72 -0
- data/lib/sober_swag/reporting/output.rb +54 -0
- data/lib/sober_swag/reporting/report/base.rb +57 -0
- data/lib/sober_swag/reporting/report/either.rb +36 -0
- data/lib/sober_swag/reporting/report/error.rb +15 -0
- data/lib/sober_swag/reporting/report/list.rb +28 -0
- data/lib/sober_swag/reporting/report/merged_object.rb +25 -0
- data/lib/sober_swag/reporting/report/object.rb +29 -0
- data/lib/sober_swag/reporting/report/output.rb +14 -0
- data/lib/sober_swag/reporting/report/value.rb +28 -0
- data/lib/sober_swag/reporting/report.rb +16 -0
- data/lib/sober_swag/reporting.rb +11 -0
- data/lib/sober_swag/version.rb +1 -1
- data/lib/sober_swag.rb +1 -0
- metadata +65 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da1c1c2df36ccecf700e4d3ecf104c1324f9fa35b4588b4a040238f2513bf4b8
|
4
|
+
data.tar.gz: 3d22562035e1d8e93b11876fc82f6a23b1d26e95952d988423559d555adf680a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a486a7b09b631d567f509c94b3b161350de61971f148ba24f707e117fa6915e6d7be99c6782ff07662da44edc3edb56ebb1691ac0fe8e819fc138dca4513ac9
|
7
|
+
data.tar.gz: e4447e3a951d0867c76a6bbd30a49da136d9406d00dfe0c5e0632574746a59fa72b936eb736c573de33bfe01e1d36d36771561fed7b9a6b00be43dcaa0c82653
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [v0.22.0] 2021-12-21
|
4
|
+
|
5
|
+
- Added `SoberSwag::Reporting`, which is basically a v2 of the gem!
|
6
|
+
Docs for this can be found in [docs/reporting.md].
|
7
|
+
|
3
8
|
## [v0.21.0] 2021-09-02
|
4
9
|
|
5
10
|
- Added a new method of serializing views based on hash lookups, improving performance
|
data/bin/console
CHANGED
@@ -9,11 +9,6 @@ Bio = SoberSwag.input_object do
|
|
9
9
|
attribute :gender, SoberSwag::Types::String.enum('male', 'female') | SoberSwag::Types::String
|
10
10
|
end
|
11
11
|
|
12
|
-
Person = SoberSwag.input_object do
|
13
|
-
attribute :name, SoberSwag::Types::String
|
14
|
-
attribute? :bio, Bio.optional
|
15
|
-
end
|
16
|
-
|
17
12
|
MultiFloorLocation = SoberSwag.input_object do
|
18
13
|
attribute :building, SoberSwag::Types::String.enum('science', 'mathematics', 'literature')
|
19
14
|
attribute :floor, SoberSwag::Types::String
|
@@ -25,12 +20,37 @@ SingleFloorLocation = SoberSwag.input_object do
|
|
25
20
|
attribute :room, SoberSwag::Types::Integer
|
26
21
|
end
|
27
22
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
23
|
+
SortDirections = SoberSwag::Types::CommaArray.of(SoberSwag::Types::String.enum('created_at', 'updated_at', '-created_at', '-updated_at'))
|
24
|
+
|
25
|
+
# test
|
26
|
+
class Whatever < SoberSwag::Reporting::Input::Struct
|
27
|
+
attribute :first_name, SoberSwag::Reporting::Input::Text.new
|
28
|
+
attribute :last_name, SoberSwag::Reporting::Input::Text.new
|
29
|
+
attribute? :father, SoberSwag::Reporting::Input::Null.new | SoberSwag::Reporting::Input::Defer.new(proc { Whatever }), description: 'if the father is in our db, will be present'
|
30
|
+
attribute? :mother, SoberSwag::Reporting::Input::Null.new | SoberSwag::Reporting::Input::Defer.new(proc { Whatever }), description: 'if the mother is in our db, will be present'
|
32
31
|
end
|
33
32
|
|
34
|
-
|
33
|
+
# Kinda neat thing
|
34
|
+
class Otherwised < Whatever
|
35
|
+
attribute :ident, SoberSwag::Reporting::Input::Text.new.with_pattern(/^[A-Za-z0-9]+$/)
|
36
|
+
end
|
37
|
+
|
38
|
+
ArrayOfPeople = Otherwised.or(Whatever).list
|
39
|
+
|
40
|
+
##
|
41
|
+
# Output for a person
|
42
|
+
class OutputPerson < SoberSwag::Reporting::Output::Struct
|
43
|
+
field :first_name, SoberSwag::Reporting::Output::Text.new
|
44
|
+
field :last_name, SoberSwag::Reporting::Output::Text.new
|
45
|
+
define_view :detail do
|
46
|
+
field :initials, SoberSwag::Reporting::Output::Text.new do |obj|
|
47
|
+
[obj.first_name, obj.last_name].map { |e| e[0..0] }.map { |e| "#{e}." }.join(' ')
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
Person = Struct.new(:first_name, :last_name)
|
53
|
+
|
54
|
+
OutputPerson.view(:base)
|
35
55
|
|
36
56
|
Pry.start
|
data/docs/reporting.md
ADDED
@@ -0,0 +1,190 @@
|
|
1
|
+
# SoberSwag Reporting
|
2
|
+
|
3
|
+
`SoberSwag::Reporting` is a new module that provides a more *composable* interface of sober swag types.
|
4
|
+
Unlike the base version, it is *not* based on `dry-types`, instead using a simpler scheme.
|
5
|
+
It also allows for modeling of more complex type domains, and more reusable types.
|
6
|
+
|
7
|
+
The module is called `SoberSwag::Reporting` because it *reports* what happened on failure.
|
8
|
+
Consider trying to parse a struct with a first and last name, both of which need to be non-empty strings.
|
9
|
+
If I give it this input:
|
10
|
+
|
11
|
+
```json
|
12
|
+
{
|
13
|
+
"first_name": 10,
|
14
|
+
"last_name": ""
|
15
|
+
}
|
16
|
+
```
|
17
|
+
|
18
|
+
I will get back a report, which can tell me:
|
19
|
+
|
20
|
+
```json
|
21
|
+
{
|
22
|
+
"$.first_name": ["must be a string"],
|
23
|
+
"$.last_name": ["does not match pattern (.+)"]
|
24
|
+
}
|
25
|
+
```
|
26
|
+
|
27
|
+
As you can see, we get a dictionary of JSON-path values to errors.
|
28
|
+
|
29
|
+
More interestingly, you can use serializers in "reporting mode," which will *verify* that you're actually serializing what you said you would.
|
30
|
+
If you mess up, it'll give you a report of where the errors were.
|
31
|
+
This is intended to be used to make writing specs easier: to check that your serializer gives the right types, just use it in reporting mode and check the value!
|
32
|
+
|
33
|
+
## Basic Design
|
34
|
+
|
35
|
+
SoberSwag's reporting module is designed from the ground up to be *node-based*.
|
36
|
+
Everything conforms to a common interface.
|
37
|
+
For reporting *inputs*, all values:
|
38
|
+
|
39
|
+
- Have a method `call` which converts an input to the desired format, or a report if there was an error
|
40
|
+
- Have a method `call!` which converts an input to the desired format, or raises an exception if there was an error
|
41
|
+
- Have a method `swagger_schema` which converts the node to its swagger schema.
|
42
|
+
|
43
|
+
|
44
|
+
For reporting *outputs*, all values:
|
45
|
+
|
46
|
+
- Have a method `call` which serializes out a value
|
47
|
+
- Have a method `serialize_report` which serializes in "reporting mode," IE, it will return a report if serialization happened improperly
|
48
|
+
- Have a method `views` which returns a *set of applicable views*.
|
49
|
+
This is used to implement a serializer with many alternatives.
|
50
|
+
These views *propagate* correctly.
|
51
|
+
So if you have views `[:base, :detail]` on a serializer for a person, a serializer for an array of people will have the same views.
|
52
|
+
- Have a method `view` which takes in an argument, and returns a serializer specialized to that view.
|
53
|
+
- Have a method `swagger_schema` which converts the node to its swagger schema
|
54
|
+
|
55
|
+
From there, everything is done via composition.
|
56
|
+
Nodes delegate to other nodes to provide functionality like "wrap this type in a common reference" and "validate that this string matches this regexp."
|
57
|
+
Currently, the only validator built-in is matching a regexp or being a member of an enum, but we may add more in the future.
|
58
|
+
You can also use `.mapped` to do custom validation:
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
NotTheStringBob = SoberSwag::Reporting::Input.text.mapped do |text|
|
62
|
+
if text == "Bob"
|
63
|
+
Report::Value.new(['was the string bob I specifically told you not to be the string bob'])
|
64
|
+
else
|
65
|
+
text
|
66
|
+
end
|
67
|
+
end
|
68
|
+
```
|
69
|
+
|
70
|
+
## Input Structs
|
71
|
+
|
72
|
+
SoberSwag's reporting mode includes a class called `SoberSwag::Reporting::Input::Struct`.
|
73
|
+
It can be used to model *struct inputs*, IE, inputs that have some properties and are represented by JSON objects.
|
74
|
+
|
75
|
+
These structs behave much like Ruby structs, and implement inheritance *correctly*.
|
76
|
+
This means that the following works:
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
class Person < SoberSwag::Reporting::Input::Struct
|
80
|
+
attribute :first_name, SoberSwag::Reporting::Input.text
|
81
|
+
attribute :last_name, SoberSwag::Reporting::Input.text
|
82
|
+
end
|
83
|
+
|
84
|
+
class GradedPerson < Person
|
85
|
+
attribute :grade, SoberSwag::Reporting::Input.text.enum('A', 'B', 'C', 'D', 'F')
|
86
|
+
end
|
87
|
+
```
|
88
|
+
|
89
|
+
## Output Structs
|
90
|
+
|
91
|
+
SoberSwag's Reporting Output Structs work much the same way.
|
92
|
+
You can define *fields* on them, which they will serialize.
|
93
|
+
You can use them to define how to serialize an object, like so:
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
class PersonOutput < SoberSwag::Output::Struct
|
97
|
+
field :first_name, SoberSwag::Reporting::Output.text
|
98
|
+
field :last_name, SoberSwag::Reporting::Output.text
|
99
|
+
|
100
|
+
field :grade, SoberSwag::Reporting::Output.text.nilable do
|
101
|
+
if object_to_serialize.respond_to?(:grade)
|
102
|
+
object_to_serialize.grade
|
103
|
+
else
|
104
|
+
nil
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
field :has_grade, SoberSwag::Reporting::Output.bool do
|
109
|
+
grade.nil? # fields are defined as *methods* on the output struct
|
110
|
+
end
|
111
|
+
end
|
112
|
+
```
|
113
|
+
|
114
|
+
Output Structs can also have *views*.
|
115
|
+
Views can be nested only once - if you use a serializer with views as the key of an object, we will *always* use the base view.
|
116
|
+
This prevents some weirdness with the non-reporting SoberSwag serializers, where views could technically be read by child objects in some circumstances as they were only passed in the `view` key.
|
117
|
+
A view will *always inherit all attributes of the parent object, regardless of order.*
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
class AlternativePersonOutput < SoberSwag::Output::Struct
|
121
|
+
field :first_name, SoberSwag::Reporting::Output.text
|
122
|
+
|
123
|
+
view :with_grade do
|
124
|
+
field :grade, SoberSwag::Reporting::Output.text.nilable do
|
125
|
+
if object_to_serialize.respond_to?(:grade)
|
126
|
+
object_to_serialize.grade
|
127
|
+
else
|
128
|
+
nil
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
field :last_name, SoberSwag::Reporting::Output.text
|
134
|
+
end
|
135
|
+
|
136
|
+
AlternativePersonOutput.views # => Set.new(:base, :with_grade)
|
137
|
+
AlternativePersonOutput.view(:with_grade).serialize(my_person) # includes the last_name field
|
138
|
+
```
|
139
|
+
|
140
|
+
View relationships are modeled with *composition*.
|
141
|
+
This leads to slightly more natural to read swagger schemas.
|
142
|
+
|
143
|
+
## Dictionary Types
|
144
|
+
|
145
|
+
SoberSwag's reporting outputs allow defining a *dictionary* of key-value types.
|
146
|
+
This lets you represent an object like this in your schema:
|
147
|
+
|
148
|
+
```json
|
149
|
+
{
|
150
|
+
"name": "Advanced Time Travel",
|
151
|
+
"student_grades": {
|
152
|
+
"student_id_1": "F",
|
153
|
+
"student_id_2": "F"
|
154
|
+
}
|
155
|
+
}
|
156
|
+
```
|
157
|
+
|
158
|
+
This type would probably be represented by:
|
159
|
+
|
160
|
+
```ruby
|
161
|
+
class Classroom < SoberSwag::Reporting::Input::Struct
|
162
|
+
attribute :name, SoberSwag::Reporting::Input.text
|
163
|
+
attribute :student_grades, SoberSwag::Reporting::Input::Dictionary.of(
|
164
|
+
SoberSwag::Reporting::Input.text.enum('A', 'B', 'C', 'D', 'F')
|
165
|
+
)
|
166
|
+
end
|
167
|
+
```
|
168
|
+
|
169
|
+
## Referenced Types
|
170
|
+
|
171
|
+
If you have a type you use a lot, and you want to refer to it by a common name, you can describe it like so:
|
172
|
+
|
173
|
+
```ruby
|
174
|
+
GradeEnum = SoberSwag::Reporting::Input.text.enum('A', 'B', 'C', 'D', 'F').referenced('GradeEnum')
|
175
|
+
```
|
176
|
+
|
177
|
+
This will now be represented as a Reference type in generated swagger.
|
178
|
+
|
179
|
+
## Things not present
|
180
|
+
|
181
|
+
There are basically two things to keep in mind when upgrading to `SoberSwag::Reporting`.
|
182
|
+
|
183
|
+
1. There is no longer a `default` for a type.
|
184
|
+
This is because that was really hard to model in Swagger, and can be better served via use of `.mapped` and `.optional`.
|
185
|
+
We may add this back eventually.
|
186
|
+
2. Serializers no longer take an arbitrary `options` key.
|
187
|
+
Instead, view management is now *explicit*.
|
188
|
+
This is because it was too tempting to pass data to serialize in the options key, which is against the point of the serializers.
|
189
|
+
|
190
|
+
|
data/example/Gemfile
CHANGED
@@ -8,7 +8,7 @@ gem 'actionpack', '>= 6.0.3.2'
|
|
8
8
|
# Use sqlite3 as the database for Active Record
|
9
9
|
gem 'sqlite3', '~> 1.4'
|
10
10
|
# Use Puma as the app server
|
11
|
-
gem 'puma', '~> 5.
|
11
|
+
gem 'puma', '~> 5.4'
|
12
12
|
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
|
13
13
|
# gem 'jbuilder', '~> 2.7'
|
14
14
|
# Use Active Model has_secure_password
|
@@ -34,7 +34,7 @@ group :development, :test do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
group :development do
|
37
|
-
gem 'listen', '>= 3.0.5', '< 3.
|
37
|
+
gem 'listen', '>= 3.0.5', '< 3.8'
|
38
38
|
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
|
39
39
|
gem 'spring'
|
40
40
|
gem 'spring-watcher-listen', '~> 2.0.0'
|
data/example/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
sober_swag (0.
|
4
|
+
sober_swag (0.21.0)
|
5
5
|
activesupport
|
6
6
|
dry-struct (~> 1.0)
|
7
7
|
dry-types (~> 1.2)
|
@@ -9,164 +9,155 @@ PATH
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
11
11
|
specs:
|
12
|
-
actioncable (6.0.
|
13
|
-
actionpack (= 6.0.
|
12
|
+
actioncable (6.0.4.1)
|
13
|
+
actionpack (= 6.0.4.1)
|
14
14
|
nio4r (~> 2.0)
|
15
15
|
websocket-driver (>= 0.6.1)
|
16
|
-
actionmailbox (6.0.
|
17
|
-
actionpack (= 6.0.
|
18
|
-
activejob (= 6.0.
|
19
|
-
activerecord (= 6.0.
|
20
|
-
activestorage (= 6.0.
|
21
|
-
activesupport (= 6.0.
|
16
|
+
actionmailbox (6.0.4.1)
|
17
|
+
actionpack (= 6.0.4.1)
|
18
|
+
activejob (= 6.0.4.1)
|
19
|
+
activerecord (= 6.0.4.1)
|
20
|
+
activestorage (= 6.0.4.1)
|
21
|
+
activesupport (= 6.0.4.1)
|
22
22
|
mail (>= 2.7.1)
|
23
|
-
actionmailer (6.0.
|
24
|
-
actionpack (= 6.0.
|
25
|
-
actionview (= 6.0.
|
26
|
-
activejob (= 6.0.
|
23
|
+
actionmailer (6.0.4.1)
|
24
|
+
actionpack (= 6.0.4.1)
|
25
|
+
actionview (= 6.0.4.1)
|
26
|
+
activejob (= 6.0.4.1)
|
27
27
|
mail (~> 2.5, >= 2.5.4)
|
28
28
|
rails-dom-testing (~> 2.0)
|
29
|
-
actionpack (6.0.
|
30
|
-
actionview (= 6.0.
|
31
|
-
activesupport (= 6.0.
|
29
|
+
actionpack (6.0.4.1)
|
30
|
+
actionview (= 6.0.4.1)
|
31
|
+
activesupport (= 6.0.4.1)
|
32
32
|
rack (~> 2.0, >= 2.0.8)
|
33
33
|
rack-test (>= 0.6.3)
|
34
34
|
rails-dom-testing (~> 2.0)
|
35
35
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
36
|
-
actiontext (6.0.
|
37
|
-
actionpack (= 6.0.
|
38
|
-
activerecord (= 6.0.
|
39
|
-
activestorage (= 6.0.
|
40
|
-
activesupport (= 6.0.
|
36
|
+
actiontext (6.0.4.1)
|
37
|
+
actionpack (= 6.0.4.1)
|
38
|
+
activerecord (= 6.0.4.1)
|
39
|
+
activestorage (= 6.0.4.1)
|
40
|
+
activesupport (= 6.0.4.1)
|
41
41
|
nokogiri (>= 1.8.5)
|
42
|
-
actionview (6.0.
|
43
|
-
activesupport (= 6.0.
|
42
|
+
actionview (6.0.4.1)
|
43
|
+
activesupport (= 6.0.4.1)
|
44
44
|
builder (~> 3.1)
|
45
45
|
erubi (~> 1.4)
|
46
46
|
rails-dom-testing (~> 2.0)
|
47
47
|
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
48
|
-
activejob (6.0.
|
49
|
-
activesupport (= 6.0.
|
48
|
+
activejob (6.0.4.1)
|
49
|
+
activesupport (= 6.0.4.1)
|
50
50
|
globalid (>= 0.3.6)
|
51
|
-
activemodel (6.0.
|
52
|
-
activesupport (= 6.0.
|
53
|
-
activerecord (6.0.
|
54
|
-
activemodel (= 6.0.
|
55
|
-
activesupport (= 6.0.
|
56
|
-
activestorage (6.0.
|
57
|
-
actionpack (= 6.0.
|
58
|
-
activejob (= 6.0.
|
59
|
-
activerecord (= 6.0.
|
60
|
-
marcel (~> 0.
|
61
|
-
activesupport (6.0.
|
51
|
+
activemodel (6.0.4.1)
|
52
|
+
activesupport (= 6.0.4.1)
|
53
|
+
activerecord (6.0.4.1)
|
54
|
+
activemodel (= 6.0.4.1)
|
55
|
+
activesupport (= 6.0.4.1)
|
56
|
+
activestorage (6.0.4.1)
|
57
|
+
actionpack (= 6.0.4.1)
|
58
|
+
activejob (= 6.0.4.1)
|
59
|
+
activerecord (= 6.0.4.1)
|
60
|
+
marcel (~> 1.0.0)
|
61
|
+
activesupport (6.0.4.1)
|
62
62
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
63
63
|
i18n (>= 0.7, < 2)
|
64
64
|
minitest (~> 5.1)
|
65
65
|
tzinfo (~> 1.1)
|
66
66
|
zeitwerk (~> 2.2, >= 2.2.2)
|
67
|
-
bootsnap (1.
|
67
|
+
bootsnap (1.9.3)
|
68
68
|
msgpack (~> 1.0)
|
69
69
|
builder (3.2.4)
|
70
70
|
byebug (11.1.3)
|
71
71
|
coderay (1.1.3)
|
72
|
-
concurrent-ruby (1.1.
|
72
|
+
concurrent-ruby (1.1.9)
|
73
73
|
crass (1.0.6)
|
74
74
|
diff-lcs (1.4.4)
|
75
|
-
dry-configurable (0.
|
75
|
+
dry-configurable (0.13.0)
|
76
76
|
concurrent-ruby (~> 1.0)
|
77
|
-
dry-core (~> 0.
|
78
|
-
|
79
|
-
dry-container (0.7.2)
|
77
|
+
dry-core (~> 0.6)
|
78
|
+
dry-container (0.9.0)
|
80
79
|
concurrent-ruby (~> 1.0)
|
81
|
-
dry-configurable (~> 0.
|
82
|
-
dry-core (0.
|
80
|
+
dry-configurable (~> 0.13, >= 0.13.0)
|
81
|
+
dry-core (0.7.1)
|
83
82
|
concurrent-ruby (~> 1.0)
|
84
|
-
dry-
|
85
|
-
dry-
|
86
|
-
dry-logic (1.0.6)
|
83
|
+
dry-inflector (0.2.1)
|
84
|
+
dry-logic (1.2.0)
|
87
85
|
concurrent-ruby (~> 1.0)
|
88
|
-
dry-core (~> 0.
|
89
|
-
|
90
|
-
|
91
|
-
dry-
|
92
|
-
dry-equalizer (~> 0.3)
|
93
|
-
dry-types (~> 1.3)
|
86
|
+
dry-core (~> 0.5, >= 0.5)
|
87
|
+
dry-struct (1.4.0)
|
88
|
+
dry-core (~> 0.5, >= 0.5)
|
89
|
+
dry-types (~> 1.5)
|
94
90
|
ice_nine (~> 0.11)
|
95
|
-
dry-types (1.
|
91
|
+
dry-types (1.5.1)
|
96
92
|
concurrent-ruby (~> 1.0)
|
97
93
|
dry-container (~> 0.3)
|
98
|
-
dry-core (~> 0.
|
99
|
-
dry-equalizer (~> 0.3)
|
94
|
+
dry-core (~> 0.5, >= 0.5)
|
100
95
|
dry-inflector (~> 0.1, >= 0.1.2)
|
101
96
|
dry-logic (~> 1.0, >= 1.0.2)
|
102
97
|
dry-types-rails (0.3.4)
|
103
98
|
dry-types (>= 0.8.1)
|
104
99
|
rails (>= 3)
|
105
100
|
erubi (1.10.0)
|
106
|
-
ffi (1.15.
|
107
|
-
globalid (0.
|
108
|
-
activesupport (>=
|
109
|
-
i18n (1.8.
|
101
|
+
ffi (1.15.4)
|
102
|
+
globalid (1.0.0)
|
103
|
+
activesupport (>= 5.0)
|
104
|
+
i18n (1.8.11)
|
110
105
|
concurrent-ruby (~> 1.0)
|
111
106
|
ice_nine (0.11.2)
|
112
|
-
listen (3.
|
107
|
+
listen (3.7.0)
|
113
108
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
114
109
|
rb-inotify (~> 0.9, >= 0.9.10)
|
115
|
-
loofah (2.
|
110
|
+
loofah (2.12.0)
|
116
111
|
crass (~> 1.0.2)
|
117
112
|
nokogiri (>= 1.5.9)
|
118
113
|
mail (2.7.1)
|
119
114
|
mini_mime (>= 0.1.1)
|
120
|
-
marcel (0.
|
121
|
-
mimemagic (~> 0.3.2)
|
115
|
+
marcel (1.0.2)
|
122
116
|
method_source (1.0.0)
|
123
|
-
|
124
|
-
|
125
|
-
rake
|
126
|
-
mini_mime (1.0.2)
|
127
|
-
mini_portile2 (2.5.1)
|
117
|
+
mini_mime (1.1.2)
|
118
|
+
mini_portile2 (2.6.1)
|
128
119
|
minitest (5.14.4)
|
129
120
|
msgpack (1.4.2)
|
130
|
-
nio4r (2.5.
|
131
|
-
nokogiri (1.
|
132
|
-
mini_portile2 (~> 2.
|
121
|
+
nio4r (2.5.8)
|
122
|
+
nokogiri (1.12.5)
|
123
|
+
mini_portile2 (~> 2.6.1)
|
133
124
|
racc (~> 1.4)
|
134
125
|
pry (0.14.1)
|
135
126
|
coderay (~> 1.1)
|
136
127
|
method_source (~> 1.0)
|
137
|
-
puma (5.
|
128
|
+
puma (5.5.2)
|
138
129
|
nio4r (~> 2.0)
|
139
|
-
racc (1.
|
130
|
+
racc (1.6.0)
|
140
131
|
rack (2.2.3)
|
141
132
|
rack-test (1.1.0)
|
142
133
|
rack (>= 1.0, < 3)
|
143
|
-
rails (6.0.
|
144
|
-
actioncable (= 6.0.
|
145
|
-
actionmailbox (= 6.0.
|
146
|
-
actionmailer (= 6.0.
|
147
|
-
actionpack (= 6.0.
|
148
|
-
actiontext (= 6.0.
|
149
|
-
actionview (= 6.0.
|
150
|
-
activejob (= 6.0.
|
151
|
-
activemodel (= 6.0.
|
152
|
-
activerecord (= 6.0.
|
153
|
-
activestorage (= 6.0.
|
154
|
-
activesupport (= 6.0.
|
134
|
+
rails (6.0.4.1)
|
135
|
+
actioncable (= 6.0.4.1)
|
136
|
+
actionmailbox (= 6.0.4.1)
|
137
|
+
actionmailer (= 6.0.4.1)
|
138
|
+
actionpack (= 6.0.4.1)
|
139
|
+
actiontext (= 6.0.4.1)
|
140
|
+
actionview (= 6.0.4.1)
|
141
|
+
activejob (= 6.0.4.1)
|
142
|
+
activemodel (= 6.0.4.1)
|
143
|
+
activerecord (= 6.0.4.1)
|
144
|
+
activestorage (= 6.0.4.1)
|
145
|
+
activesupport (= 6.0.4.1)
|
155
146
|
bundler (>= 1.3.0)
|
156
|
-
railties (= 6.0.
|
147
|
+
railties (= 6.0.4.1)
|
157
148
|
sprockets-rails (>= 2.0.0)
|
158
149
|
rails-dom-testing (2.0.3)
|
159
150
|
activesupport (>= 4.2.0)
|
160
151
|
nokogiri (>= 1.6)
|
161
|
-
rails-html-sanitizer (1.
|
152
|
+
rails-html-sanitizer (1.4.2)
|
162
153
|
loofah (~> 2.3)
|
163
|
-
railties (6.0.
|
164
|
-
actionpack (= 6.0.
|
165
|
-
activesupport (= 6.0.
|
154
|
+
railties (6.0.4.1)
|
155
|
+
actionpack (= 6.0.4.1)
|
156
|
+
activesupport (= 6.0.4.1)
|
166
157
|
method_source
|
167
158
|
rake (>= 0.8.7)
|
168
159
|
thor (>= 0.20.3, < 2.0)
|
169
|
-
rake (13.0.
|
160
|
+
rake (13.0.6)
|
170
161
|
rb-fsevent (0.11.0)
|
171
162
|
rb-inotify (0.10.1)
|
172
163
|
ffi (~> 1.0)
|
@@ -178,7 +169,7 @@ GEM
|
|
178
169
|
rspec-mocks (3.10.2)
|
179
170
|
diff-lcs (>= 1.2.0, < 2.0)
|
180
171
|
rspec-support (~> 3.10.0)
|
181
|
-
rspec-rails (5.0.
|
172
|
+
rspec-rails (5.0.2)
|
182
173
|
actionpack (>= 5.2)
|
183
174
|
activesupport (>= 5.2)
|
184
175
|
railties (>= 5.2)
|
@@ -186,7 +177,7 @@ GEM
|
|
186
177
|
rspec-expectations (~> 3.10)
|
187
178
|
rspec-mocks (~> 3.10)
|
188
179
|
rspec-support (~> 3.10)
|
189
|
-
rspec-support (3.10.
|
180
|
+
rspec-support (3.10.3)
|
190
181
|
spring (2.1.1)
|
191
182
|
spring-watcher-listen (2.0.1)
|
192
183
|
listen (>= 2.7, < 4.0)
|
@@ -194,19 +185,19 @@ GEM
|
|
194
185
|
sprockets (4.0.2)
|
195
186
|
concurrent-ruby (~> 1.0)
|
196
187
|
rack (> 1, < 3)
|
197
|
-
sprockets-rails (3.
|
198
|
-
actionpack (>=
|
199
|
-
activesupport (>=
|
188
|
+
sprockets-rails (3.4.1)
|
189
|
+
actionpack (>= 5.2)
|
190
|
+
activesupport (>= 5.2)
|
200
191
|
sprockets (>= 3.0.0)
|
201
192
|
sqlite3 (1.4.2)
|
202
193
|
thor (1.1.0)
|
203
194
|
thread_safe (0.3.6)
|
204
195
|
tzinfo (1.2.9)
|
205
196
|
thread_safe (~> 0.1)
|
206
|
-
websocket-driver (0.7.
|
197
|
+
websocket-driver (0.7.5)
|
207
198
|
websocket-extensions (>= 0.1.0)
|
208
199
|
websocket-extensions (0.1.5)
|
209
|
-
zeitwerk (2.
|
200
|
+
zeitwerk (2.5.1)
|
210
201
|
|
211
202
|
PLATFORMS
|
212
203
|
ruby
|
@@ -216,9 +207,9 @@ DEPENDENCIES
|
|
216
207
|
bootsnap (>= 1.4.2)
|
217
208
|
byebug
|
218
209
|
dry-types-rails
|
219
|
-
listen (>= 3.0.5, < 3.
|
210
|
+
listen (>= 3.0.5, < 3.8)
|
220
211
|
pry
|
221
|
-
puma (~> 5.
|
212
|
+
puma (~> 5.4)
|
222
213
|
rails (~> 6.0.2, >= 6.0.2.2)
|
223
214
|
rspec-rails
|
224
215
|
sober_swag!
|