rails-fields 0.1.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +58 -11
- data/lib/{rails_fields.rb → rails-fields.rb} +12 -7
- data/lib/rails_fields/enforce_fields_middleware.rb +18 -0
- data/lib/rails_fields/railtie.rb +22 -0
- data/lib/rails_fields/version.rb +1 -1
- metadata +85 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 602330976f090420f2e4dc7ac7ce1fd5c897cf62c99f17a86bd3dbee88809b50
|
4
|
+
data.tar.gz: e2310c47d667f4d9199e7e0db893329d0eb75aaf257fe9579f31151b7e510be8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f186efcfac13495e229a308d088ea15698339cdec3be93d411504946514b4d618600947dc8182ee24048eb85c617878dee7115f2b7d88742a52334a8190c095
|
7
|
+
data.tar.gz: 893c54f91c6fe94601dd0ab278b5eb00e97946e4df03147f7ebfa8837c12be090f6ab4c18a735395e983b2d430617bfa05f7862521148afb52531299b087485e
|
data/README.md
CHANGED
@@ -1,34 +1,81 @@
|
|
1
|
+
<p align="center">
|
2
|
+
<a href="https://rails-fields.dev" target="_blank"><img src="./assets/logo.svg" width="300" /></a>
|
3
|
+
</p>
|
4
|
+
|
5
|
+
[![Gem Version](https://badge.fury.io/rb/rails-fields.svg)](https://badge.fury.io/rb/rails-fields)
|
6
|
+
|
1
7
|
# Rails Fields
|
2
8
|
|
3
|
-
## Summary
|
4
9
|
Enforce field types and attributes for ActiveRecord models in Ruby on Rails applications.
|
5
10
|
|
11
|
+
- 🚀 Auto-magic ActiveRecord **Migrations** generation
|
12
|
+
- 🦄 Automatic [GraphQL types](https://graphql-ruby.org/type_definitions/objects.html) generation
|
13
|
+
- 📝 Explicit **declarative** model attributes annotation
|
14
|
+
- 💪🏻 Enforcement of fields declaration with real db columns
|
15
|
+
- 📜 Automatic YARD model documentation
|
16
|
+
|
6
17
|
## Description
|
7
18
|
The `rails-fields` gem provides robust field type enforcement for ActiveRecord models in Ruby on Rails applications. It includes utility methods for type validation, logging, and field mappings between GraphQL and ActiveRecord types. Custom error classes provide clear diagnostics for field-related issues, making it easier to maintain consistent data models.
|
8
19
|
|
9
|
-
##
|
20
|
+
## Usage
|
10
21
|
|
11
|
-
|
22
|
+
In your ActiveRecord models:
|
12
23
|
|
13
24
|
```ruby
|
14
|
-
|
25
|
+
class User < ApplicationRecord
|
26
|
+
field :id, :integer
|
27
|
+
field :created_at, :datetime
|
28
|
+
field :updated_at, :datetime
|
29
|
+
|
30
|
+
field :first_name, :string
|
31
|
+
field :country, :string
|
32
|
+
field :welcome, :string
|
33
|
+
|
34
|
+
has_many :todos
|
35
|
+
|
36
|
+
def welcome
|
37
|
+
"Welcome #{first_name}!"
|
38
|
+
end
|
39
|
+
end
|
15
40
|
```
|
16
41
|
|
17
|
-
|
42
|
+
Autogenerate GraphQL types using `#gql_type` class method:
|
18
43
|
|
19
|
-
```
|
20
|
-
|
44
|
+
```ruby
|
45
|
+
module Types
|
46
|
+
class QueryType < Types::BaseObject
|
47
|
+
|
48
|
+
field :users, [User.gql_type], null: true
|
49
|
+
|
50
|
+
def users
|
51
|
+
User.all
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
21
56
|
```
|
22
57
|
|
23
|
-
|
58
|
+
## Installation
|
24
59
|
|
60
|
+
Add this line to your application's Gemfile:
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
gem 'rails-fields'
|
25
64
|
```
|
26
|
-
|
65
|
+
|
66
|
+
If you want to have graphql types generated for your models, add this line to your application's Gemfile:
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
gem 'graphql'
|
27
70
|
```
|
28
71
|
|
29
|
-
|
72
|
+
*Don't forget to install it `$ ./bin/rails generate graphql:install`*
|
73
|
+
|
74
|
+
And then execute:
|
30
75
|
|
31
|
-
|
76
|
+
```bash
|
77
|
+
$ bundle install
|
78
|
+
```
|
32
79
|
|
33
80
|
## License
|
34
81
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require "rails_fields/railtie"
|
1
2
|
require "rails_fields/errors/rails_fields_error"
|
2
3
|
require "rails_fields/errors/rails_fields_mismatch_error"
|
3
4
|
require "rails_fields/errors/rails_fields_unknown_type_error"
|
@@ -6,9 +7,13 @@ require "rails_fields/utils/mappings"
|
|
6
7
|
require "rails_fields/utils/helpers"
|
7
8
|
require "rails_fields/class_methods"
|
8
9
|
require "rails_fields/instance_methods"
|
10
|
+
require "rails_fields/enforce_fields_middleware"
|
11
|
+
|
12
|
+
Rails.logger.debug "RailsFields file root"
|
9
13
|
|
10
14
|
# Provides enforcement of declared field for ActiveRecord models.
|
11
15
|
module RailsFields
|
16
|
+
Rails.logger.debug "RailsFields module"
|
12
17
|
@processed_classes = {}
|
13
18
|
|
14
19
|
def self.processed_classes
|
@@ -16,11 +21,11 @@ module RailsFields
|
|
16
21
|
end
|
17
22
|
|
18
23
|
# @param base [ActiveRecord::Base] the model to include the module in
|
19
|
-
def self.included(base)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
24
|
+
# def self.included(base)
|
25
|
+
# # base.extend(ClassMethods)
|
26
|
+
# # todo: raise if class methods not found
|
27
|
+
# # base.after_initialize do
|
28
|
+
# # self.class.enforce_declared_fields
|
29
|
+
# # end
|
30
|
+
# end
|
26
31
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Rails.logger.debug "RailsFields::EnforceFieldsMiddleware"
|
2
|
+
|
3
|
+
module RailsFields
|
4
|
+
class EnforceFieldsMiddleware
|
5
|
+
def initialize(app)
|
6
|
+
@app = app
|
7
|
+
Rails.logger.debug "RailsFields::EnforceFieldsMiddleware initialize"
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
Rails.logger.debug "RailsFields::EnforceFieldsMiddleware call"
|
12
|
+
ApplicationRecord.descendants.each do |model|
|
13
|
+
model.enforce_declared_fields # if model.respond_to?(:enforce_declared_fields)
|
14
|
+
end
|
15
|
+
@app.call(env)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "active_support"
|
2
|
+
require "active_support/rails"
|
3
|
+
require "rails_fields/enforce_fields_middleware"
|
4
|
+
|
5
|
+
Rails.logger.debug "RailsFields::Railtie"
|
6
|
+
|
7
|
+
module RailsFields
|
8
|
+
class Railtie < Rails::Railtie
|
9
|
+
# config.eager_load_namespaces << RailsFields
|
10
|
+
|
11
|
+
initializer "rails_fields.initialize" do
|
12
|
+
ActiveSupport.on_load(:active_record) do
|
13
|
+
extend RailsFields::ClassMethods
|
14
|
+
include RailsFields
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
initializer "rails_fields.middleware" do |app|
|
19
|
+
app.middleware.insert_before ActiveRecord::Migration::CheckPending, RailsFields::EnforceFieldsMiddleware
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/rails_fields/version.rb
CHANGED
metadata
CHANGED
@@ -1,20 +1,89 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-fields
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gaston Morixe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-08-
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
11
|
+
date: 2023-08-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: graphql
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: yard
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: jekyll
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: webrick
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: |2
|
84
|
+
rails-fields gem provides robust field type enforcement for ActiveRecord models in Ruby on Rails applications.
|
85
|
+
It includes utility methods for type validation, logging, and field mappings between GraphQL and ActiveRecord types
|
86
|
+
Custom error classes provide clear diagnostics for field-related issues, making it easier to maintain consistent data models.
|
18
87
|
email:
|
19
88
|
- gaston@gastonmorixe.com
|
20
89
|
executables: []
|
@@ -22,12 +91,14 @@ extensions: []
|
|
22
91
|
extra_rdoc_files: []
|
23
92
|
files:
|
24
93
|
- README.md
|
25
|
-
- lib/
|
94
|
+
- lib/rails-fields.rb
|
26
95
|
- lib/rails_fields/class_methods.rb
|
96
|
+
- lib/rails_fields/enforce_fields_middleware.rb
|
27
97
|
- lib/rails_fields/errors/rails_fields_error.rb
|
28
98
|
- lib/rails_fields/errors/rails_fields_mismatch_error.rb
|
29
99
|
- lib/rails_fields/errors/rails_fields_unknown_type_error.rb
|
30
100
|
- lib/rails_fields/instance_methods.rb
|
101
|
+
- lib/rails_fields/railtie.rb
|
31
102
|
- lib/rails_fields/utils/helpers.rb
|
32
103
|
- lib/rails_fields/utils/logging.rb
|
33
104
|
- lib/rails_fields/utils/mappings.rb
|
@@ -35,7 +106,10 @@ files:
|
|
35
106
|
homepage: https://github.com/gastonmorixe/rails-fields
|
36
107
|
licenses:
|
37
108
|
- MIT
|
38
|
-
metadata:
|
109
|
+
metadata:
|
110
|
+
homepage_uri: https://rails-fields.dev
|
111
|
+
source_code_uri: https://github.com/gastonmorixe/rails-fields
|
112
|
+
bug_tracker_uri: https://github.com/gastonmorixe/rails-fields/issues
|
39
113
|
post_install_message:
|
40
114
|
rdoc_options: []
|
41
115
|
require_paths:
|
@@ -44,7 +118,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
44
118
|
requirements:
|
45
119
|
- - ">="
|
46
120
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
121
|
+
version: '2.7'
|
48
122
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
123
|
requirements:
|
50
124
|
- - ">="
|