active_form_model 0.3.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
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