active_form_model 0.3.0 → 0.5.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e6f0169a331b87482d384004270960ba223bea6c9155f1f90c81ff62263f635a
4
- data.tar.gz: 9941258627c2434915e1e009fcb0f0636490ffff31d88dff22bc1925fa069b47
3
+ metadata.gz: de72c984ffa5024c2d6a9fc463f1b5172fab8fd277ac2b4d0e63ecab4cac0fb0
4
+ data.tar.gz: 447721a252e308d83e003cbe6eeba66b1962887519b1e0d2b1d965d07e10b24a
5
5
  SHA512:
6
- metadata.gz: 4259f13547d8b20608b99678863b885605f9b028cab61f0c18ef7317ae43dd5f29ad8664d4a18c55880451b63ffe2fcc0ef16901553ee604975197abc84338f7
7
- data.tar.gz: 2dd3e719e35c7480611d48f1e77ad3582f7fb2612dd2b0f5c525153559d863e36b55f974e459330c0e63cddea7d7f580b36db455da0bc83e4f41d2694a3e2aa6
6
+ metadata.gz: a01bb1ed3a10f455cbdaa366fc9cd1d23c41fc57650efe10b57817369f5d476eabe26e82ba8add31ed754fb9f77ddf396fe523f40c9acc45709c750139c1c276
7
+ data.tar.gz: 38bdf5f2dc51c249c04d41fb0fbb7c57d008c4a745dd5c783e0be54188ea68ce7d8893480d9f148f1eee2f9c457381586b1939f39bd0fb8b56a4ebf71146f0e5
@@ -0,0 +1,19 @@
1
+ name: main
2
+ on: [push, pull_request]
3
+ jobs:
4
+ test:
5
+ strategy:
6
+ fail-fast: true
7
+ matrix:
8
+ os: [ubuntu-latest, macos-latest]
9
+ # Due to https://github.com/actions/runner/issues/849, we have to use quotes for '3.0'
10
+ ruby: [2.7, '3.0', head]
11
+ runs-on: ${{ matrix.os }}
12
+ steps:
13
+ - uses: actions/checkout@v2
14
+ - uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: ${{ matrix.ruby }}
17
+ bundler-cache: true
18
+ - name: run test
19
+ run: make test
data/.rubocop.yml ADDED
@@ -0,0 +1,21 @@
1
+ # The behavior of RuboCop can be controlled via the .rubocop.yml
2
+ # configuration file. It makes it possible to enable/disable
3
+ # certain cops (checks) and to alter their behavior if they accept
4
+ # any parameters. The file can be placed either in your home
5
+ # directory or in some project directory.
6
+ #
7
+ # RuboCop will start looking for the configuration file in the directory
8
+ # where the inspected file is and continue its way up to the root directory.
9
+ #
10
+ # See https://docs.rubocop.org/rubocop/configuration
11
+ require:
12
+ - rubocop-minitest
13
+ - rubocop-rake
14
+
15
+ AllCops:
16
+ NewCops: enable
17
+ Exclude:
18
+ - 'lib/generators/**/*.rb'
19
+
20
+ Style/Documentation:
21
+ Enabled: false
data/Gemfile CHANGED
@@ -1,7 +1,20 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in active_form_model.gemspec
4
6
  gemspec
5
7
 
6
- gem "rake", "~> 12.0"
7
- gem "minitest", "~> 5.0"
8
+ gem 'minitest'
9
+
10
+ gem 'rake'
11
+
12
+ gem 'rubocop'
13
+
14
+ gem 'actionpack'
15
+ gem 'activemodel'
16
+ gem 'activerecord'
17
+ gem 'minitest-power_assert'
18
+ gem 'rubocop-minitest'
19
+ gem 'rubocop-rake'
20
+ gem 'sqlite3', '~> 1.7'
data/Makefile CHANGED
@@ -7,6 +7,9 @@ console:
7
7
  test:
8
8
  bundle exec rake test
9
9
 
10
+ lint:
11
+ bundle exec rubocop -A
12
+
10
13
  release:
11
14
  bundle exec rake release
12
15
 
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # ActiveFormModel
2
2
 
3
+ [![github action status](https://github.com/Hexlet/active_form_model/workflows/main/badge.svg)](https://actions-badge.atrox.dev/hexlet/hexlet-cv/goto)
4
+
3
5
  Painless forms for ActiveRecord. Based on Inheritance. Included:
4
6
 
5
7
  * Strong parameters
@@ -64,13 +66,45 @@ class UserSignUpForm < User
64
66
  end
65
67
  ```
66
68
 
67
- In some cases it is necessary to use ActiveRecord object directly without form. For such cases conveniently to use method `become()` (built-in ActiveRecord):
69
+ In some cases it is necessary to use ActiveRecord object directly without form. For such cases conveniently to use method `becomes()` (built-in ActiveRecord):
68
70
 
69
71
  ```ruby
70
72
  user = User.find(params[:id])
71
73
  form = user.becomes(UserSignUpForm)
72
74
  ```
73
75
 
76
+ If you want to build virtual form that is not tied to any class:
77
+
78
+ ```ruby
79
+ # frozen_string_literal: true
80
+
81
+ class SignInForm
82
+ include ActiveFormModel::Virtual
83
+
84
+ fields :email, :password
85
+
86
+ validates :email, presence: true
87
+ validates :password, presence: true
88
+ validate :user_exists, :user_can_sign_in
89
+
90
+ def user_can_sign_in
91
+ errors.add(:password, :cannot_sign_in) if password.present? && !user&.valid_password?(password)
92
+ end
93
+
94
+ def user_exists
95
+ errors.add(:email, :user_does_not_exist_html) if email.present? && !user
96
+ end
97
+
98
+ def user
99
+ @user ||= User.find_by(email: email)
100
+ end
101
+
102
+ def email=(value)
103
+ @email = value.downcase
104
+ end
105
+ end
106
+ ```
107
+
74
108
  ## Development
75
109
 
76
110
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/Rakefile CHANGED
@@ -1,10 +1,12 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rake/testtask'
3
5
 
4
6
  Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
7
- t.test_files = FileList["test/**/*_test.rb"]
7
+ t.libs << 'test'
8
+ t.libs << 'lib'
9
+ t.test_files = FileList['test/**/*_test.rb']
8
10
  end
9
11
 
10
- task :default => :test
12
+ task default: :test
@@ -1,34 +1,34 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'lib/active_form_model/version'
2
4
 
3
5
  Gem::Specification.new do |spec|
4
- spec.name = "active_form_model"
6
+ spec.name = 'active_form_model'
5
7
  spec.version = ActiveFormModel::VERSION
6
- spec.authors = ["Kirill"]
7
- spec.email = ["mokevnin@gmail.com"]
8
+ spec.authors = ['Kirill']
9
+ spec.email = ['mokevnin@gmail.com']
8
10
 
9
- spec.summary = %q{Painless forms for ActiveRecord}
10
- spec.description = %q{Based on inheritance}
11
- spec.homepage = "https://github.com/Hexlet/active_form_model"
12
- spec.license = "MIT"
13
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
11
+ spec.summary = 'Painless forms for ActiveRecord'
12
+ spec.description = 'Based on inheritance'
13
+ spec.homepage = 'https://github.com/Hexlet/active_form_model'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = Gem::Requirement.new('>= 3.0.0')
14
16
 
15
17
  # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
16
18
 
17
- spec.metadata["homepage_uri"] = spec.homepage
18
- spec.metadata["source_code_uri"] = "https://github.com/Hexlet/form-model.git"
19
+ spec.metadata['homepage_uri'] = spec.homepage
20
+ spec.metadata['source_code_uri'] = 'https://github.com/Hexlet/form-model.git'
21
+ spec.metadata['rubygems_mfa_required'] = 'true'
19
22
  # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
20
23
 
21
24
  # Specify which files should be added to the gem when it is released.
22
25
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
26
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
24
27
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
28
  end
26
- spec.bindir = "exe"
29
+ spec.bindir = 'exe'
27
30
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
- spec.require_paths = ["lib"]
29
-
30
- spec.add_dependency("activesupport", ">= 3")
31
+ spec.require_paths = ['lib']
31
32
 
32
- spec.add_development_dependency("activemodel", ">= 5")
33
- spec.add_development_dependency("actionpack", ">= 5")
33
+ spec.add_dependency('activesupport', '>= 3')
34
34
  end
data/bin/console CHANGED
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require "bundler/setup"
4
- require "active_form_model"
4
+ require 'bundler/setup'
5
+ require 'active_form_model'
5
6
 
6
7
  # You can add fixtures and/or initialization code here to make experimenting
7
8
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +11,5 @@ require "active_form_model"
10
11
  # require "pry"
11
12
  # Pry.start
12
13
 
13
- require "irb"
14
+ require 'irb'
14
15
  IRB.start(__FILE__)
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/deprecation'
4
+ require 'active_support/core_ext/class/attribute'
5
+
6
+ module ActiveFormModel
7
+ module Permittable
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ class_attribute(:_permitted_args, instance_predicate: false, default: [])
12
+ end
13
+
14
+ class_methods do
15
+ def new(attrs = nil, &block)
16
+ attrs = _permit_attrs(attrs) if attrs
17
+
18
+ super
19
+ end
20
+
21
+ def permit(*args)
22
+ self._permitted_args = _permitted_args | args
23
+ end
24
+
25
+ alias_method :fields, :permit
26
+ deprecate fields: :permit, deprecator: ActiveSupport::Deprecation.new('0.6.0', 'ActiveFormModel')
27
+
28
+ def _permit_attrs(attrs)
29
+ attrs.respond_to?(:permit) ? attrs.send(:permit, _permitted_args) : attrs
30
+ end
31
+ end
32
+
33
+ def update(attrs = {})
34
+ permitted_attrs = permit_attrs(attrs)
35
+ super(permitted_attrs)
36
+ end
37
+
38
+ def update!(attrs = {})
39
+ permitted_attrs = permit_attrs(attrs)
40
+ super(permitted_attrs)
41
+ end
42
+
43
+ def assign_attributes(attrs = {})
44
+ permitted_attrs = permit_attrs(attrs)
45
+ super(permitted_attrs)
46
+ end
47
+
48
+ private
49
+
50
+ def permit_attrs(attrs)
51
+ self.class._permit_attrs(attrs)
52
+ end
53
+ end
54
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveFormModel
2
- VERSION = "0.3.0"
4
+ VERSION = '0.5.1'
3
5
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveFormModel
4
+ module Virtual
5
+ extend ActiveSupport::Concern
6
+
7
+ include Permittable
8
+ include ActiveModel::Model
9
+
10
+ class_methods do
11
+ def fields(*attrs)
12
+ send(:attr_accessor, *attrs)
13
+ permit(*attrs)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,52 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_form_model/version'
2
4
  require 'active_support/concern'
3
5
 
4
6
  module ActiveFormModel
7
+ autoload :Virtual, 'active_form_model/virtual'
8
+ autoload :Permittable, 'active_form_model/permittable'
9
+
5
10
  class Error < StandardError; end
6
11
 
7
12
  extend ActiveSupport::Concern
8
13
 
9
- included do
10
- prepend Included
11
- end
12
-
13
- module Included
14
- def initialize(attrs = {})
15
- permitted_attrs = permit_attrs(attrs)
16
- super(permitted_attrs)
17
- end
18
- end
14
+ include Permittable
19
15
 
20
- module ClassMethods
16
+ class_methods do
21
17
  delegate :sti_name, to: :superclass
22
18
  delegate :human_attribute_name, to: :superclass
23
- # delegate :name, to: :superclass
24
-
25
- def permit(*args)
26
- @_permitted_args = args
27
- end
28
-
29
- def _permitted_args
30
- @_permitted_args || (superclass.respond_to?(:_permitted_args) && superclass._permitted_args) || []
31
- end
32
- end
33
-
34
- def update(attrs = {})
35
- permitted_attrs = permit_attrs(attrs)
36
- super(permitted_attrs)
37
- end
38
-
39
- def update!(attrs = {})
40
- permitted_attrs = permit_attrs(attrs)
41
- super(permitted_attrs)
42
- end
43
-
44
- def assign_attributes(attrs = {})
45
- permitted_attrs = permit_attrs(attrs)
46
- super(permitted_attrs)
47
- end
48
19
 
49
- def permit_attrs(attrs)
50
- attrs.respond_to?(:permit) ? attrs.send(:permit, self.class._permitted_args) : attrs
20
+ # NOTE: too many side effects if it is enabled
21
+ # examples: form names, translations
22
+ # delegate :name, to: :superclass
51
23
  end
52
24
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_form_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kirill
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-13 00:00:00.000000000 Z
11
+ date: 2024-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -24,34 +24,6 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3'
27
- - !ruby/object:Gem::Dependency
28
- name: activemodel
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '5'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '5'
41
- - !ruby/object:Gem::Dependency
42
- name: actionpack
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '5'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '5'
55
27
  description: Based on inheritance
56
28
  email:
57
29
  - mokevnin@gmail.com
@@ -59,8 +31,9 @@ executables: []
59
31
  extensions: []
60
32
  extra_rdoc_files: []
61
33
  files:
34
+ - ".github/workflows/main.yml"
62
35
  - ".gitignore"
63
- - ".travis.yml"
36
+ - ".rubocop.yml"
64
37
  - CODE_OF_CONDUCT.md
65
38
  - Gemfile
66
39
  - LICENSE.txt
@@ -71,7 +44,9 @@ files:
71
44
  - bin/console
72
45
  - bin/setup
73
46
  - lib/active_form_model.rb
47
+ - lib/active_form_model/permittable.rb
74
48
  - lib/active_form_model/version.rb
49
+ - lib/active_form_model/virtual.rb
75
50
  - lib/generators/active_form_model/USAGE
76
51
  - lib/generators/active_form_model/form_generator.rb
77
52
  - lib/generators/active_form_model/templates/form.rb
@@ -81,6 +56,7 @@ licenses:
81
56
  metadata:
82
57
  homepage_uri: https://github.com/Hexlet/active_form_model
83
58
  source_code_uri: https://github.com/Hexlet/form-model.git
59
+ rubygems_mfa_required: 'true'
84
60
  post_install_message:
85
61
  rdoc_options: []
86
62
  require_paths:
@@ -89,14 +65,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
89
65
  requirements:
90
66
  - - ">="
91
67
  - !ruby/object:Gem::Version
92
- version: 2.3.0
68
+ version: 3.0.0
93
69
  required_rubygems_version: !ruby/object:Gem::Requirement
94
70
  requirements:
95
71
  - - ">="
96
72
  - !ruby/object:Gem::Version
97
73
  version: '0'
98
74
  requirements: []
99
- rubygems_version: 3.1.2
75
+ rubygems_version: 3.4.10
100
76
  signing_key:
101
77
  specification_version: 4
102
78
  summary: Painless forms for ActiveRecord
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- ---
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.7.0
6
- before_install: gem install bundler -v 2.1.4