mongoid 9.1.0 → 9.1.2

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.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/lib/config/locales/en.yml +69 -0
  3. data/lib/mongoid/association/accessors.rb +27 -5
  4. data/lib/mongoid/association/depending.rb +14 -10
  5. data/lib/mongoid/association/eager.rb +9 -0
  6. data/lib/mongoid/association/eager_load/discriminated_inclusion.rb +88 -0
  7. data/lib/mongoid/association/eager_load/embedded_distributor.rb +151 -0
  8. data/lib/mongoid/association/eager_load/inclusion.rb +173 -0
  9. data/lib/mongoid/association/eager_load/inclusion_tree.rb +96 -0
  10. data/lib/mongoid/association/eager_load/lookup_pipeline.rb +121 -0
  11. data/lib/mongoid/association/eager_load/polymorphic_preloader.rb +61 -0
  12. data/lib/mongoid/association/eager_load/polymorphic_targets.rb +151 -0
  13. data/lib/mongoid/association/eager_loadable.rb +65 -101
  14. data/lib/mongoid/association/embedded/batchable.rb +17 -1
  15. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +6 -1
  16. data/lib/mongoid/association/embedded/embeds_one.rb +1 -0
  17. data/lib/mongoid/association/macros.rb +13 -1
  18. data/lib/mongoid/association/nested/many.rb +34 -5
  19. data/lib/mongoid/association/nested/nested_buildable.rb +14 -0
  20. data/lib/mongoid/association/nested/one.rb +6 -1
  21. data/lib/mongoid/association/options.rb +17 -0
  22. data/lib/mongoid/association/referenced/belongs_to/eager.rb +6 -1
  23. data/lib/mongoid/association/referenced/belongs_to.rb +1 -0
  24. data/lib/mongoid/association/referenced/counter_cache.rb +3 -3
  25. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +6 -0
  26. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +5 -0
  27. data/lib/mongoid/association/referenced/has_many/enumerable.rb +3 -1
  28. data/lib/mongoid/association/referenced/has_many/proxy.rb +100 -1
  29. data/lib/mongoid/association/referenced/has_many_through/eager.rb +99 -0
  30. data/lib/mongoid/association/referenced/has_many_through/proxy.rb +68 -0
  31. data/lib/mongoid/association/referenced/has_many_through.rb +201 -0
  32. data/lib/mongoid/association/referenced/has_one.rb +1 -0
  33. data/lib/mongoid/association/referenced/has_one_through/eager.rb +65 -0
  34. data/lib/mongoid/association/referenced/has_one_through/proxy.rb +30 -0
  35. data/lib/mongoid/association/referenced/has_one_through.rb +167 -0
  36. data/lib/mongoid/association/referenced.rb +2 -0
  37. data/lib/mongoid/association/relatable.rb +58 -0
  38. data/lib/mongoid/association.rb +15 -0
  39. data/lib/mongoid/atomic/modifiers.rb +100 -16
  40. data/lib/mongoid/clients/factory.rb +9 -13
  41. data/lib/mongoid/collection_configurable.rb +8 -0
  42. data/lib/mongoid/config/defaults.rb +0 -1
  43. data/lib/mongoid/config/encryption.rb +170 -22
  44. data/lib/mongoid/config.rb +56 -5
  45. data/lib/mongoid/contextual/aggregable/memory.rb +6 -2
  46. data/lib/mongoid/contextual/memory.rb +18 -7
  47. data/lib/mongoid/criteria/includable.rb +35 -11
  48. data/lib/mongoid/criteria/queryable/mergeable.rb +4 -0
  49. data/lib/mongoid/criteria/queryable/selectable.rb +123 -7
  50. data/lib/mongoid/deprecable.rb +45 -2
  51. data/lib/mongoid/document.rb +3 -0
  52. data/lib/mongoid/encryptable.rb +73 -0
  53. data/lib/mongoid/errors/config_redactor.rb +43 -0
  54. data/lib/mongoid/errors/in_memory_regexp_timeout.rb +26 -0
  55. data/lib/mongoid/errors/invalid_encryption_schema.rb +27 -0
  56. data/lib/mongoid/errors/mixed_client_configuration.rb +1 -1
  57. data/lib/mongoid/errors/no_client_database.rb +1 -1
  58. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  59. data/lib/mongoid/errors/no_encryption_schema.rb +30 -0
  60. data/lib/mongoid/errors/readonly_association.rb +29 -0
  61. data/lib/mongoid/errors.rb +5 -0
  62. data/lib/mongoid/extensions/vector.rb +64 -0
  63. data/lib/mongoid/extensions.rb +1 -0
  64. data/lib/mongoid/field_readable.rb +69 -0
  65. data/lib/mongoid/fields.rb +7 -0
  66. data/lib/mongoid/indexable.rb +38 -26
  67. data/lib/mongoid/matchable.rb +6 -1
  68. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +2 -4
  69. data/lib/mongoid/matcher/regex.rb +11 -12
  70. data/lib/mongoid/matcher/regexp_budget.rb +372 -0
  71. data/lib/mongoid/matcher.rb +1 -0
  72. data/lib/mongoid/persistable/creatable.rb +120 -14
  73. data/lib/mongoid/persistable/updatable.rb +9 -11
  74. data/lib/mongoid/persistable.rb +15 -15
  75. data/lib/mongoid/persistence_context.rb +77 -0
  76. data/lib/mongoid/search_indexable.rb +69 -24
  77. data/lib/mongoid/serializable.rb +12 -4
  78. data/lib/mongoid/tasks/database.rb +33 -16
  79. data/lib/mongoid/threaded.rb +36 -0
  80. data/lib/mongoid/timestamps/timeless.rb +84 -10
  81. data/lib/mongoid/touchable.rb +28 -1
  82. data/lib/mongoid/traversable.rb +2 -2
  83. data/lib/mongoid/validatable/associated.rb +18 -2
  84. data/lib/mongoid/version.rb +1 -1
  85. data/lib/mongoid/warnings.rb +4 -0
  86. data/spec/integration/app_spec.rb +7 -1
  87. data/spec/integration/associations/belongs_to_spec.rb +13 -0
  88. data/spec/integration/associations/embedded_delayed_atomic_sets_spec.rb +216 -0
  89. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +31 -2
  90. data/spec/integration/atomic/modifiers_spec.rb +283 -0
  91. data/spec/integration/dots_and_dollars_spec.rb +12 -2
  92. data/spec/integration/encryption_spec.rb +300 -0
  93. data/spec/integration/matcher_operator_data/regex.yml +21 -0
  94. data/spec/integration/matcher_regexp_timeout_spec.rb +215 -0
  95. data/spec/integration/query_operator_guard_spec.rb +89 -0
  96. data/spec/mongoid/association/accessors_spec.rb +35 -0
  97. data/spec/mongoid/association/eager_loadable_spec.rb +47 -0
  98. data/spec/mongoid/association/eager_spec.rb +2 -2
  99. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
  100. data/spec/mongoid/association/fallback_spec.rb +425 -0
  101. data/spec/mongoid/association/macros_spec.rb +26 -0
  102. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +17 -0
  103. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +11 -0
  104. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +48 -0
  105. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +50 -0
  106. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +33 -0
  107. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +145 -0
  108. data/spec/mongoid/association/referenced/has_many_through/eager_spec.rb +58 -0
  109. data/spec/mongoid/association/referenced/has_many_through/proxy_spec.rb +62 -0
  110. data/spec/mongoid/association/referenced/has_many_through_spec.rb +399 -0
  111. data/spec/mongoid/association/referenced/has_one_through/eager_spec.rb +58 -0
  112. data/spec/mongoid/association/referenced/has_one_through/proxy_spec.rb +49 -0
  113. data/spec/mongoid/association/referenced/has_one_through_spec.rb +211 -0
  114. data/spec/mongoid/atomic/modifiers_spec.rb +347 -0
  115. data/spec/mongoid/attributes/nested_spec.rb +278 -8
  116. data/spec/mongoid/clients/factory_spec.rb +36 -0
  117. data/spec/mongoid/config/defaults_spec.rb +33 -0
  118. data/spec/mongoid/config/encryption_spec.rb +451 -0
  119. data/spec/mongoid/contextual/aggregable/memory_spec.rb +91 -0
  120. data/spec/mongoid/contextual/memory_spec.rb +177 -0
  121. data/spec/mongoid/criteria/includable_spec.rb +1221 -0
  122. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +15 -1
  123. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +201 -0
  124. data/spec/mongoid/criteria_spec.rb +3 -0
  125. data/spec/mongoid/encryptable_spec.rb +115 -0
  126. data/spec/mongoid/errors/config_redactor_spec.rb +112 -0
  127. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +31 -0
  128. data/spec/mongoid/errors/no_client_database_spec.rb +29 -0
  129. data/spec/mongoid/errors/no_client_hosts_spec.rb +26 -0
  130. data/spec/mongoid/errors/readonly_association_spec.rb +34 -0
  131. data/spec/mongoid/extensions/vector_spec.rb +175 -0
  132. data/spec/mongoid/fields_spec.rb +8 -0
  133. data/spec/mongoid/matcher/regexp_budget_spec.rb +570 -0
  134. data/spec/mongoid/search_indexable_spec.rb +321 -9
  135. data/spec/mongoid/tasks/database_spec.rb +31 -0
  136. data/spec/mongoid/timestamps/timeless_spec.rb +197 -5
  137. data/spec/mongoid/touchable_spec.rb +242 -0
  138. data/spec/mongoid/touchable_spec_models.rb +47 -0
  139. data/spec/mongoid/validatable/associated_spec.rb +19 -0
  140. data/spec/spec_helper.rb +5 -1
  141. data/spec/support/crypt/models.rb +253 -0
  142. data/spec/support/models/modifier_models.rb +65 -0
  143. metadata +55 -2
@@ -556,6 +556,27 @@ describe Mongoid::Contextual::Memory do
556
556
  expect(context.distinct('label.sales')).to eq([ BigDecimal('1E2') ])
557
557
  end
558
558
  end
559
+
560
+ context 'when the field name is a method name' do
561
+ let!(:person) do
562
+ Person.create!(ssn: 'secret-ssn')
563
+ end
564
+
565
+ let!(:address) do
566
+ person.addresses.create!(street: 'hobrecht')
567
+ end
568
+
569
+ let(:criteria) do
570
+ Address.all.tap do |crit|
571
+ crit.documents = [ address ]
572
+ end
573
+ end
574
+
575
+ it 'does not call the method' do
576
+ expect(address).not_to receive(:destroy)
577
+ expect(context.distinct(:destroy)).to eq([ nil ])
578
+ end
579
+ end
559
580
  end
560
581
 
561
582
  describe '#each' do
@@ -1714,6 +1735,116 @@ describe Mongoid::Contextual::Memory do
1714
1735
  ])
1715
1736
  end
1716
1737
  end
1738
+
1739
+ context 'when plucking a dynamic attribute' do
1740
+ let(:criteria) do
1741
+ Band.all.tap do |crit|
1742
+ crit.documents = [ Band.create!(name: 'Depeche Mode', mood: 'dark') ]
1743
+ end
1744
+ end
1745
+
1746
+ it 'returns the value from the attributes' do
1747
+ expect(context.pluck(:mood)).to eq([ 'dark' ])
1748
+ end
1749
+ end
1750
+
1751
+ context 'when the field name is a method name' do
1752
+ let!(:person) do
1753
+ Person.create!(ssn: 'secret-ssn')
1754
+ end
1755
+
1756
+ let!(:address) do
1757
+ person.addresses.create!(street: 'hobrecht')
1758
+ end
1759
+
1760
+ let(:criteria) do
1761
+ Address.all.tap do |crit|
1762
+ crit.documents = [ address ]
1763
+ end
1764
+ end
1765
+
1766
+ it 'does not call the method' do
1767
+ expect(address).not_to receive(:destroy)
1768
+ expect(context.pluck(:destroy)).to eq([ nil ])
1769
+ end
1770
+
1771
+ it 'does not return the attributes hash' do
1772
+ expect(context.pluck(:attributes)).to eq([ nil ])
1773
+ end
1774
+
1775
+ it 'does not traverse to the parent document' do
1776
+ expect(context.pluck('_root.ssn')).to eq([ nil ])
1777
+ end
1778
+
1779
+ it 'does not destroy the parent document' do
1780
+ expect(context.pluck('_root.destroy')).to eq([ nil ])
1781
+ expect(Person.where(_id: person.id).count).to eq(1)
1782
+ end
1783
+ end
1784
+
1785
+ context 'when plucking a belongs_to association' do
1786
+ let!(:band) do
1787
+ Band.create!(name: 'Depeche Mode')
1788
+ end
1789
+
1790
+ let!(:artist) do
1791
+ Artist.create!(band: band)
1792
+ end
1793
+
1794
+ let(:criteria) do
1795
+ Artist.all.tap do |crit|
1796
+ crit.documents = [ artist ]
1797
+ end
1798
+ end
1799
+
1800
+ it 'traverses to the associated document' do
1801
+ expect(context.pluck('band.name')).to eq([ 'Depeche Mode' ])
1802
+ end
1803
+
1804
+ it 'returns the document for the association name' do
1805
+ expect(context.pluck(:band)).to eq([ band ])
1806
+ end
1807
+
1808
+ it 'returns the id for the foreign key' do
1809
+ expect(context.pluck(:band_id)).to eq([ band.id ])
1810
+ end
1811
+ end
1812
+
1813
+ context 'when plucking the foreign key of a many to many association' do
1814
+ let!(:preference) do
1815
+ Preference.create!(name: 'nature')
1816
+ end
1817
+
1818
+ let!(:person) do
1819
+ Person.create!(preferences: [ preference ])
1820
+ end
1821
+
1822
+ let(:criteria) do
1823
+ Person.all.tap do |crit|
1824
+ crit.documents = [ person ]
1825
+ end
1826
+ end
1827
+
1828
+ it 'returns the stored ids' do
1829
+ expect(context.pluck(:preference_ids)).to eq([ [ preference.id ] ])
1830
+ end
1831
+ end
1832
+
1833
+ context 'when the field path has an empty segment' do
1834
+ let!(:band) do
1835
+ Band.create!(name: 'Depeche Mode', label: Label.new(name: 'Mute'))
1836
+ end
1837
+
1838
+ let(:criteria) do
1839
+ Band.all.tap do |crit|
1840
+ crit.documents = [ band ]
1841
+ end
1842
+ end
1843
+
1844
+ it 'returns nil' do
1845
+ expect(context.pluck('label..name')).to eq([ nil ])
1846
+ end
1847
+ end
1717
1848
  end
1718
1849
 
1719
1850
  describe '#pick' do
@@ -1770,6 +1901,27 @@ describe Mongoid::Contextual::Memory do
1770
1901
  expect(picked).to be_nil
1771
1902
  end
1772
1903
  end
1904
+
1905
+ context 'when the field name is a method name' do
1906
+ let!(:person) do
1907
+ Person.create!(ssn: 'secret-ssn')
1908
+ end
1909
+
1910
+ let!(:address) do
1911
+ person.addresses.create!(street: 'hobrecht')
1912
+ end
1913
+
1914
+ let(:criteria) do
1915
+ Address.all.tap do |crit|
1916
+ crit.documents = [ address ]
1917
+ end
1918
+ end
1919
+
1920
+ it 'does not call the method' do
1921
+ expect(address).not_to receive(:destroy)
1922
+ expect(context.pick(:destroy)).to be_nil
1923
+ end
1924
+ end
1773
1925
  end
1774
1926
 
1775
1927
  describe '#tally' do
@@ -2234,6 +2386,31 @@ describe Mongoid::Contextual::Memory do
2234
2386
  )
2235
2387
  end
2236
2388
  end
2389
+
2390
+ context 'when the field name is a method name' do
2391
+ let!(:person) do
2392
+ Person.create!(ssn: 'secret-ssn')
2393
+ end
2394
+
2395
+ let!(:address) do
2396
+ person.addresses.create!(street: 'hobrecht')
2397
+ end
2398
+
2399
+ let(:criteria) do
2400
+ Address.all.tap do |crit|
2401
+ crit.documents = [ address ]
2402
+ end
2403
+ end
2404
+
2405
+ it 'does not call the method' do
2406
+ expect(address).not_to receive(:destroy)
2407
+ expect(context.tally(:destroy)).to eq(nil => 1)
2408
+ end
2409
+
2410
+ it 'does not disclose the parent document fields' do
2411
+ expect(context.tally('_root.ssn')).to eq(nil => 1)
2412
+ end
2413
+ end
2237
2414
  end
2238
2415
 
2239
2416
  describe '#inc' do