clowne 0.1.0 → 1.3.0
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 +5 -5
- data/.rubocop.yml +11 -45
- data/.travis.yml +14 -21
- data/CHANGELOG.md +30 -0
- data/Gemfile +11 -7
- data/README.md +38 -18
- data/Rakefile +3 -3
- data/clowne.gemspec +17 -10
- data/docs/.nojekyll +0 -0
- data/docs/.rubocop.yml +8 -2
- data/docs/CNAME +1 -0
- data/docs/README.md +131 -0
- data/docs/_sidebar.md +25 -0
- data/docs/active_record.md +4 -7
- data/docs/after_clone.md +53 -0
- data/docs/after_persist.md +77 -0
- data/docs/architecture.md +2 -5
- data/docs/assets/docsify.min.js +1 -0
- data/docs/assets/prism-ruby.min.js +1 -0
- data/docs/assets/styles.css +348 -0
- data/docs/assets/vue.css +1 -0
- data/docs/clone_mapper.md +59 -0
- data/docs/customization.md +6 -7
- data/docs/exclude_association.md +6 -8
- data/docs/finalize.md +11 -15
- data/docs/from_v02_to_v1.md +83 -0
- data/docs/getting_started.md +171 -0
- data/docs/implicit_cloner.md +2 -5
- data/docs/include_association.md +24 -10
- data/docs/index.html +29 -0
- data/docs/init_as.md +13 -9
- data/docs/inline_configuration.md +5 -6
- data/docs/nullify.md +3 -7
- data/docs/operation.md +55 -0
- data/docs/parameters.md +112 -0
- data/docs/sequel.md +16 -22
- data/docs/supported_adapters.md +3 -6
- data/docs/testing.md +194 -0
- data/docs/traits.md +1 -4
- data/gemfiles/activerecord42.gemfile +7 -5
- data/gemfiles/jruby.gemfile +8 -6
- data/gemfiles/railsmaster.gemfile +8 -6
- data/lib/clowne.rb +12 -9
- data/lib/clowne/adapters/active_record.rb +4 -5
- data/lib/clowne/adapters/active_record/associations.rb +8 -6
- data/lib/clowne/adapters/active_record/associations/base.rb +1 -5
- data/lib/clowne/adapters/active_record/associations/belongs_to.rb +29 -0
- data/lib/clowne/adapters/active_record/associations/has_one.rb +3 -2
- data/lib/clowne/adapters/active_record/dsl.rb +2 -2
- data/lib/clowne/adapters/active_record/resolvers/association.rb +38 -0
- data/lib/clowne/adapters/base.rb +49 -44
- data/lib/clowne/adapters/base/association.rb +24 -15
- data/lib/clowne/adapters/registry.rb +49 -0
- data/lib/clowne/adapters/sequel.rb +14 -10
- data/lib/clowne/adapters/sequel/associations.rb +6 -6
- data/lib/clowne/adapters/sequel/associations/base.rb +9 -5
- data/lib/clowne/adapters/sequel/associations/many_to_many.rb +6 -2
- data/lib/clowne/adapters/sequel/associations/one_to_many.rb +7 -2
- data/lib/clowne/adapters/sequel/associations/one_to_one.rb +7 -2
- data/lib/clowne/adapters/sequel/operation.rb +35 -0
- data/lib/clowne/adapters/sequel/record_wrapper.rb +0 -16
- data/lib/clowne/adapters/sequel/resolvers/after_persist.rb +22 -0
- data/lib/clowne/adapters/sequel/resolvers/association.rb +51 -0
- data/lib/clowne/adapters/sequel/specifications/after_persist_does_not_support.rb +15 -0
- data/lib/clowne/cloner.rb +49 -21
- data/lib/clowne/declarations.rb +15 -12
- data/lib/clowne/declarations/after_clone.rb +21 -0
- data/lib/clowne/declarations/after_persist.rb +21 -0
- data/lib/clowne/declarations/base.rb +13 -0
- data/lib/clowne/declarations/exclude_association.rb +2 -2
- data/lib/clowne/declarations/finalize.rb +5 -4
- data/lib/clowne/declarations/include_association.rb +16 -2
- data/lib/clowne/declarations/init_as.rb +5 -4
- data/lib/clowne/declarations/nullify.rb +4 -3
- data/lib/clowne/declarations/trait.rb +1 -0
- data/lib/clowne/dsl.rb +9 -0
- data/lib/clowne/ext/lambda_as_proc.rb +17 -0
- data/lib/clowne/ext/orm_ext.rb +1 -1
- data/lib/clowne/ext/record_key.rb +12 -0
- data/lib/clowne/ext/string_constantize.rb +9 -3
- data/lib/clowne/ext/yield_self_then.rb +25 -0
- data/lib/clowne/planner.rb +16 -3
- data/lib/clowne/resolvers/after_clone.rb +17 -0
- data/lib/clowne/resolvers/after_persist.rb +18 -0
- data/lib/clowne/resolvers/finalize.rb +12 -0
- data/lib/clowne/resolvers/init_as.rb +13 -0
- data/lib/clowne/resolvers/nullify.rb +15 -0
- data/lib/clowne/rspec.rb +5 -0
- data/lib/clowne/rspec/clone_association.rb +99 -0
- data/lib/clowne/rspec/clone_associations.rb +26 -0
- data/lib/clowne/rspec/helpers.rb +35 -0
- data/lib/clowne/utils/clone_mapper.rb +26 -0
- data/lib/clowne/utils/operation.rb +95 -0
- data/lib/clowne/utils/options.rb +39 -0
- data/lib/clowne/utils/params.rb +64 -0
- data/lib/clowne/utils/plan.rb +90 -0
- data/lib/clowne/version.rb +1 -1
- metadata +99 -45
- data/docs/alternatives.md +0 -26
- data/docs/basic_example.md +0 -66
- data/docs/configuration.md +0 -29
- data/docs/execution_order.md +0 -14
- data/docs/installation.md +0 -16
- data/docs/web/.gitignore +0 -11
- data/docs/web/core/Footer.js +0 -92
- data/docs/web/i18n/en.json +0 -134
- data/docs/web/package.json +0 -14
- data/docs/web/pages/en/help.js +0 -50
- data/docs/web/pages/en/index.js +0 -231
- data/docs/web/pages/en/users.js +0 -47
- data/docs/web/sidebars.json +0 -30
- data/docs/web/siteConfig.js +0 -44
- data/docs/web/static/css/custom.css +0 -229
- data/docs/web/static/fonts/FiraCode-Medium.woff +0 -0
- data/docs/web/static/fonts/FiraCode-Regular.woff +0 -0
- data/docs/web/static/fonts/StemText.woff +0 -0
- data/docs/web/static/fonts/StemTextBold.woff +0 -0
- data/docs/web/static/img/favicon/favicon.ico +0 -0
- data/docs/web/yarn.lock +0 -1741
- data/lib/clowne/adapters/active_record/association.rb +0 -34
- data/lib/clowne/adapters/base/finalize.rb +0 -19
- data/lib/clowne/adapters/base/init_as.rb +0 -21
- data/lib/clowne/adapters/base/nullify.rb +0 -19
- data/lib/clowne/adapters/sequel/association.rb +0 -47
- data/lib/clowne/plan.rb +0 -81
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 3f0d72961e8144605b8f0dbd7953161f17ec4c585c67b3e5bde80d84b3664f1b
|
|
4
|
+
data.tar.gz: 5981d937f60d54993ab6bee595598dbc0b52ac99e38e29ef84f5007661929c5b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ecd7010d94b67e2f0c9f19d2dbde4b6b302481156be2657199d6d9fa98c142807f1b006ddb306a2fd8cb3b2d72b3fd4e1708e34c5fe3541ddd0b2320b5e63112
|
|
7
|
+
data.tar.gz: d56c783b4eed7af9ac5e478cfc2b2154b74644ea03fcc84f9fb7bd54c4e2ac8505355bd0ba0405c96255046232f3eee12c83671ef64173f29097ab859a9e428f
|
data/.rubocop.yml
CHANGED
|
@@ -1,62 +1,28 @@
|
|
|
1
1
|
require:
|
|
2
|
-
|
|
2
|
+
# add after moving docs to another tool
|
|
3
|
+
- 'standard/cop/semantic_blocks'
|
|
4
|
+
- 'rubocop-md'
|
|
5
|
+
|
|
6
|
+
inherit_gem:
|
|
7
|
+
standard: config/base.yml
|
|
8
|
+
|
|
3
9
|
AllCops:
|
|
4
10
|
Exclude:
|
|
5
11
|
- 'bin/**/*'
|
|
6
12
|
- 'tmp/**/*'
|
|
7
|
-
- 'docs/web/**/*'
|
|
8
13
|
- 'vendor/**/*'
|
|
9
14
|
- 'gemfiles/vendor/**/*'
|
|
15
|
+
- 'clowne.gemspec'
|
|
10
16
|
DisplayCopNames: true
|
|
11
|
-
|
|
12
|
-
TargetRubyVersion: 2.3
|
|
17
|
+
TargetRubyVersion: 2.5
|
|
13
18
|
|
|
14
19
|
Markdown:
|
|
15
20
|
WarnInvalid: true
|
|
16
21
|
|
|
17
|
-
|
|
18
|
-
Enabled: false
|
|
19
|
-
|
|
20
|
-
Naming/AccessorMethodName:
|
|
21
|
-
Enabled: false
|
|
22
|
-
|
|
23
|
-
Naming/ClassAndModuleCamelCase:
|
|
24
|
-
Exclude:
|
|
25
|
-
- 'spec/**/*.rb'
|
|
26
|
-
|
|
27
|
-
Style/TrivialAccessors:
|
|
28
|
-
Enabled: false
|
|
29
|
-
|
|
30
|
-
Metrics/LineLength:
|
|
31
|
-
Max: 100
|
|
32
|
-
|
|
33
|
-
Style/Documentation:
|
|
34
|
-
Exclude:
|
|
35
|
-
- 'spec/**/*.rb'
|
|
36
|
-
- 'README.md'
|
|
37
|
-
|
|
38
|
-
Style/SymbolArray:
|
|
39
|
-
Enabled: false
|
|
40
|
-
|
|
41
|
-
Style/FrozenStringLiteralComment:
|
|
42
|
-
Exclude:
|
|
43
|
-
- 'spec/**/*.rb'
|
|
44
|
-
- 'Gemfile'
|
|
45
|
-
- 'Rakefile'
|
|
46
|
-
- '*.gemspec'
|
|
47
|
-
- 'CHANGELOG.md'
|
|
48
|
-
- 'README.md'
|
|
49
|
-
|
|
50
|
-
Metrics/BlockLength:
|
|
51
|
-
Exclude:
|
|
52
|
-
- 'spec/**/*.rb'
|
|
53
|
-
|
|
54
|
-
Bundler/OrderedGems:
|
|
55
|
-
Enabled: false
|
|
56
|
-
|
|
57
|
-
Gemspec/OrderedDependencies:
|
|
22
|
+
Standard/SemanticBlocks:
|
|
58
23
|
Enabled: false
|
|
59
24
|
|
|
60
25
|
Lint/Void:
|
|
61
26
|
Exclude:
|
|
27
|
+
- 'docs/README.md'
|
|
62
28
|
- 'README.md'
|
data/.travis.yml
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
sudo: false
|
|
2
2
|
language: ruby
|
|
3
|
+
cache: bundler
|
|
3
4
|
|
|
4
5
|
notifications:
|
|
5
6
|
email: false
|
|
6
7
|
|
|
7
8
|
before_install:
|
|
8
|
-
gem
|
|
9
|
+
- gem install bundler
|
|
9
10
|
|
|
10
11
|
before_script:
|
|
11
12
|
# Only generate coverage report for the specified job
|
|
@@ -15,38 +16,30 @@ before_script:
|
|
|
15
16
|
script:
|
|
16
17
|
- bundle exec rake
|
|
17
18
|
- if [ "$CC_REPORT" == "true" ]; then ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT; fi
|
|
18
|
-
- if [ "$DEPLOY_ME" == "true" ]; then (cd ./docs/web && yarn && yarn run build); fi
|
|
19
19
|
|
|
20
20
|
matrix:
|
|
21
21
|
fast_finish: true
|
|
22
22
|
include:
|
|
23
23
|
- rvm: ruby-head
|
|
24
24
|
gemfile: gemfiles/railsmaster.gemfile
|
|
25
|
-
- rvm: jruby-9.
|
|
25
|
+
- rvm: jruby-9.2.8.0
|
|
26
26
|
gemfile: gemfiles/jruby.gemfile
|
|
27
|
-
- rvm:
|
|
27
|
+
- rvm: 3.0
|
|
28
28
|
gemfile: Gemfile
|
|
29
|
-
- rvm: 2.
|
|
29
|
+
- rvm: 2.7
|
|
30
30
|
gemfile: Gemfile
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
- rvm: 2.4.1
|
|
35
|
-
gemfile: gemfiles/activerecord42.gemfile
|
|
36
|
-
- rvm: 2.3.1
|
|
31
|
+
- rvm: 2.6.5
|
|
32
|
+
gemfile: Gemfile
|
|
33
|
+
- rvm: 2.5.7
|
|
37
34
|
gemfile: Gemfile
|
|
38
|
-
- rvm: 2.
|
|
35
|
+
- rvm: 2.4.9
|
|
39
36
|
gemfile: gemfiles/activerecord42.gemfile
|
|
37
|
+
- rvm: truffleruby-head
|
|
38
|
+
gemfile: Gemfile
|
|
40
39
|
allow_failures:
|
|
41
40
|
- rvm: ruby-head
|
|
42
41
|
gemfile: gemfiles/railsmaster.gemfile
|
|
43
|
-
- rvm: jruby-9.
|
|
42
|
+
- rvm: jruby-9.2.8.0
|
|
44
43
|
gemfile: gemfiles/jruby.gemfile
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
skip_cleanup: true
|
|
48
|
-
github_token: $GITHUB_TOKEN
|
|
49
|
-
local_dir: "./docs/web/build/clowne"
|
|
50
|
-
on:
|
|
51
|
-
branch: master
|
|
52
|
-
condition: $DEPLOY_ME = true
|
|
44
|
+
- rvm: truffleruby-head
|
|
45
|
+
gemfile: Gemfile
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# Change log
|
|
2
2
|
|
|
3
|
+
## 1.1.0 (2019-03-20)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
- Add `after_clone` declaration. ([@elardo][])
|
|
7
|
+
- Add opporotunity to include belongs_to association for active_record adapter. ([@madding][])
|
|
8
|
+
|
|
9
|
+
## 1.0.0 (2019-02-26)
|
|
10
|
+
|
|
11
|
+
- Return `Operation` instance as a rusult of cloning. ([@ssnickolay][])
|
|
12
|
+
|
|
13
|
+
See [migration guide](https://clowne.evilmartians.io/docs/from_v02_to_v10.html)
|
|
14
|
+
|
|
15
|
+
- Add `after_persist` declaration. ([@ssnickolay][], [@palkan][])
|
|
16
|
+
|
|
17
|
+
- Unify interface between adapters. ([@ssnickolay][])
|
|
18
|
+
|
|
19
|
+
- Deprecate `Operation#save` and `Operation#save!` methods. ([@ssnickolay][])
|
|
20
|
+
|
|
21
|
+
- Improve Docs ([@ssnickolay][], [@palkan][])
|
|
22
|
+
|
|
23
|
+
## 0.2.0 (2018-02-21)
|
|
24
|
+
|
|
25
|
+
- Add `Cloner#partial_apply` method. ([@palkan][])
|
|
26
|
+
|
|
27
|
+
- Add RSpec matchers `clone_association` / `clone_associations`. ([@palkan][])
|
|
28
|
+
|
|
29
|
+
- [[#15](https://github.com/palkan/clowne/issues/15)] Add control over nested params. ([@ssnickolay][])
|
|
30
|
+
|
|
3
31
|
## 0.1.0 (2018-02-01)
|
|
4
32
|
|
|
5
33
|
- Add `init_as` declaration. ([@palkan][])
|
|
@@ -14,3 +42,5 @@
|
|
|
14
42
|
|
|
15
43
|
[@palkan]: https://github.com/palkan
|
|
16
44
|
[@ssnickolay]: https://github.com/ssnickolay
|
|
45
|
+
[@elardo]: https://github.com/elardo
|
|
46
|
+
[@madding]: https://github.com/madding
|
data/Gemfile
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
source
|
|
1
|
+
source "https://rubygems.org"
|
|
2
2
|
|
|
3
3
|
# Specify your gem's dependencies in clowne.gemspec
|
|
4
4
|
gemspec
|
|
5
5
|
|
|
6
|
-
gem
|
|
7
|
-
gem 'sqlite3'
|
|
8
|
-
gem 'activerecord', '>= 5.0'
|
|
9
|
-
gem 'sequel', '>= 5.0'
|
|
10
|
-
gem 'simplecov'
|
|
6
|
+
gem "pry-byebug", platform: :mri
|
|
11
7
|
|
|
12
|
-
|
|
8
|
+
gem "sqlite3", "~> 1.4.1", platform: :ruby
|
|
9
|
+
gem "activerecord-jdbcsqlite3-adapter", "~> 50.0", platform: :jruby
|
|
10
|
+
gem "jdbc-sqlite3", platform: :jruby
|
|
11
|
+
|
|
12
|
+
gem "activerecord", ">= 6.0", "< 6.2.0"
|
|
13
|
+
gem "sequel", ">= 5.0"
|
|
14
|
+
gem "simplecov"
|
|
15
|
+
|
|
16
|
+
local_gemfile = "Gemfile.local"
|
|
13
17
|
|
|
14
18
|
if File.exist?(local_gemfile)
|
|
15
19
|
eval(File.read(local_gemfile)) # rubocop:disable Security/Eval
|
data/README.md
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
[](https://badge.fury.io/rb/clowne)
|
|
2
|
-
[](https://travis-ci.org/clowne-rb/clowne)
|
|
3
|
+
[](https://codeclimate.com/github/clowne-rb/clowne/test_coverage)
|
|
4
|
+
[](https://codeclimate.com/github/clowne-rb/clowne/maintainability)
|
|
5
|
+
[](https://clowne.evilmartians.io)
|
|
5
6
|
|
|
6
7
|
# Clowne
|
|
7
8
|
|
|
8
|
-
**NOTE**: this is the documentation for pre-release version **0.1.0.beta1**.
|
|
9
|
-
|
|
10
9
|
A flexible gem for cloning your models. Clowne focuses on ease of use and provides the ability to connect various ORM adapters.
|
|
11
10
|
|
|
11
|
+
📖 Read [Evil Martians Chronicles](https://evilmartians.com/chronicles/clowne-clone-ruby-models-with-a-smile) to learn about possible use cases.
|
|
12
|
+
|
|
13
|
+
📑 [Documentation](https://clowne.evilmartians.io)
|
|
14
|
+
|
|
12
15
|
<a href="https://evilmartians.com/">
|
|
13
16
|
<img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Sponsored by Evil Martians" width="236" height="54"></a>
|
|
14
17
|
|
|
@@ -24,7 +27,7 @@ gem install clowne
|
|
|
24
27
|
Or add this line to your application's Gemfile:
|
|
25
28
|
|
|
26
29
|
```ruby
|
|
27
|
-
gem
|
|
30
|
+
gem "clowne"
|
|
28
31
|
```
|
|
29
32
|
|
|
30
33
|
## Quick Start
|
|
@@ -42,6 +45,16 @@ class User < ActiveRecord::Base
|
|
|
42
45
|
has_one :profile
|
|
43
46
|
has_many :posts
|
|
44
47
|
end
|
|
48
|
+
|
|
49
|
+
class Profile < ActiveRecord::Base
|
|
50
|
+
# create_table :profiles do |t|
|
|
51
|
+
# t.string :name
|
|
52
|
+
# end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
class Post < ActiveRecord::Base
|
|
56
|
+
# create_table :posts
|
|
57
|
+
end
|
|
45
58
|
```
|
|
46
59
|
|
|
47
60
|
Let's declare our cloners first:
|
|
@@ -56,7 +69,7 @@ class UserCloner < Clowne::Cloner
|
|
|
56
69
|
nullify :login
|
|
57
70
|
|
|
58
71
|
# params here is an arbitrary Hash passed into cloner
|
|
59
|
-
finalize do |_source, record, params|
|
|
72
|
+
finalize do |_source, record, **params|
|
|
60
73
|
record.email = params[:email]
|
|
61
74
|
end
|
|
62
75
|
end
|
|
@@ -72,13 +85,20 @@ Now you can use `UserCloner` to clone existing records:
|
|
|
72
85
|
|
|
73
86
|
```ruby
|
|
74
87
|
user = User.last
|
|
75
|
-
|
|
88
|
+
# => <#User id: 1, login: 'clown', email: 'clown@circus.example.com'>
|
|
89
|
+
|
|
90
|
+
operation = UserCloner.call(user, email: "fake@example.com")
|
|
91
|
+
# => <#Clowne::Utils::Operation...>
|
|
92
|
+
|
|
93
|
+
operation.to_record
|
|
94
|
+
# => <#User id: nil, login: nil, email: 'fake@example.com'>
|
|
95
|
+
|
|
96
|
+
operation.persist!
|
|
97
|
+
# => true
|
|
76
98
|
|
|
77
|
-
cloned =
|
|
78
|
-
|
|
79
|
-
# => false
|
|
99
|
+
cloned = operation.to_record
|
|
100
|
+
# => <#User id: 2, login: nil, email: 'fake@example.com'>
|
|
80
101
|
|
|
81
|
-
cloned.save!
|
|
82
102
|
cloned.login
|
|
83
103
|
# => nil
|
|
84
104
|
cloned.email
|
|
@@ -91,20 +111,20 @@ cloned.profile.name
|
|
|
91
111
|
# => nil
|
|
92
112
|
```
|
|
93
113
|
|
|
94
|
-
Take a look at our [documentation](https://
|
|
114
|
+
Take a look at our [documentation](https://clowne.evilmartians.io) for more info!
|
|
95
115
|
|
|
96
116
|
### Supported ORM adapters
|
|
97
117
|
|
|
98
|
-
Adapter |1:1 | 1:M | M:M |
|
|
99
|
-
|
|
100
|
-
[Active Record](https://
|
|
101
|
-
[Sequel](https://
|
|
118
|
+
Adapter |1:1 |*:1 | 1:M | M:M |
|
|
119
|
+
------------------------------------------|------------|------------|-------------|-------------------------|
|
|
120
|
+
[Active Record](https://clowne.evilmartians.io/#/active_record) | has_one | belongs_to | has_many | has_and_belongs_to|
|
|
121
|
+
[Sequel](https://clowne.evilmartians.io/#/sequel) | one_to_one | - | one_to_many | many_to_many |
|
|
102
122
|
|
|
103
123
|
## Maintainers
|
|
104
124
|
|
|
105
125
|
- [Vladimir Dementyev](https://github.com/palkan)
|
|
106
126
|
|
|
107
|
-
- [Sverchkov
|
|
127
|
+
- [Nikolay Sverchkov](https://github.com/ssnickolay)
|
|
108
128
|
|
|
109
129
|
## License
|
|
110
130
|
|
data/Rakefile
CHANGED
data/clowne.gemspec
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
lib = File.expand_path('
|
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
|
2
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
3
|
require 'clowne/version'
|
|
4
4
|
|
|
@@ -8,22 +8,29 @@ Gem::Specification.new do |spec|
|
|
|
8
8
|
spec.authors = ['Vladimir Dementyev', 'Sverchkov Nikolay']
|
|
9
9
|
spec.email = ['palkan@evilmartians.com', 'ssnikolay@gmail.com']
|
|
10
10
|
|
|
11
|
-
spec.summary = 'A flexible gem for cloning your models
|
|
11
|
+
spec.summary = 'A flexible gem for cloning your models'
|
|
12
12
|
spec.description = 'A flexible gem for cloning your models.'
|
|
13
|
-
spec.homepage = 'https://github.com/
|
|
13
|
+
spec.homepage = 'https://github.com/clowne-rb/clowne'
|
|
14
14
|
spec.license = 'MIT'
|
|
15
15
|
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
|
17
17
|
f.match(%r{^(test|spec|features)/})
|
|
18
18
|
end
|
|
19
|
-
spec.
|
|
20
|
-
|
|
19
|
+
spec.metadata = {
|
|
20
|
+
"bug_tracker_uri" => "http://github.com/clowne-rb/clowne/issues",
|
|
21
|
+
"changelog_uri" => "https://github.com/clowne-rb/clowne/blob/master/CHANGELOG.md",
|
|
22
|
+
"documentation_uri" => "https://clowne.evilmartians.io/",
|
|
23
|
+
"homepage_uri" => "https://clowne.evilmartians.io/",
|
|
24
|
+
"source_code_uri" => "http://github.com/clowne-rb/clowne"
|
|
25
|
+
}
|
|
21
26
|
spec.require_paths = ['lib']
|
|
22
27
|
|
|
23
|
-
spec.add_development_dependency 'bundler', '~>
|
|
24
|
-
spec.add_development_dependency 'rake', '~>
|
|
28
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
|
29
|
+
spec.add_development_dependency 'rake', '~> 12.3', '>= 12.3.3'
|
|
25
30
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
|
26
|
-
spec.add_development_dependency 'factory_bot', '~>
|
|
27
|
-
spec.add_development_dependency 'rubocop', '~> 0.
|
|
28
|
-
spec.add_development_dependency 'rubocop-md', '~> 0.
|
|
31
|
+
spec.add_development_dependency 'factory_bot', '~> 5'
|
|
32
|
+
spec.add_development_dependency 'rubocop', '~> 0.75.0'
|
|
33
|
+
spec.add_development_dependency 'rubocop-md', '~> 0.3.0'
|
|
34
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 1.36.0'
|
|
35
|
+
spec.add_development_dependency 'standard', '~> 0.1.5'
|
|
29
36
|
end
|
data/docs/.nojekyll
ADDED
|
File without changes
|
data/docs/.rubocop.yml
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
inherit_gem:
|
|
2
|
+
standard: config/base.yml
|
|
3
3
|
|
|
4
4
|
Lint/Void:
|
|
5
5
|
Exclude:
|
|
@@ -8,5 +8,11 @@ Lint/Void:
|
|
|
8
8
|
Metrics/AbcSize:
|
|
9
9
|
Enabled: false
|
|
10
10
|
|
|
11
|
+
Standard/SemanticBlocks:
|
|
12
|
+
Enabled: false
|
|
13
|
+
|
|
11
14
|
Metrics/BlockLength:
|
|
12
15
|
Enabled: false
|
|
16
|
+
|
|
17
|
+
Metrics/LineLength:
|
|
18
|
+
Enabled: false
|
data/docs/CNAME
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
clowne.evilmartians.io
|
data/docs/README.md
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
[](https://badge.fury.io/rb/clowne)
|
|
2
|
+
[](https://travis-ci.org/clowne-rb/clowne)
|
|
3
|
+
[](https://codeclimate.com/github/clowne-rb/clowne/test_coverage)
|
|
4
|
+
[](https://codeclimate.com/github/clowne-rb/clowne/maintainability)
|
|
5
|
+
[](https://clowne.evilmartians.io)
|
|
6
|
+
|
|
7
|
+
# Clowne
|
|
8
|
+
|
|
9
|
+
A flexible gem for cloning your models. Clowne focuses on ease of use and provides the ability to connect various ORM adapters.
|
|
10
|
+
|
|
11
|
+
📖 Read [Evil Martians Chronicles](https://evilmartians.com/chronicles/clowne-clone-ruby-models-with-a-smile) to learn about possible use cases.
|
|
12
|
+
|
|
13
|
+
📑 [Documentation](https://clowne.evilmartians.io)
|
|
14
|
+
|
|
15
|
+
<a href="https://evilmartians.com/">
|
|
16
|
+
<img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Sponsored by Evil Martians" width="236" height="54"></a>
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
|
|
21
|
+
To install Clowne with RubyGems:
|
|
22
|
+
|
|
23
|
+
```ruby
|
|
24
|
+
gem install clowne
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Or add this line to your application's Gemfile:
|
|
28
|
+
|
|
29
|
+
```ruby
|
|
30
|
+
gem "clowne"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Quick Start
|
|
34
|
+
|
|
35
|
+
Assume that you have the following model:
|
|
36
|
+
|
|
37
|
+
```ruby
|
|
38
|
+
class User < ActiveRecord::Base
|
|
39
|
+
# create_table :users do |t|
|
|
40
|
+
# t.string :login
|
|
41
|
+
# t.string :email
|
|
42
|
+
# t.timestamps null: false
|
|
43
|
+
# end
|
|
44
|
+
|
|
45
|
+
has_one :profile
|
|
46
|
+
has_many :posts
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
class Profile < ActiveRecord::Base
|
|
50
|
+
# create_table :profiles do |t|
|
|
51
|
+
# t.string :name
|
|
52
|
+
# end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
class Post < ActiveRecord::Base
|
|
56
|
+
# create_table :posts
|
|
57
|
+
end
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Let's declare our cloners first:
|
|
61
|
+
|
|
62
|
+
```ruby
|
|
63
|
+
class UserCloner < Clowne::Cloner
|
|
64
|
+
adapter :active_record
|
|
65
|
+
|
|
66
|
+
include_association :profile, clone_with: SpecialProfileCloner
|
|
67
|
+
include_association :posts
|
|
68
|
+
|
|
69
|
+
nullify :login
|
|
70
|
+
|
|
71
|
+
# params here is an arbitrary Hash passed into cloner
|
|
72
|
+
finalize do |_source, record, **params|
|
|
73
|
+
record.email = params[:email]
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
class SpecialProfileCloner < Clowne::Cloner
|
|
78
|
+
adapter :active_record
|
|
79
|
+
|
|
80
|
+
nullify :name
|
|
81
|
+
end
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Now you can use `UserCloner` to clone existing records:
|
|
85
|
+
|
|
86
|
+
```ruby
|
|
87
|
+
user = User.last
|
|
88
|
+
# => <#User id: 1, login: 'clown', email: 'clown@circus.example.com'>
|
|
89
|
+
|
|
90
|
+
operation = UserCloner.call(user, email: "fake@example.com")
|
|
91
|
+
# => <#Clowne::Utils::Operation...>
|
|
92
|
+
|
|
93
|
+
operation.to_record
|
|
94
|
+
# => <#User id: nil, login: nil, email: 'fake@example.com'>
|
|
95
|
+
|
|
96
|
+
operation.persist!
|
|
97
|
+
# => true
|
|
98
|
+
|
|
99
|
+
cloned = operation.to_record
|
|
100
|
+
# => <#User id: 2, login: nil, email: 'fake@example.com'>
|
|
101
|
+
|
|
102
|
+
cloned.login
|
|
103
|
+
# => nil
|
|
104
|
+
cloned.email
|
|
105
|
+
# => "fake@example.com"
|
|
106
|
+
|
|
107
|
+
# associations:
|
|
108
|
+
cloned.posts.count == user.posts.count
|
|
109
|
+
# => true
|
|
110
|
+
cloned.profile.name
|
|
111
|
+
# => nil
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Take a look at our [documentation](https://clowne.evilmartians.io) for more info!
|
|
115
|
+
|
|
116
|
+
### Supported ORM adapters
|
|
117
|
+
|
|
118
|
+
Adapter |1:1 |*:1 | 1:M | M:M |
|
|
119
|
+
------------------------------------------|------------|------------|-------------|-------------------------|
|
|
120
|
+
[Active Record](active_record) | has_one | belongs_to | has_many | has_and_belongs_to|
|
|
121
|
+
[Sequel](sequel) | one_to_one | - | one_to_many | many_to_many |
|
|
122
|
+
|
|
123
|
+
## Maintainers
|
|
124
|
+
|
|
125
|
+
- [Vladimir Dementyev](https://github.com/palkan)
|
|
126
|
+
|
|
127
|
+
- [Nikolay Sverchkov](https://github.com/ssnickolay)
|
|
128
|
+
|
|
129
|
+
## License
|
|
130
|
+
|
|
131
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|