clowne 0.1.0.pre1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +7 -0
  3. data/.gitattributes +1 -0
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +16 -33
  6. data/.travis.yml +14 -10
  7. data/CHANGELOG.md +39 -2
  8. data/Gemfile +11 -6
  9. data/README.md +48 -384
  10. data/Rakefile +3 -3
  11. data/clowne.gemspec +16 -8
  12. data/docs/.nojekyll +0 -0
  13. data/docs/.rubocop.yml +18 -0
  14. data/docs/CNAME +1 -0
  15. data/docs/README.md +131 -0
  16. data/docs/_sidebar.md +25 -0
  17. data/docs/active_record.md +33 -0
  18. data/docs/after_clone.md +53 -0
  19. data/docs/after_persist.md +77 -0
  20. data/docs/architecture.md +138 -0
  21. data/docs/assets/docsify.min.js +1 -0
  22. data/docs/assets/prism-ruby.min.js +1 -0
  23. data/docs/assets/styles.css +348 -0
  24. data/docs/assets/vue.css +1 -0
  25. data/docs/clone_mapper.md +59 -0
  26. data/docs/customization.md +63 -0
  27. data/docs/exclude_association.md +61 -0
  28. data/docs/finalize.md +31 -0
  29. data/docs/from_v02_to_v1.md +83 -0
  30. data/docs/getting_started.md +171 -0
  31. data/docs/implicit_cloner.md +33 -0
  32. data/docs/include_association.md +133 -0
  33. data/docs/index.html +29 -0
  34. data/docs/init_as.md +40 -0
  35. data/docs/inline_configuration.md +37 -0
  36. data/docs/nullify.md +33 -0
  37. data/docs/operation.md +55 -0
  38. data/docs/parameters.md +112 -0
  39. data/docs/sequel.md +50 -0
  40. data/docs/supported_adapters.md +10 -0
  41. data/docs/testing.md +194 -0
  42. data/docs/traits.md +25 -0
  43. data/gemfiles/activerecord42.gemfile +7 -4
  44. data/gemfiles/jruby.gemfile +8 -4
  45. data/gemfiles/railsmaster.gemfile +8 -5
  46. data/lib/clowne.rb +12 -7
  47. data/lib/clowne/adapters/active_record.rb +6 -16
  48. data/lib/clowne/adapters/active_record/associations.rb +8 -6
  49. data/lib/clowne/adapters/active_record/associations/base.rb +5 -49
  50. data/lib/clowne/adapters/active_record/associations/belongs_to.rb +29 -0
  51. data/lib/clowne/adapters/active_record/associations/has_one.rb +9 -1
  52. data/lib/clowne/adapters/active_record/associations/noop.rb +4 -1
  53. data/lib/clowne/adapters/active_record/dsl.rb +33 -0
  54. data/lib/clowne/adapters/active_record/resolvers/association.rb +38 -0
  55. data/lib/clowne/adapters/base.rb +53 -41
  56. data/lib/clowne/adapters/base/association.rb +78 -0
  57. data/lib/clowne/adapters/registry.rb +54 -11
  58. data/lib/clowne/adapters/sequel.rb +29 -0
  59. data/lib/clowne/adapters/sequel/associations.rb +26 -0
  60. data/lib/clowne/adapters/sequel/associations/base.rb +27 -0
  61. data/lib/clowne/adapters/sequel/associations/many_to_many.rb +23 -0
  62. data/lib/clowne/adapters/sequel/associations/noop.rb +16 -0
  63. data/lib/clowne/adapters/sequel/associations/one_to_many.rb +28 -0
  64. data/lib/clowne/adapters/sequel/associations/one_to_one.rb +28 -0
  65. data/lib/clowne/adapters/sequel/copier.rb +23 -0
  66. data/lib/clowne/adapters/sequel/operation.rb +35 -0
  67. data/lib/clowne/adapters/sequel/record_wrapper.rb +43 -0
  68. data/lib/clowne/adapters/sequel/resolvers/after_persist.rb +22 -0
  69. data/lib/clowne/adapters/sequel/resolvers/association.rb +51 -0
  70. data/lib/clowne/adapters/sequel/specifications/after_persist_does_not_support.rb +15 -0
  71. data/lib/clowne/cloner.rb +50 -20
  72. data/lib/clowne/declarations.rb +15 -11
  73. data/lib/clowne/declarations/after_clone.rb +21 -0
  74. data/lib/clowne/declarations/after_persist.rb +21 -0
  75. data/lib/clowne/declarations/base.rb +13 -0
  76. data/lib/clowne/declarations/exclude_association.rb +1 -6
  77. data/lib/clowne/declarations/finalize.rb +3 -2
  78. data/lib/clowne/declarations/include_association.rb +16 -4
  79. data/lib/clowne/declarations/init_as.rb +21 -0
  80. data/lib/clowne/declarations/nullify.rb +3 -2
  81. data/lib/clowne/declarations/trait.rb +3 -0
  82. data/lib/clowne/dsl.rb +9 -0
  83. data/lib/clowne/ext/lambda_as_proc.rb +17 -0
  84. data/lib/clowne/ext/orm_ext.rb +21 -0
  85. data/lib/clowne/ext/record_key.rb +12 -0
  86. data/lib/clowne/ext/string_constantize.rb +10 -4
  87. data/lib/clowne/ext/yield_self_then.rb +25 -0
  88. data/lib/clowne/planner.rb +27 -7
  89. data/lib/clowne/resolvers/after_clone.rb +17 -0
  90. data/lib/clowne/resolvers/after_persist.rb +18 -0
  91. data/lib/clowne/resolvers/finalize.rb +12 -0
  92. data/lib/clowne/resolvers/init_as.rb +13 -0
  93. data/lib/clowne/resolvers/nullify.rb +15 -0
  94. data/lib/clowne/rspec.rb +5 -0
  95. data/lib/clowne/rspec/clone_association.rb +99 -0
  96. data/lib/clowne/rspec/clone_associations.rb +26 -0
  97. data/lib/clowne/rspec/helpers.rb +35 -0
  98. data/lib/clowne/utils/clone_mapper.rb +26 -0
  99. data/lib/clowne/utils/operation.rb +95 -0
  100. data/lib/clowne/utils/options.rb +39 -0
  101. data/lib/clowne/utils/params.rb +64 -0
  102. data/lib/clowne/utils/plan.rb +90 -0
  103. data/lib/clowne/version.rb +1 -1
  104. metadata +140 -20
  105. data/lib/clowne/adapters/active_record/association.rb +0 -34
  106. data/lib/clowne/adapters/base/finalize.rb +0 -19
  107. data/lib/clowne/adapters/base/nullify.rb +0 -19
  108. data/lib/clowne/plan.rb +0 -81
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Clowne
4
- module Adapters # :nodoc: all
5
- class ActiveRecord
6
- class UnknownAssociation < StandardError; end
7
-
8
- class Association
9
- class << self
10
- def call(source, record, declaration, params:)
11
- reflection = source.class.reflections[declaration.name.to_s]
12
-
13
- if reflection.nil?
14
- raise UnknownAssociation,
15
- "Association #{declaration.name} couldn't be found for #{source.class}"
16
- end
17
-
18
- cloner_class = Associations.cloner_for(reflection)
19
-
20
- cloner_class.new(reflection, source, declaration, params).call(record)
21
-
22
- record
23
- end
24
- end
25
- end
26
- end
27
- end
28
- end
29
-
30
- Clowne::Adapters::ActiveRecord.register_resolver(
31
- :association,
32
- Clowne::Adapters::ActiveRecord::Association,
33
- before: :nullify
34
- )
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Clowne
4
- module Adapters
5
- class Base
6
- module Finalize # :nodoc: all
7
- def self.call(source, record, declaration, params:)
8
- declaration.block.call(source, record, params)
9
- record
10
- end
11
- end
12
- end
13
- end
14
- end
15
-
16
- Clowne::Adapters::Base.register_resolver(
17
- :finalize, Clowne::Adapters::Base::Finalize,
18
- after: :nullify
19
- )
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Clowne
4
- module Adapters
5
- class Base
6
- module Nullify # :nodoc: all
7
- def self.call(_source, record, declaration, **_options)
8
- declaration.attributes.each do |attr|
9
- record.__send__("#{attr}=", nil)
10
- end
11
-
12
- record
13
- end
14
- end
15
- end
16
- end
17
- end
18
-
19
- Clowne::Adapters::Base.register_resolver(:nullify, Clowne::Adapters::Base::Nullify)
@@ -1,81 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Clowne
4
- class Plan # :nodoc: all
5
- class TwoPhaseSet
6
- def initialize
7
- @added = {}
8
- @removed = []
9
- end
10
-
11
- def []=(k, v)
12
- return if @removed.include?(k)
13
- @added[k] = v
14
- end
15
-
16
- def delete(k)
17
- return if @removed.include?(k)
18
- @removed << k
19
- @added.delete(k)
20
- end
21
-
22
- def values
23
- @added.values
24
- end
25
- end
26
-
27
- def initialize(registry)
28
- @registry = registry
29
- @data = {}
30
- end
31
-
32
- def add(type, declaration)
33
- data[type] = [] unless data.key?(type)
34
- data[type] << declaration
35
- end
36
-
37
- def add_to(type, id, declaration)
38
- data[type] = TwoPhaseSet.new unless data.key?(type)
39
- data[type][id] = declaration
40
- end
41
-
42
- def set(type, declaration)
43
- data[type] = declaration
44
- end
45
-
46
- def get(type)
47
- data[type]
48
- end
49
-
50
- def remove(type)
51
- data.delete(type)
52
- end
53
-
54
- def remove_from(type, id)
55
- return unless data[type]
56
- data[type].delete(id)
57
- end
58
-
59
- def declarations
60
- registry.actions.flat_map do |type|
61
- value = data[type]
62
- next if value.nil?
63
- value = value.values if value.is_a?(TwoPhaseSet)
64
- value = Array(value)
65
- value.map { |v| [type, v] }
66
- end.compact
67
- end
68
-
69
- def dup
70
- self.class.new(registry).tap do |duped|
71
- data.each do |k, v|
72
- duped.set(k, v.dup)
73
- end
74
- end
75
- end
76
-
77
- private
78
-
79
- attr_reader :data, :registry
80
- end
81
- end