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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +6 -0
  3. data/.github/workflows/docs.yml +6 -6
  4. data/.github/workflows/lint.yml +9 -19
  5. data/.github/workflows/ruby.yml +14 -10
  6. data/.gitignore +2 -0
  7. data/.rubocop.yml +29 -21
  8. data/Appraisals +29 -0
  9. data/Gemfile +12 -14
  10. data/README.md +6 -7
  11. data/Rakefile +3 -1
  12. data/benchmarks/allocs.rb +2 -2
  13. data/benchmarks/benchmarking_support.rb +2 -1
  14. data/benchmarks/bm_ams_0_10.rb +3 -7
  15. data/benchmarks/bm_panko_json.rb +2 -6
  16. data/benchmarks/bm_panko_object.rb +2 -6
  17. data/benchmarks/bm_plain_object.rb +1 -4
  18. data/benchmarks/bm_serialization_descriptor.rb +1 -1
  19. data/benchmarks/bm_to_object.rb +2 -6
  20. data/benchmarks/profile.rb +2 -2
  21. data/benchmarks/sanity.rb +2 -6
  22. data/benchmarks/setup.rb +4 -3
  23. data/benchmarks/type_casts/bm_active_record.rb +10 -39
  24. data/benchmarks/type_casts/bm_panko.rb +3 -6
  25. data/benchmarks/type_casts/support.rb +0 -1
  26. data/docs/docs/associations.md +20 -7
  27. data/docs/docs/attributes.md +29 -23
  28. data/docs/docs/design-choices.md +28 -27
  29. data/docs/docs/getting-started.md +9 -3
  30. data/docs/docs/introduction.md +5 -5
  31. data/docs/docs/performance.md +0 -1
  32. data/docs/docs/response-bag.md +8 -1
  33. data/docs/docusaurus.config.js +86 -0
  34. data/docs/package-lock.json +12607 -18674
  35. data/docs/package.json +14 -7
  36. data/docs/src/css/customTheme.css +9 -0
  37. data/docs/static/CNAME +1 -0
  38. data/ext/panko_serializer/attributes_writer/active_record.c +103 -72
  39. data/ext/panko_serializer/attributes_writer/active_record.h +2 -0
  40. data/ext/panko_serializer/attributes_writer/type_cast/type_cast.c +17 -0
  41. data/gemfiles/7.0.0.gemfile +39 -0
  42. data/gemfiles/7.0.0.gemfile.lock +176 -0
  43. data/gemfiles/7.1.0.gemfile +39 -0
  44. data/gemfiles/7.1.0.gemfile.lock +198 -0
  45. data/gemfiles/7.2.0.gemfile +39 -0
  46. data/gemfiles/7.2.0.gemfile.lock +198 -0
  47. data/gemfiles/8.0.0.gemfile +39 -0
  48. data/gemfiles/8.0.0.gemfile.lock +219 -0
  49. data/lib/panko/serializer.rb +1 -1
  50. data/lib/panko/version.rb +1 -1
  51. data/panko_serializer.gemspec +2 -1
  52. metadata +31 -10
  53. data/.standard.yml +0 -4
  54. data/docs/.DS_Store +0 -0
  55. data/docs/README.md +0 -198
  56. data/docs/core/Footer.js +0 -80
  57. data/docs/i18n/en.json +0 -50
  58. 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-start",
5
- "build": "docusaurus-build",
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
- "docusaurus": "^1.14.7"
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 bool type_detection_ran = false;
13
- static bool is_lazy_attributes_set_defined = false;
14
-
15
- /***
16
- * Returns ActiveModel::LazyAttributeSet or ActiveModel::LazyAttributesHash
17
- */
18
- VALUE panko_read_attributes_container(VALUE object) {
19
- volatile VALUE attributes_set, lazy_attributes_hash;
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
- if (is_lazy_attributes_set_defined) {
27
- return attributes_set;
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
- lazy_attributes_hash = rb_ivar_get(attributes_set, attributes_id);
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
- // heuristicts
42
- bool tryToReadFromAdditionalTypes;
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
- struct attributes attributes_ctx;
47
- attributes_ctx.attributes_hash = Qnil;
48
- attributes_ctx.values = Qnil;
49
- attributes_ctx.types = Qnil;
50
- attributes_ctx.additional_types = Qnil;
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
- attributes_ctx.tryToReadFromAdditionalTypes = false;
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
- volatile VALUE attributes_container = panko_read_attributes_container(obj);
91
+ volatile VALUE indexed_row_row =
92
+ rb_ivar_get(attrs.values, rb_intern("@row"));
55
93
 
56
- if (RB_TYPE_P(attributes_container, T_HASH)) {
57
- attributes_ctx.attributes_hash = attributes_container;
58
- } else {
59
- if (is_lazy_attributes_set_defined == false) {
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
- if (PANKO_EMPTY_HASH(delegate_hash) == false) {
64
- attributes_ctx.attributes_hash = delegate_hash;
65
- }
66
- } else {
67
- volatile VALUE attributes_hash =
68
- rb_ivar_get(attributes_container, attributes_id);
99
+ return attrs;
100
+ }
69
101
 
70
- if (PANKO_EMPTY_HASH(attributes_hash) == false) {
71
- attributes_ctx.attributes_hash = attributes_hash;
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
- attributes_ctx.types = rb_ivar_get(attributes_container, types_id);
76
- attributes_ctx.values = rb_ivar_get(attributes_container, values_id);
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
- attributes_ctx.additional_types =
79
- rb_ivar_get(attributes_container, additional_types_id);
80
- attributes_ctx.tryToReadFromAdditionalTypes =
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 attributes_ctx;
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 (!NIL_P(attributes_ctx.attributes_hash)) {
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
- value = rb_hash_aref(attributes_ctx.values, member);
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
+ }
@@ -13,3 +13,5 @@ extern void active_record_attributes_writer(VALUE object, VALUE attributes,
13
13
  VALUE writer);
14
14
 
15
15
  void init_active_record_attributes_writer(VALUE mPanko);
16
+
17
+ void panko_init_active_record(VALUE mPanko);
@@ -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: "../"