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.
- checksums.yaml +4 -4
- data/lib/config/locales/en.yml +69 -0
- data/lib/mongoid/association/accessors.rb +27 -5
- data/lib/mongoid/association/depending.rb +14 -10
- data/lib/mongoid/association/eager.rb +9 -0
- data/lib/mongoid/association/eager_load/discriminated_inclusion.rb +88 -0
- data/lib/mongoid/association/eager_load/embedded_distributor.rb +151 -0
- data/lib/mongoid/association/eager_load/inclusion.rb +173 -0
- data/lib/mongoid/association/eager_load/inclusion_tree.rb +96 -0
- data/lib/mongoid/association/eager_load/lookup_pipeline.rb +121 -0
- data/lib/mongoid/association/eager_load/polymorphic_preloader.rb +61 -0
- data/lib/mongoid/association/eager_load/polymorphic_targets.rb +151 -0
- data/lib/mongoid/association/eager_loadable.rb +65 -101
- data/lib/mongoid/association/embedded/batchable.rb +17 -1
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +6 -1
- data/lib/mongoid/association/embedded/embeds_one.rb +1 -0
- data/lib/mongoid/association/macros.rb +13 -1
- data/lib/mongoid/association/nested/many.rb +34 -5
- data/lib/mongoid/association/nested/nested_buildable.rb +14 -0
- data/lib/mongoid/association/nested/one.rb +6 -1
- data/lib/mongoid/association/options.rb +17 -0
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +6 -1
- data/lib/mongoid/association/referenced/belongs_to.rb +1 -0
- data/lib/mongoid/association/referenced/counter_cache.rb +3 -3
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +6 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +5 -0
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +3 -1
- data/lib/mongoid/association/referenced/has_many/proxy.rb +100 -1
- data/lib/mongoid/association/referenced/has_many_through/eager.rb +99 -0
- data/lib/mongoid/association/referenced/has_many_through/proxy.rb +68 -0
- data/lib/mongoid/association/referenced/has_many_through.rb +201 -0
- data/lib/mongoid/association/referenced/has_one.rb +1 -0
- data/lib/mongoid/association/referenced/has_one_through/eager.rb +65 -0
- data/lib/mongoid/association/referenced/has_one_through/proxy.rb +30 -0
- data/lib/mongoid/association/referenced/has_one_through.rb +167 -0
- data/lib/mongoid/association/referenced.rb +2 -0
- data/lib/mongoid/association/relatable.rb +58 -0
- data/lib/mongoid/association.rb +15 -0
- data/lib/mongoid/atomic/modifiers.rb +100 -16
- data/lib/mongoid/clients/factory.rb +9 -13
- data/lib/mongoid/collection_configurable.rb +8 -0
- data/lib/mongoid/config/defaults.rb +0 -1
- data/lib/mongoid/config/encryption.rb +170 -22
- data/lib/mongoid/config.rb +56 -5
- data/lib/mongoid/contextual/aggregable/memory.rb +6 -2
- data/lib/mongoid/contextual/memory.rb +18 -7
- data/lib/mongoid/criteria/includable.rb +35 -11
- data/lib/mongoid/criteria/queryable/mergeable.rb +4 -0
- data/lib/mongoid/criteria/queryable/selectable.rb +123 -7
- data/lib/mongoid/deprecable.rb +45 -2
- data/lib/mongoid/document.rb +3 -0
- data/lib/mongoid/encryptable.rb +73 -0
- data/lib/mongoid/errors/config_redactor.rb +43 -0
- data/lib/mongoid/errors/in_memory_regexp_timeout.rb +26 -0
- data/lib/mongoid/errors/invalid_encryption_schema.rb +27 -0
- data/lib/mongoid/errors/mixed_client_configuration.rb +1 -1
- data/lib/mongoid/errors/no_client_database.rb +1 -1
- data/lib/mongoid/errors/no_client_hosts.rb +1 -1
- data/lib/mongoid/errors/no_encryption_schema.rb +30 -0
- data/lib/mongoid/errors/readonly_association.rb +29 -0
- data/lib/mongoid/errors.rb +5 -0
- data/lib/mongoid/extensions/vector.rb +64 -0
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/field_readable.rb +69 -0
- data/lib/mongoid/fields.rb +7 -0
- data/lib/mongoid/indexable.rb +38 -26
- data/lib/mongoid/matchable.rb +6 -1
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +2 -4
- data/lib/mongoid/matcher/regex.rb +11 -12
- data/lib/mongoid/matcher/regexp_budget.rb +372 -0
- data/lib/mongoid/matcher.rb +1 -0
- data/lib/mongoid/persistable/creatable.rb +120 -14
- data/lib/mongoid/persistable/updatable.rb +9 -11
- data/lib/mongoid/persistable.rb +15 -15
- data/lib/mongoid/persistence_context.rb +77 -0
- data/lib/mongoid/search_indexable.rb +69 -24
- data/lib/mongoid/serializable.rb +12 -4
- data/lib/mongoid/tasks/database.rb +33 -16
- data/lib/mongoid/threaded.rb +36 -0
- data/lib/mongoid/timestamps/timeless.rb +84 -10
- data/lib/mongoid/touchable.rb +28 -1
- data/lib/mongoid/traversable.rb +2 -2
- data/lib/mongoid/validatable/associated.rb +18 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +4 -0
- data/spec/integration/app_spec.rb +7 -1
- data/spec/integration/associations/belongs_to_spec.rb +13 -0
- data/spec/integration/associations/embedded_delayed_atomic_sets_spec.rb +216 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +31 -2
- data/spec/integration/atomic/modifiers_spec.rb +283 -0
- data/spec/integration/dots_and_dollars_spec.rb +12 -2
- data/spec/integration/encryption_spec.rb +300 -0
- data/spec/integration/matcher_operator_data/regex.yml +21 -0
- data/spec/integration/matcher_regexp_timeout_spec.rb +215 -0
- data/spec/integration/query_operator_guard_spec.rb +89 -0
- data/spec/mongoid/association/accessors_spec.rb +35 -0
- data/spec/mongoid/association/eager_loadable_spec.rb +47 -0
- data/spec/mongoid/association/eager_spec.rb +2 -2
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
- data/spec/mongoid/association/fallback_spec.rb +425 -0
- data/spec/mongoid/association/macros_spec.rb +26 -0
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +17 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +11 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +48 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +50 -0
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +33 -0
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +145 -0
- data/spec/mongoid/association/referenced/has_many_through/eager_spec.rb +58 -0
- data/spec/mongoid/association/referenced/has_many_through/proxy_spec.rb +62 -0
- data/spec/mongoid/association/referenced/has_many_through_spec.rb +399 -0
- data/spec/mongoid/association/referenced/has_one_through/eager_spec.rb +58 -0
- data/spec/mongoid/association/referenced/has_one_through/proxy_spec.rb +49 -0
- data/spec/mongoid/association/referenced/has_one_through_spec.rb +211 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +347 -0
- data/spec/mongoid/attributes/nested_spec.rb +278 -8
- data/spec/mongoid/clients/factory_spec.rb +36 -0
- data/spec/mongoid/config/defaults_spec.rb +33 -0
- data/spec/mongoid/config/encryption_spec.rb +451 -0
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +91 -0
- data/spec/mongoid/contextual/memory_spec.rb +177 -0
- data/spec/mongoid/criteria/includable_spec.rb +1221 -0
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +15 -1
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +201 -0
- data/spec/mongoid/criteria_spec.rb +3 -0
- data/spec/mongoid/encryptable_spec.rb +115 -0
- data/spec/mongoid/errors/config_redactor_spec.rb +112 -0
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +31 -0
- data/spec/mongoid/errors/no_client_database_spec.rb +29 -0
- data/spec/mongoid/errors/no_client_hosts_spec.rb +26 -0
- data/spec/mongoid/errors/readonly_association_spec.rb +34 -0
- data/spec/mongoid/extensions/vector_spec.rb +175 -0
- data/spec/mongoid/fields_spec.rb +8 -0
- data/spec/mongoid/matcher/regexp_budget_spec.rb +570 -0
- data/spec/mongoid/search_indexable_spec.rb +321 -9
- data/spec/mongoid/tasks/database_spec.rb +31 -0
- data/spec/mongoid/timestamps/timeless_spec.rb +197 -5
- data/spec/mongoid/touchable_spec.rb +242 -0
- data/spec/mongoid/touchable_spec_models.rb +47 -0
- data/spec/mongoid/validatable/associated_spec.rb +19 -0
- data/spec/spec_helper.rb +5 -1
- data/spec/support/crypt/models.rb +253 -0
- data/spec/support/models/modifier_models.rb +65 -0
- 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
|