panko_serializer 0.8.1 → 0.8.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/.github/dependabot.yml +6 -0
- data/.github/workflows/docs.yml +6 -6
- data/.github/workflows/lint.yml +9 -19
- data/.github/workflows/ruby.yml +14 -10
- data/.gitignore +2 -0
- data/.rubocop.yml +29 -21
- data/Appraisals +29 -0
- data/Gemfile +12 -14
- data/README.md +6 -7
- data/Rakefile +3 -1
- data/benchmarks/allocs.rb +2 -2
- data/benchmarks/benchmarking_support.rb +2 -1
- data/benchmarks/bm_ams_0_10.rb +3 -7
- data/benchmarks/bm_panko_json.rb +2 -6
- data/benchmarks/bm_panko_object.rb +2 -6
- data/benchmarks/bm_plain_object.rb +1 -4
- data/benchmarks/bm_serialization_descriptor.rb +1 -1
- data/benchmarks/bm_to_object.rb +2 -6
- data/benchmarks/profile.rb +2 -2
- data/benchmarks/sanity.rb +2 -6
- data/benchmarks/setup.rb +4 -3
- data/benchmarks/type_casts/bm_active_record.rb +10 -39
- data/benchmarks/type_casts/bm_panko.rb +3 -6
- data/benchmarks/type_casts/support.rb +0 -1
- data/docs/docs/associations.md +20 -7
- data/docs/docs/attributes.md +29 -23
- data/docs/docs/design-choices.md +28 -27
- data/docs/docs/getting-started.md +9 -3
- data/docs/docs/introduction.md +5 -5
- data/docs/docs/performance.md +0 -1
- data/docs/docs/response-bag.md +8 -1
- data/docs/docusaurus.config.js +86 -0
- data/docs/package-lock.json +12607 -18674
- data/docs/package.json +14 -7
- data/docs/src/css/customTheme.css +9 -0
- data/docs/static/CNAME +1 -0
- data/ext/panko_serializer/attributes_writer/active_record.c +103 -72
- data/ext/panko_serializer/attributes_writer/active_record.h +2 -0
- data/ext/panko_serializer/attributes_writer/type_cast/type_cast.c +17 -0
- data/gemfiles/7.0.0.gemfile +39 -0
- data/gemfiles/7.0.0.gemfile.lock +176 -0
- data/gemfiles/7.1.0.gemfile +39 -0
- data/gemfiles/7.1.0.gemfile.lock +198 -0
- data/gemfiles/7.2.0.gemfile +39 -0
- data/gemfiles/7.2.0.gemfile.lock +198 -0
- data/gemfiles/8.0.0.gemfile +39 -0
- data/gemfiles/8.0.0.gemfile.lock +219 -0
- data/lib/panko/serializer.rb +1 -1
- data/lib/panko/version.rb +1 -1
- data/panko_serializer.gemspec +2 -1
- metadata +31 -10
- data/.standard.yml +0 -4
- data/docs/.DS_Store +0 -0
- data/docs/README.md +0 -198
- data/docs/core/Footer.js +0 -80
- data/docs/i18n/en.json +0 -50
- data/docs/siteConfig.js +0 -80
data/docs/package.json
CHANGED
@@ -1,14 +1,21 @@
|
|
1
1
|
{
|
2
2
|
"scripts": {
|
3
3
|
"examples": "docusaurus-examples",
|
4
|
-
"start": "docusaurus
|
5
|
-
"build": "docusaurus
|
6
|
-
"publish-gh-pages": "docusaurus-publish",
|
4
|
+
"start": "docusaurus start",
|
5
|
+
"build": "docusaurus build",
|
7
6
|
"write-translations": "docusaurus-write-translations",
|
8
7
|
"version": "docusaurus-version",
|
9
|
-
"rename-version": "docusaurus-rename-version"
|
8
|
+
"rename-version": "docusaurus-rename-version",
|
9
|
+
"swizzle": "docusaurus swizzle",
|
10
|
+
"deploy": "docusaurus deploy",
|
11
|
+
"docusaurus": "docusaurus"
|
10
12
|
},
|
11
|
-
"devDependencies": {
|
12
|
-
|
13
|
+
"devDependencies": {},
|
14
|
+
"dependencies": {
|
15
|
+
"@docusaurus/core": "3.5.2",
|
16
|
+
"@docusaurus/preset-classic": "3.5.2",
|
17
|
+
"clsx": "^1.1.1",
|
18
|
+
"react": "^17.0.2",
|
19
|
+
"react-dom": "^17.0.2"
|
13
20
|
}
|
14
|
-
}
|
21
|
+
}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
:root{
|
2
|
+
--ifm-color-primary-lightest: #D34A4B;
|
3
|
+
--ifm-color-primary-lighter: #CA3133;
|
4
|
+
--ifm-color-primary-light: #C22F30;
|
5
|
+
--ifm-color-primary: #B02B2C;
|
6
|
+
--ifm-color-primary-dark: #9E2728;
|
7
|
+
--ifm-color-primary-darker: #962525;
|
8
|
+
--ifm-color-primary-darkest: #7B1E1F;
|
9
|
+
}
|
data/docs/static/CNAME
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
panko.dev
|
@@ -9,79 +9,118 @@ static ID delegate_hash_id;
|
|
9
9
|
static ID value_before_type_cast_id;
|
10
10
|
static ID type_id;
|
11
11
|
|
12
|
-
static
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
VALUE
|
19
|
-
|
20
|
-
|
21
|
-
attributes_set = rb_ivar_get(object, attributes_id);
|
22
|
-
if (NIL_P(attributes_set)) {
|
23
|
-
return Qnil;
|
12
|
+
static ID fetch_id;
|
13
|
+
|
14
|
+
// ActiveRecord::Result::IndexedRow
|
15
|
+
static VALUE ar_result_indexed_row = Qundef;
|
16
|
+
static int fetched_ar_result_indexed_row = 0;
|
17
|
+
|
18
|
+
VALUE fetch_ar_result_indexed_row_type() {
|
19
|
+
if (fetched_ar_result_indexed_row == 1) {
|
20
|
+
return ar_result_indexed_row;
|
24
21
|
}
|
25
22
|
|
26
|
-
|
27
|
-
|
23
|
+
fetched_ar_result_indexed_row = 1;
|
24
|
+
|
25
|
+
VALUE ar, ar_result;
|
26
|
+
|
27
|
+
ar = rb_const_get_at(rb_cObject, rb_intern("ActiveRecord"));
|
28
|
+
|
29
|
+
// ActiveRecord::Result
|
30
|
+
ar_result = rb_const_get_at(ar, rb_intern("Result"));
|
31
|
+
|
32
|
+
if (rb_const_defined_at(ar_result, rb_intern("IndexedRow")) == (int)Qtrue) {
|
33
|
+
ar_result_indexed_row = rb_const_get_at(ar_result, rb_intern("IndexedRow"));
|
28
34
|
}
|
29
35
|
|
30
|
-
|
31
|
-
return lazy_attributes_hash;
|
36
|
+
return ar_result_indexed_row;
|
32
37
|
}
|
33
38
|
|
34
39
|
struct attributes {
|
40
|
+
// Hash
|
35
41
|
VALUE attributes_hash;
|
42
|
+
size_t attributes_hash_size;
|
36
43
|
|
44
|
+
// Hash
|
37
45
|
VALUE types;
|
46
|
+
// Hash
|
38
47
|
VALUE additional_types;
|
48
|
+
// heuristics
|
49
|
+
bool tryToReadFromAdditionalTypes;
|
50
|
+
|
51
|
+
// Rails <8: Hash
|
52
|
+
// Rails >=8: ActiveRecord::Result::IndexedRow
|
39
53
|
VALUE values;
|
40
54
|
|
41
|
-
//
|
42
|
-
|
55
|
+
// Hash
|
56
|
+
VALUE indexed_row_column_indexes;
|
57
|
+
// Array or NIL
|
58
|
+
VALUE indexed_row_row;
|
59
|
+
bool is_indexed_row;
|
43
60
|
};
|
44
61
|
|
45
62
|
struct attributes init_context(VALUE obj) {
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
63
|
+
volatile VALUE attributes_set = rb_ivar_get(obj, attributes_id);
|
64
|
+
volatile VALUE attributes_hash = rb_ivar_get(attributes_set, attributes_id);
|
65
|
+
|
66
|
+
struct attributes attrs = (struct attributes){
|
67
|
+
.attributes_hash =
|
68
|
+
PANKO_EMPTY_HASH(attributes_hash) ? Qnil : attributes_hash,
|
69
|
+
.attributes_hash_size = 0,
|
70
|
+
|
71
|
+
.types = rb_ivar_get(attributes_set, types_id),
|
72
|
+
.additional_types = rb_ivar_get(attributes_set, additional_types_id),
|
73
|
+
.tryToReadFromAdditionalTypes =
|
74
|
+
PANKO_EMPTY_HASH(rb_ivar_get(attributes_set, additional_types_id)) ==
|
75
|
+
false,
|
76
|
+
|
77
|
+
.values = rb_ivar_get(attributes_set, values_id),
|
78
|
+
.is_indexed_row = false,
|
79
|
+
.indexed_row_column_indexes = Qnil,
|
80
|
+
.indexed_row_row = Qnil,
|
81
|
+
};
|
82
|
+
|
83
|
+
if (attrs.attributes_hash != Qnil) {
|
84
|
+
attrs.attributes_hash_size = RHASH_SIZE(attrs.attributes_hash);
|
85
|
+
}
|
51
86
|
|
52
|
-
|
87
|
+
if (CLASS_OF(attrs.values) == fetch_ar_result_indexed_row_type()) {
|
88
|
+
volatile VALUE indexed_row_column_indexes =
|
89
|
+
rb_ivar_get(attrs.values, rb_intern("@column_indexes"));
|
53
90
|
|
54
|
-
|
91
|
+
volatile VALUE indexed_row_row =
|
92
|
+
rb_ivar_get(attrs.values, rb_intern("@row"));
|
55
93
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
volatile VALUE delegate_hash =
|
61
|
-
rb_ivar_get(attributes_container, delegate_hash_id);
|
94
|
+
attrs.indexed_row_column_indexes = indexed_row_column_indexes;
|
95
|
+
attrs.indexed_row_row = indexed_row_row;
|
96
|
+
attrs.is_indexed_row = true;
|
97
|
+
}
|
62
98
|
|
63
|
-
|
64
|
-
|
65
|
-
}
|
66
|
-
} else {
|
67
|
-
volatile VALUE attributes_hash =
|
68
|
-
rb_ivar_get(attributes_container, attributes_id);
|
99
|
+
return attrs;
|
100
|
+
}
|
69
101
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
}
|
102
|
+
VALUE _read_value_from_indexed_row(struct attributes attributes_ctx,
|
103
|
+
volatile VALUE member) {
|
104
|
+
volatile VALUE value = Qnil;
|
74
105
|
|
75
|
-
|
76
|
-
|
106
|
+
if (NIL_P(attributes_ctx.indexed_row_column_indexes) ||
|
107
|
+
NIL_P(attributes_ctx.indexed_row_row)) {
|
108
|
+
return value;
|
109
|
+
}
|
110
|
+
|
111
|
+
volatile VALUE column_index =
|
112
|
+
rb_hash_aref(attributes_ctx.indexed_row_column_indexes, member);
|
113
|
+
|
114
|
+
if (NIL_P(column_index)) {
|
115
|
+
return value;
|
116
|
+
}
|
77
117
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
PANKO_EMPTY_HASH(attributes_ctx.additional_types) == false;
|
118
|
+
volatile VALUE row = attributes_ctx.indexed_row_row;
|
119
|
+
if (NIL_P(row)) {
|
120
|
+
return value;
|
82
121
|
}
|
83
122
|
|
84
|
-
return
|
123
|
+
return RARRAY_AREF(row, NUM2INT(column_index));
|
85
124
|
}
|
86
125
|
|
87
126
|
VALUE read_attribute(struct attributes attributes_ctx, Attribute attribute,
|
@@ -91,7 +130,11 @@ VALUE read_attribute(struct attributes attributes_ctx, Attribute attribute,
|
|
91
130
|
member = attribute->name_str;
|
92
131
|
value = Qnil;
|
93
132
|
|
94
|
-
if (
|
133
|
+
if (
|
134
|
+
// we have attributes_hash
|
135
|
+
!NIL_P(attributes_ctx.attributes_hash)
|
136
|
+
// It's not empty
|
137
|
+
&& (attributes_ctx.attributes_hash_size > 0)) {
|
95
138
|
volatile VALUE attribute_metadata =
|
96
139
|
rb_hash_aref(attributes_ctx.attributes_hash, member);
|
97
140
|
|
@@ -105,7 +148,11 @@ VALUE read_attribute(struct attributes attributes_ctx, Attribute attribute,
|
|
105
148
|
}
|
106
149
|
|
107
150
|
if (NIL_P(value) && !NIL_P(attributes_ctx.values)) {
|
108
|
-
|
151
|
+
if (attributes_ctx.is_indexed_row == true) {
|
152
|
+
value = _read_value_from_indexed_row(attributes_ctx, member);
|
153
|
+
} else {
|
154
|
+
value = rb_hash_aref(attributes_ctx.values, member);
|
155
|
+
}
|
109
156
|
}
|
110
157
|
|
111
158
|
if (NIL_P(attribute->type) && !NIL_P(value)) {
|
@@ -125,31 +172,9 @@ VALUE read_attribute(struct attributes attributes_ctx, Attribute attribute,
|
|
125
172
|
return value;
|
126
173
|
}
|
127
174
|
|
128
|
-
VALUE detect_active_model_changes(VALUE v) {
|
129
|
-
if (type_detection_ran == true) {
|
130
|
-
return Qundef;
|
131
|
-
}
|
132
|
-
|
133
|
-
type_detection_ran = true;
|
134
|
-
|
135
|
-
volatile VALUE active_model_type =
|
136
|
-
rb_const_get_at(rb_cObject, rb_intern("ActiveModel"));
|
137
|
-
|
138
|
-
is_lazy_attributes_set_defined =
|
139
|
-
rb_const_defined(active_model_type, rb_intern("LazyAttributeSet")) > 0;
|
140
|
-
|
141
|
-
return Qundef;
|
142
|
-
}
|
143
|
-
|
144
175
|
void active_record_attributes_writer(VALUE obj, VALUE attributes,
|
145
176
|
EachAttributeFunc write_value,
|
146
177
|
VALUE writer) {
|
147
|
-
if (type_detection_ran == false) {
|
148
|
-
// If ActiveModel can't be found it will throw error
|
149
|
-
int isErrored;
|
150
|
-
rb_protect(detect_active_model_changes, Qnil, &isErrored);
|
151
|
-
}
|
152
|
-
|
153
178
|
long i;
|
154
179
|
struct attributes attributes_ctx = init_context(obj);
|
155
180
|
volatile VALUE record_class = CLASS_OF(obj);
|
@@ -174,4 +199,10 @@ void init_active_record_attributes_writer(VALUE mPanko) {
|
|
174
199
|
additional_types_id = rb_intern("@additional_types");
|
175
200
|
type_id = rb_intern("@type");
|
176
201
|
value_before_type_cast_id = rb_intern("@value_before_type_cast");
|
202
|
+
fetch_id = rb_intern("fetch");
|
177
203
|
}
|
204
|
+
|
205
|
+
void panko_init_active_record(VALUE mPanko) {
|
206
|
+
init_active_record_attributes_writer(mPanko);
|
207
|
+
panko_init_type_cast(mPanko);
|
208
|
+
}
|
@@ -24,7 +24,10 @@ static VALUE ar_pg_integer_type = Qundef;
|
|
24
24
|
static VALUE ar_pg_float_type = Qundef;
|
25
25
|
static VALUE ar_pg_uuid_type = Qundef;
|
26
26
|
static VALUE ar_pg_json_type = Qundef;
|
27
|
+
static VALUE ar_pg_jsonb_type = Qundef;
|
28
|
+
static VALUE ar_pg_array_type = Qundef;
|
27
29
|
static VALUE ar_pg_date_time_type = Qundef;
|
30
|
+
static VALUE ar_pg_timestamp_type = Qundef;
|
28
31
|
|
29
32
|
static int initiailized = 0;
|
30
33
|
|
@@ -63,10 +66,18 @@ VALUE cache_postgres_type_lookup(VALUE ar) {
|
|
63
66
|
ar_pg_json_type = rb_const_get_at(ar_oid, rb_intern("Json"));
|
64
67
|
}
|
65
68
|
|
69
|
+
if (rb_const_defined_at(ar_oid, rb_intern("Jsonb")) == (int)Qtrue) {
|
70
|
+
ar_pg_jsonb_type = rb_const_get_at(ar_oid, rb_intern("Jsonb"));
|
71
|
+
}
|
72
|
+
|
66
73
|
if (rb_const_defined_at(ar_oid, rb_intern("DateTime")) == (int)Qtrue) {
|
67
74
|
ar_pg_date_time_type = rb_const_get_at(ar_oid, rb_intern("DateTime"));
|
68
75
|
}
|
69
76
|
|
77
|
+
if (rb_const_defined_at(ar_oid, rb_intern("Timestamp")) == (int)Qtrue) {
|
78
|
+
ar_pg_timestamp_type = rb_const_get_at(ar_oid, rb_intern("Timestamp"));
|
79
|
+
}
|
80
|
+
|
70
81
|
return Qtrue;
|
71
82
|
}
|
72
83
|
|
@@ -210,6 +221,7 @@ VALUE cast_integer_type(VALUE value) {
|
|
210
221
|
|
211
222
|
bool is_json_type(VALUE type_klass) {
|
212
223
|
return ((ar_pg_json_type != Qundef && type_klass == ar_pg_json_type) ||
|
224
|
+
(ar_pg_jsonb_type != Qundef && type_klass == ar_pg_jsonb_type) ||
|
213
225
|
(ar_json_type != Qundef && type_klass == ar_json_type));
|
214
226
|
}
|
215
227
|
|
@@ -250,6 +262,8 @@ bool is_date_time_type(VALUE type_klass) {
|
|
250
262
|
return (type_klass == ar_date_time_type) ||
|
251
263
|
(ar_pg_date_time_type != Qundef &&
|
252
264
|
type_klass == ar_pg_date_time_type) ||
|
265
|
+
(ar_pg_timestamp_type != Qundef &&
|
266
|
+
type_klass == ar_pg_timestamp_type) ||
|
253
267
|
(ar_time_zone_converter != Qundef &&
|
254
268
|
type_klass == ar_time_zone_converter);
|
255
269
|
}
|
@@ -377,5 +391,8 @@ void panko_init_type_cast(VALUE mPanko) {
|
|
377
391
|
rb_global_variable(&ar_pg_float_type);
|
378
392
|
rb_global_variable(&ar_pg_uuid_type);
|
379
393
|
rb_global_variable(&ar_pg_json_type);
|
394
|
+
rb_global_variable(&ar_pg_jsonb_type);
|
395
|
+
rb_global_variable(&ar_pg_array_type);
|
380
396
|
rb_global_variable(&ar_pg_date_time_type);
|
397
|
+
rb_global_variable(&ar_pg_timestamp_type);
|
381
398
|
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# This file was generated by Appraisal
|
2
|
+
|
3
|
+
source "https://rubygems.org"
|
4
|
+
|
5
|
+
gem "sqlite3", "~> 1.4"
|
6
|
+
gem "activesupport", "~> 7.0.0"
|
7
|
+
gem "activemodel", "~> 7.0.0"
|
8
|
+
gem "activerecord", "~> 7.0.0", group: :test
|
9
|
+
|
10
|
+
group :benchmarks do
|
11
|
+
gem "vernier"
|
12
|
+
gem "stackprof"
|
13
|
+
gem "pg"
|
14
|
+
gem "benchmark-ips"
|
15
|
+
gem "active_model_serializers", "~> 0.10"
|
16
|
+
gem "terminal-table"
|
17
|
+
gem "memory_profiler"
|
18
|
+
end
|
19
|
+
|
20
|
+
group :test do
|
21
|
+
gem "faker"
|
22
|
+
end
|
23
|
+
|
24
|
+
group :development do
|
25
|
+
gem "byebug"
|
26
|
+
gem "rake"
|
27
|
+
gem "rspec", "~> 3.0"
|
28
|
+
gem "rake-compiler"
|
29
|
+
end
|
30
|
+
|
31
|
+
group :development, :test do
|
32
|
+
gem "rubocop"
|
33
|
+
gem "standard"
|
34
|
+
gem "standard-performance"
|
35
|
+
gem "rubocop-performance"
|
36
|
+
gem "rubocop-rspec"
|
37
|
+
end
|
38
|
+
|
39
|
+
gemspec path: "../"
|
@@ -0,0 +1,176 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ..
|
3
|
+
specs:
|
4
|
+
panko_serializer (0.8.3)
|
5
|
+
activesupport
|
6
|
+
oj (> 3.11.0, < 4.0.0)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
actionpack (7.0.8.5)
|
12
|
+
actionview (= 7.0.8.5)
|
13
|
+
activesupport (= 7.0.8.5)
|
14
|
+
rack (~> 2.0, >= 2.2.4)
|
15
|
+
rack-test (>= 0.6.3)
|
16
|
+
rails-dom-testing (~> 2.0)
|
17
|
+
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
18
|
+
actionview (7.0.8.5)
|
19
|
+
activesupport (= 7.0.8.5)
|
20
|
+
builder (~> 3.1)
|
21
|
+
erubi (~> 1.4)
|
22
|
+
rails-dom-testing (~> 2.0)
|
23
|
+
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
24
|
+
active_model_serializers (0.10.14)
|
25
|
+
actionpack (>= 4.1)
|
26
|
+
activemodel (>= 4.1)
|
27
|
+
case_transform (>= 0.2)
|
28
|
+
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
|
29
|
+
activemodel (7.0.8.5)
|
30
|
+
activesupport (= 7.0.8.5)
|
31
|
+
activerecord (7.0.8.5)
|
32
|
+
activemodel (= 7.0.8.5)
|
33
|
+
activesupport (= 7.0.8.5)
|
34
|
+
activesupport (7.0.8.5)
|
35
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
36
|
+
i18n (>= 1.6, < 2)
|
37
|
+
minitest (>= 5.1)
|
38
|
+
tzinfo (~> 2.0)
|
39
|
+
appraisal (2.5.0)
|
40
|
+
bundler
|
41
|
+
rake
|
42
|
+
thor (>= 0.14.0)
|
43
|
+
ast (2.4.2)
|
44
|
+
benchmark-ips (2.14.0)
|
45
|
+
bigdecimal (3.1.8)
|
46
|
+
builder (3.3.0)
|
47
|
+
byebug (11.1.3)
|
48
|
+
case_transform (0.2)
|
49
|
+
activesupport
|
50
|
+
concurrent-ruby (1.3.4)
|
51
|
+
crass (1.0.6)
|
52
|
+
diff-lcs (1.5.1)
|
53
|
+
erubi (1.13.0)
|
54
|
+
faker (3.5.1)
|
55
|
+
i18n (>= 1.8.11, < 2)
|
56
|
+
i18n (1.14.6)
|
57
|
+
concurrent-ruby (~> 1.0)
|
58
|
+
json (2.7.5)
|
59
|
+
jsonapi-renderer (0.2.2)
|
60
|
+
language_server-protocol (3.17.0.3)
|
61
|
+
lint_roller (1.1.0)
|
62
|
+
loofah (2.22.0)
|
63
|
+
crass (~> 1.0.2)
|
64
|
+
nokogiri (>= 1.12.0)
|
65
|
+
memory_profiler (1.1.0)
|
66
|
+
minitest (5.25.4)
|
67
|
+
nokogiri (1.16.7-arm64-darwin)
|
68
|
+
racc (~> 1.4)
|
69
|
+
oj (3.16.7)
|
70
|
+
bigdecimal (>= 3.0)
|
71
|
+
ostruct (>= 0.2)
|
72
|
+
ostruct (0.6.0)
|
73
|
+
parallel (1.26.3)
|
74
|
+
parser (3.3.5.1)
|
75
|
+
ast (~> 2.4.1)
|
76
|
+
racc
|
77
|
+
pg (1.5.9)
|
78
|
+
racc (1.8.1)
|
79
|
+
rack (2.2.10)
|
80
|
+
rack-test (2.1.0)
|
81
|
+
rack (>= 1.3)
|
82
|
+
rails-dom-testing (2.2.0)
|
83
|
+
activesupport (>= 5.0.0)
|
84
|
+
minitest
|
85
|
+
nokogiri (>= 1.6)
|
86
|
+
rails-html-sanitizer (1.6.0)
|
87
|
+
loofah (~> 2.21)
|
88
|
+
nokogiri (~> 1.14)
|
89
|
+
rainbow (3.1.1)
|
90
|
+
rake (13.2.1)
|
91
|
+
rake-compiler (1.2.8)
|
92
|
+
rake
|
93
|
+
regexp_parser (2.9.2)
|
94
|
+
rspec (3.13.0)
|
95
|
+
rspec-core (~> 3.13.0)
|
96
|
+
rspec-expectations (~> 3.13.0)
|
97
|
+
rspec-mocks (~> 3.13.0)
|
98
|
+
rspec-core (3.13.2)
|
99
|
+
rspec-support (~> 3.13.0)
|
100
|
+
rspec-expectations (3.13.3)
|
101
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
102
|
+
rspec-support (~> 3.13.0)
|
103
|
+
rspec-mocks (3.13.2)
|
104
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
105
|
+
rspec-support (~> 3.13.0)
|
106
|
+
rspec-support (3.13.1)
|
107
|
+
rubocop (1.66.1)
|
108
|
+
json (~> 2.3)
|
109
|
+
language_server-protocol (>= 3.17.0)
|
110
|
+
parallel (~> 1.10)
|
111
|
+
parser (>= 3.3.0.2)
|
112
|
+
rainbow (>= 2.2.2, < 4.0)
|
113
|
+
regexp_parser (>= 2.4, < 3.0)
|
114
|
+
rubocop-ast (>= 1.32.2, < 2.0)
|
115
|
+
ruby-progressbar (~> 1.7)
|
116
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
117
|
+
rubocop-ast (1.33.0)
|
118
|
+
parser (>= 3.3.1.0)
|
119
|
+
rubocop-performance (1.22.1)
|
120
|
+
rubocop (>= 1.48.1, < 2.0)
|
121
|
+
rubocop-ast (>= 1.31.1, < 2.0)
|
122
|
+
rubocop-rspec (3.2.0)
|
123
|
+
rubocop (~> 1.61)
|
124
|
+
ruby-progressbar (1.13.0)
|
125
|
+
sqlite3 (1.7.3-arm64-darwin)
|
126
|
+
stackprof (0.2.26)
|
127
|
+
standard (1.41.1)
|
128
|
+
language_server-protocol (~> 3.17.0.2)
|
129
|
+
lint_roller (~> 1.0)
|
130
|
+
rubocop (~> 1.66.0)
|
131
|
+
standard-custom (~> 1.0.0)
|
132
|
+
standard-performance (~> 1.5)
|
133
|
+
standard-custom (1.0.2)
|
134
|
+
lint_roller (~> 1.0)
|
135
|
+
rubocop (~> 1.50)
|
136
|
+
standard-performance (1.5.0)
|
137
|
+
lint_roller (~> 1.1)
|
138
|
+
rubocop-performance (~> 1.22.0)
|
139
|
+
terminal-table (3.0.2)
|
140
|
+
unicode-display_width (>= 1.1.1, < 3)
|
141
|
+
thor (1.3.2)
|
142
|
+
tzinfo (2.0.6)
|
143
|
+
concurrent-ruby (~> 1.0)
|
144
|
+
unicode-display_width (2.6.0)
|
145
|
+
vernier (1.3.0)
|
146
|
+
|
147
|
+
PLATFORMS
|
148
|
+
arm64-darwin-23
|
149
|
+
|
150
|
+
DEPENDENCIES
|
151
|
+
active_model_serializers (~> 0.10)
|
152
|
+
activemodel (~> 7.0.0)
|
153
|
+
activerecord (~> 7.0.0)
|
154
|
+
activesupport (~> 7.0.0)
|
155
|
+
appraisal
|
156
|
+
benchmark-ips
|
157
|
+
byebug
|
158
|
+
faker
|
159
|
+
memory_profiler
|
160
|
+
panko_serializer!
|
161
|
+
pg
|
162
|
+
rake
|
163
|
+
rake-compiler
|
164
|
+
rspec (~> 3.0)
|
165
|
+
rubocop
|
166
|
+
rubocop-performance
|
167
|
+
rubocop-rspec
|
168
|
+
sqlite3 (~> 1.4)
|
169
|
+
stackprof
|
170
|
+
standard
|
171
|
+
standard-performance
|
172
|
+
terminal-table
|
173
|
+
vernier
|
174
|
+
|
175
|
+
BUNDLED WITH
|
176
|
+
2.4.6
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# This file was generated by Appraisal
|
2
|
+
|
3
|
+
source "https://rubygems.org"
|
4
|
+
|
5
|
+
gem "sqlite3", "~> 1.4"
|
6
|
+
gem "activesupport", "~> 7.1.5"
|
7
|
+
gem "activemodel", "~> 7.1.5"
|
8
|
+
gem "activerecord", "~> 7.1.5", group: :test
|
9
|
+
|
10
|
+
group :benchmarks do
|
11
|
+
gem "vernier"
|
12
|
+
gem "stackprof"
|
13
|
+
gem "pg"
|
14
|
+
gem "benchmark-ips"
|
15
|
+
gem "active_model_serializers", "~> 0.10"
|
16
|
+
gem "terminal-table"
|
17
|
+
gem "memory_profiler"
|
18
|
+
end
|
19
|
+
|
20
|
+
group :test do
|
21
|
+
gem "faker"
|
22
|
+
end
|
23
|
+
|
24
|
+
group :development do
|
25
|
+
gem "byebug"
|
26
|
+
gem "rake"
|
27
|
+
gem "rspec", "~> 3.0"
|
28
|
+
gem "rake-compiler"
|
29
|
+
end
|
30
|
+
|
31
|
+
group :development, :test do
|
32
|
+
gem "rubocop"
|
33
|
+
gem "standard"
|
34
|
+
gem "standard-performance"
|
35
|
+
gem "rubocop-performance"
|
36
|
+
gem "rubocop-rspec"
|
37
|
+
end
|
38
|
+
|
39
|
+
gemspec path: "../"
|