active_cached_resource 0.0.1.pre
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 +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +22 -0
- data/.standard.yml +2 -0
- data/CHANGELOG.md +5 -0
- data/README.md +45 -0
- data/Rakefile +21 -0
- data/example/consumer/.dockerignore +41 -0
- data/example/consumer/.gitattributes +9 -0
- data/example/consumer/.gitignore +36 -0
- data/example/consumer/.kamal/hooks/docker-setup.sample +3 -0
- data/example/consumer/.kamal/hooks/post-deploy.sample +14 -0
- data/example/consumer/.kamal/hooks/post-proxy-reboot.sample +3 -0
- data/example/consumer/.kamal/hooks/pre-build.sample +51 -0
- data/example/consumer/.kamal/hooks/pre-connect.sample +47 -0
- data/example/consumer/.kamal/hooks/pre-deploy.sample +109 -0
- data/example/consumer/.kamal/hooks/pre-proxy-reboot.sample +3 -0
- data/example/consumer/.kamal/secrets +17 -0
- data/example/consumer/Dockerfile +65 -0
- data/example/consumer/Gemfile +17 -0
- data/example/consumer/Rakefile +6 -0
- data/example/consumer/app/controllers/application_controller.rb +2 -0
- data/example/consumer/app/controllers/concerns/.keep +0 -0
- data/example/consumer/app/jobs/application_job.rb +7 -0
- data/example/consumer/app/mailers/application_mailer.rb +4 -0
- data/example/consumer/app/models/application_record.rb +3 -0
- data/example/consumer/app/models/concerns/.keep +0 -0
- data/example/consumer/app/models/person.rb +9 -0
- data/example/consumer/app/views/layouts/mailer.html.erb +13 -0
- data/example/consumer/app/views/layouts/mailer.text.erb +1 -0
- data/example/consumer/bin/brakeman +7 -0
- data/example/consumer/bin/bundle +109 -0
- data/example/consumer/bin/dev +2 -0
- data/example/consumer/bin/docker-entrypoint +14 -0
- data/example/consumer/bin/jobs +6 -0
- data/example/consumer/bin/kamal +27 -0
- data/example/consumer/bin/rails +4 -0
- data/example/consumer/bin/rake +4 -0
- data/example/consumer/bin/rubocop +8 -0
- data/example/consumer/bin/setup +34 -0
- data/example/consumer/bin/thrust +5 -0
- data/example/consumer/config/application.rb +20 -0
- data/example/consumer/config/boot.rb +3 -0
- data/example/consumer/config/cache.yml +16 -0
- data/example/consumer/config/credentials.yml.enc +1 -0
- data/example/consumer/config/database.yml +14 -0
- data/example/consumer/config/deploy.yml +116 -0
- data/example/consumer/config/environment.rb +5 -0
- data/example/consumer/config/environments/development.rb +64 -0
- data/example/consumer/config/environments/production.rb +85 -0
- data/example/consumer/config/environments/test.rb +50 -0
- data/example/consumer/config/initializers/cors.rb +16 -0
- data/example/consumer/config/initializers/filter_parameter_logging.rb +8 -0
- data/example/consumer/config/initializers/inflections.rb +16 -0
- data/example/consumer/config/locales/en.yml +31 -0
- data/example/consumer/config/puma.rb +41 -0
- data/example/consumer/config/queue.yml +18 -0
- data/example/consumer/config/recurring.yml +10 -0
- data/example/consumer/config/routes.rb +10 -0
- data/example/consumer/config.ru +6 -0
- data/example/consumer/db/cache_schema.rb +14 -0
- data/example/consumer/db/queue_schema.rb +129 -0
- data/example/consumer/db/seeds.rb +0 -0
- data/example/consumer/lib/tasks/.keep +0 -0
- data/example/consumer/log/.keep +0 -0
- data/example/consumer/public/robots.txt +1 -0
- data/example/consumer/script/.keep +0 -0
- data/example/consumer/storage/.keep +0 -0
- data/example/consumer/tmp/.keep +0 -0
- data/example/consumer/tmp/cache/.keep +0 -0
- data/example/consumer/tmp/pids/.keep +0 -0
- data/example/consumer/tmp/storage/.keep +0 -0
- data/example/consumer/vendor/.keep +0 -0
- data/example/provider/.dockerignore +41 -0
- data/example/provider/.gitattributes +9 -0
- data/example/provider/.gitignore +32 -0
- data/example/provider/.kamal/hooks/docker-setup.sample +3 -0
- data/example/provider/.kamal/hooks/post-deploy.sample +14 -0
- data/example/provider/.kamal/hooks/post-proxy-reboot.sample +3 -0
- data/example/provider/.kamal/hooks/pre-build.sample +51 -0
- data/example/provider/.kamal/hooks/pre-connect.sample +47 -0
- data/example/provider/.kamal/hooks/pre-deploy.sample +109 -0
- data/example/provider/.kamal/hooks/pre-proxy-reboot.sample +3 -0
- data/example/provider/.kamal/secrets +17 -0
- data/example/provider/Dockerfile +65 -0
- data/example/provider/Gemfile +14 -0
- data/example/provider/Rakefile +6 -0
- data/example/provider/app/controllers/application_controller.rb +2 -0
- data/example/provider/app/controllers/concerns/.keep +0 -0
- data/example/provider/app/controllers/people_controller.rb +68 -0
- data/example/provider/app/jobs/application_job.rb +7 -0
- data/example/provider/app/mailers/application_mailer.rb +4 -0
- data/example/provider/app/models/address.rb +3 -0
- data/example/provider/app/models/application_record.rb +3 -0
- data/example/provider/app/models/company.rb +3 -0
- data/example/provider/app/models/concerns/.keep +0 -0
- data/example/provider/app/models/person.rb +6 -0
- data/example/provider/app/views/layouts/mailer.html.erb +13 -0
- data/example/provider/app/views/layouts/mailer.text.erb +1 -0
- data/example/provider/bin/brakeman +7 -0
- data/example/provider/bin/bundle +109 -0
- data/example/provider/bin/dev +2 -0
- data/example/provider/bin/docker-entrypoint +14 -0
- data/example/provider/bin/jobs +6 -0
- data/example/provider/bin/kamal +27 -0
- data/example/provider/bin/rails +4 -0
- data/example/provider/bin/rake +4 -0
- data/example/provider/bin/rubocop +8 -0
- data/example/provider/bin/setup +34 -0
- data/example/provider/bin/thrust +5 -0
- data/example/provider/config/application.rb +44 -0
- data/example/provider/config/boot.rb +3 -0
- data/example/provider/config/cache.yml +16 -0
- data/example/provider/config/credentials.yml.enc +1 -0
- data/example/provider/config/database.yml +20 -0
- data/example/provider/config/deploy.yml +116 -0
- data/example/provider/config/environment.rb +5 -0
- data/example/provider/config/environments/development.rb +64 -0
- data/example/provider/config/environments/production.rb +85 -0
- data/example/provider/config/environments/test.rb +50 -0
- data/example/provider/config/initializers/cors.rb +16 -0
- data/example/provider/config/initializers/filter_parameter_logging.rb +8 -0
- data/example/provider/config/initializers/inflections.rb +16 -0
- data/example/provider/config/locales/en.yml +31 -0
- data/example/provider/config/puma.rb +41 -0
- data/example/provider/config/queue.yml +18 -0
- data/example/provider/config/recurring.yml +10 -0
- data/example/provider/config/routes.rb +4 -0
- data/example/provider/config.ru +6 -0
- data/example/provider/db/cache_schema.rb +14 -0
- data/example/provider/db/migrate/20241202183937_create_people.rb +11 -0
- data/example/provider/db/migrate/20241202183955_create_addresses.rb +13 -0
- data/example/provider/db/migrate/20241202184017_create_companies.rb +14 -0
- data/example/provider/db/queue_schema.rb +129 -0
- data/example/provider/db/schema.rb +47 -0
- data/example/provider/db/seeds.rb +18 -0
- data/example/provider/lib/tasks/.keep +0 -0
- data/example/provider/log/.keep +0 -0
- data/example/provider/public/robots.txt +1 -0
- data/example/provider/script/.keep +0 -0
- data/example/provider/storage/.keep +0 -0
- data/example/provider/tmp/.keep +0 -0
- data/example/provider/tmp/pids/.keep +0 -0
- data/example/provider/tmp/storage/.keep +0 -0
- data/example/provider/vendor/.keep +0 -0
- data/lib/active_cached_resource/caching.rb +176 -0
- data/lib/active_cached_resource/caching_strategies/active_support_cache.rb +31 -0
- data/lib/active_cached_resource/caching_strategies/base.rb +114 -0
- data/lib/active_cached_resource/caching_strategies/sql_cache.rb +32 -0
- data/lib/active_cached_resource/configuration.rb +50 -0
- data/lib/active_cached_resource/logger.rb +22 -0
- data/lib/active_cached_resource/model.rb +33 -0
- data/lib/active_cached_resource/version.rb +12 -0
- data/lib/active_cached_resource.rb +64 -0
- data/lib/activeresource/.gitignore +15 -0
- data/lib/activeresource/README.md +283 -0
- data/lib/activeresource/examples/performance.rb +72 -0
- data/lib/activeresource/lib/active_resource/active_job_serializer.rb +26 -0
- data/lib/activeresource/lib/active_resource/associations/builder/association.rb +32 -0
- data/lib/activeresource/lib/active_resource/associations/builder/belongs_to.rb +16 -0
- data/lib/activeresource/lib/active_resource/associations/builder/has_many.rb +14 -0
- data/lib/activeresource/lib/active_resource/associations/builder/has_one.rb +14 -0
- data/lib/activeresource/lib/active_resource/associations.rb +175 -0
- data/lib/activeresource/lib/active_resource/base.rb +1741 -0
- data/lib/activeresource/lib/active_resource/callbacks.rb +22 -0
- data/lib/activeresource/lib/active_resource/collection.rb +214 -0
- data/lib/activeresource/lib/active_resource/connection.rb +298 -0
- data/lib/activeresource/lib/active_resource/custom_methods.rb +129 -0
- data/lib/activeresource/lib/active_resource/exceptions.rb +98 -0
- data/lib/activeresource/lib/active_resource/formats/json_format.rb +28 -0
- data/lib/activeresource/lib/active_resource/formats/xml_format.rb +27 -0
- data/lib/activeresource/lib/active_resource/formats.rb +24 -0
- data/lib/activeresource/lib/active_resource/http_mock.rb +386 -0
- data/lib/activeresource/lib/active_resource/inheriting_hash.rb +34 -0
- data/lib/activeresource/lib/active_resource/log_subscriber.rb +26 -0
- data/lib/activeresource/lib/active_resource/railtie.rb +31 -0
- data/lib/activeresource/lib/active_resource/reflection.rb +78 -0
- data/lib/activeresource/lib/active_resource/schema.rb +60 -0
- data/lib/activeresource/lib/active_resource/singleton.rb +111 -0
- data/lib/activeresource/lib/active_resource/threadsafe_attributes.rb +65 -0
- data/lib/activeresource/lib/active_resource/validations.rb +176 -0
- data/lib/activeresource/lib/active_resource.rb +49 -0
- data/lib/activeresource/lib/activeresource.rb +3 -0
- data/lib/activeresource/test/abstract_unit.rb +153 -0
- data/lib/activeresource/test/cases/active_job_serializer_test.rb +53 -0
- data/lib/activeresource/test/cases/association_test.rb +104 -0
- data/lib/activeresource/test/cases/associations/builder/belongs_to_test.rb +42 -0
- data/lib/activeresource/test/cases/associations/builder/has_many_test.rb +28 -0
- data/lib/activeresource/test/cases/associations/builder/has_one_test.rb +28 -0
- data/lib/activeresource/test/cases/authorization_test.rb +276 -0
- data/lib/activeresource/test/cases/base/custom_methods_test.rb +155 -0
- data/lib/activeresource/test/cases/base/equality_test.rb +53 -0
- data/lib/activeresource/test/cases/base/load_test.rb +249 -0
- data/lib/activeresource/test/cases/base/schema_test.rb +428 -0
- data/lib/activeresource/test/cases/base_errors_test.rb +129 -0
- data/lib/activeresource/test/cases/base_test.rb +1622 -0
- data/lib/activeresource/test/cases/callbacks_test.rb +155 -0
- data/lib/activeresource/test/cases/collection_test.rb +172 -0
- data/lib/activeresource/test/cases/connection_test.rb +357 -0
- data/lib/activeresource/test/cases/finder_test.rb +217 -0
- data/lib/activeresource/test/cases/format_test.rb +137 -0
- data/lib/activeresource/test/cases/http_mock_test.rb +213 -0
- data/lib/activeresource/test/cases/inheritence_test.rb +19 -0
- data/lib/activeresource/test/cases/inheriting_hash_test.rb +25 -0
- data/lib/activeresource/test/cases/log_subscriber_test.rb +63 -0
- data/lib/activeresource/test/cases/reflection_test.rb +65 -0
- data/lib/activeresource/test/cases/validations_test.rb +78 -0
- data/lib/activeresource/test/fixtures/address.rb +20 -0
- data/lib/activeresource/test/fixtures/beast.rb +16 -0
- data/lib/activeresource/test/fixtures/comment.rb +5 -0
- data/lib/activeresource/test/fixtures/customer.rb +5 -0
- data/lib/activeresource/test/fixtures/inventory.rb +14 -0
- data/lib/activeresource/test/fixtures/person.rb +15 -0
- data/lib/activeresource/test/fixtures/pet.rb +6 -0
- data/lib/activeresource/test/fixtures/post.rb +5 -0
- data/lib/activeresource/test/fixtures/product.rb +11 -0
- data/lib/activeresource/test/fixtures/project.rb +19 -0
- data/lib/activeresource/test/fixtures/proxy.rb +6 -0
- data/lib/activeresource/test/fixtures/sound.rb +11 -0
- data/lib/activeresource/test/fixtures/street_address.rb +6 -0
- data/lib/activeresource/test/fixtures/subscription_plan.rb +7 -0
- data/lib/activeresource/test/fixtures/weather.rb +21 -0
- data/lib/activeresource/test/setter_trap.rb +28 -0
- data/lib/activeresource/test/singleton_test.rb +138 -0
- data/lib/activeresource/test/threadsafe_attributes_test.rb +91 -0
- data/lib/generators/active_cached_resource/install_generator.rb +31 -0
- data/lib/generators/active_cached_resource/templates/migration.erb +16 -0
- data/sorbet/config +4 -0
- data/sorbet/rbi/annotations/.gitattributes +1 -0
- data/sorbet/rbi/annotations/activemodel.rbi +89 -0
- data/sorbet/rbi/annotations/activesupport.rbi +457 -0
- data/sorbet/rbi/annotations/minitest.rbi +119 -0
- data/sorbet/rbi/annotations/rainbow.rbi +269 -0
- data/sorbet/rbi/dsl/.gitattributes +1 -0
- data/sorbet/rbi/dsl/active_support/callbacks.rbi +21 -0
- data/sorbet/rbi/gems/.gitattributes +1 -0
- data/sorbet/rbi/gems/actioncable@8.0.0.rbi +252 -0
- data/sorbet/rbi/gems/actionmailbox@8.0.0.rbi +9 -0
- data/sorbet/rbi/gems/actionmailer@8.0.0.rbi +9 -0
- data/sorbet/rbi/gems/actionpack@8.0.0.rbi +20909 -0
- data/sorbet/rbi/gems/actiontext@8.0.0.rbi +9 -0
- data/sorbet/rbi/gems/actionview@8.0.0.rbi +16207 -0
- data/sorbet/rbi/gems/activejob@8.0.0.rbi +9 -0
- data/sorbet/rbi/gems/activemodel-serializers-xml@1.0.3.rbi +166 -0
- data/sorbet/rbi/gems/activemodel@8.0.0.rbi +6857 -0
- data/sorbet/rbi/gems/activerecord@8.0.0.rbi +42896 -0
- data/sorbet/rbi/gems/activeresource@6.1.4.rbi +3944 -0
- data/sorbet/rbi/gems/activestorage@8.0.0.rbi +9 -0
- data/sorbet/rbi/gems/activesupport@8.0.0.rbi +21251 -0
- data/sorbet/rbi/gems/ast@2.4.2.rbi +585 -0
- data/sorbet/rbi/gems/base64@0.2.0.rbi +509 -0
- data/sorbet/rbi/gems/benchmark@0.4.0.rbi +618 -0
- data/sorbet/rbi/gems/bigdecimal@3.1.8.rbi +78 -0
- data/sorbet/rbi/gems/builder@3.3.0.rbi +9 -0
- data/sorbet/rbi/gems/bump@0.10.0.rbi +169 -0
- data/sorbet/rbi/gems/byebug@11.1.3.rbi +3607 -0
- data/sorbet/rbi/gems/coderay@1.1.3.rbi +3427 -0
- data/sorbet/rbi/gems/concurrent-ruby@1.3.4.rbi +11645 -0
- data/sorbet/rbi/gems/connection_pool@2.4.1.rbi +9 -0
- data/sorbet/rbi/gems/crass@1.0.6.rbi +623 -0
- data/sorbet/rbi/gems/date@3.4.0.rbi +75 -0
- data/sorbet/rbi/gems/diff-lcs@1.5.1.rbi +1131 -0
- data/sorbet/rbi/gems/docile@1.4.1.rbi +377 -0
- data/sorbet/rbi/gems/drb@2.2.1.rbi +1347 -0
- data/sorbet/rbi/gems/erubi@1.13.0.rbi +150 -0
- data/sorbet/rbi/gems/globalid@1.2.1.rbi +9 -0
- data/sorbet/rbi/gems/i18n@1.14.6.rbi +2359 -0
- data/sorbet/rbi/gems/io-console@0.7.2.rbi +9 -0
- data/sorbet/rbi/gems/json@2.8.2.rbi +1901 -0
- data/sorbet/rbi/gems/language_server-protocol@3.17.0.3.rbi +14238 -0
- data/sorbet/rbi/gems/lint_roller@1.1.0.rbi +240 -0
- data/sorbet/rbi/gems/logger@1.6.1.rbi +920 -0
- data/sorbet/rbi/gems/loofah@2.23.1.rbi +1081 -0
- data/sorbet/rbi/gems/mail@2.8.1.rbi +9 -0
- data/sorbet/rbi/gems/marcel@1.0.4.rbi +9 -0
- data/sorbet/rbi/gems/method_source@1.1.0.rbi +304 -0
- data/sorbet/rbi/gems/mini_mime@1.1.5.rbi +9 -0
- data/sorbet/rbi/gems/minitest@5.25.2.rbi +1547 -0
- data/sorbet/rbi/gems/net-imap@0.5.1.rbi +9 -0
- data/sorbet/rbi/gems/net-pop@0.1.2.rbi +9 -0
- data/sorbet/rbi/gems/net-protocol@0.2.2.rbi +292 -0
- data/sorbet/rbi/gems/net-smtp@0.5.0.rbi +9 -0
- data/sorbet/rbi/gems/netrc@0.11.0.rbi +159 -0
- data/sorbet/rbi/gems/nio4r@2.7.4.rbi +9 -0
- data/sorbet/rbi/gems/nokogiri@1.16.7.rbi +7311 -0
- data/sorbet/rbi/gems/parallel@1.26.3.rbi +291 -0
- data/sorbet/rbi/gems/parser@3.3.6.0.rbi +5519 -0
- data/sorbet/rbi/gems/prism@1.2.0.rbi +39085 -0
- data/sorbet/rbi/gems/pry-byebug@3.10.1.rbi +1151 -0
- data/sorbet/rbi/gems/pry@0.14.2.rbi +10076 -0
- data/sorbet/rbi/gems/psych@5.2.0.rbi +1785 -0
- data/sorbet/rbi/gems/racc@1.8.1.rbi +162 -0
- data/sorbet/rbi/gems/rack-session@2.0.0.rbi +727 -0
- data/sorbet/rbi/gems/rack-test@2.1.0.rbi +747 -0
- data/sorbet/rbi/gems/rack@3.1.8.rbi +4905 -0
- data/sorbet/rbi/gems/rackup@2.2.1.rbi +230 -0
- data/sorbet/rbi/gems/rails-dom-testing@2.2.0.rbi +758 -0
- data/sorbet/rbi/gems/rails-html-sanitizer@1.6.0.rbi +785 -0
- data/sorbet/rbi/gems/rails@8.0.0.rbi +9 -0
- data/sorbet/rbi/gems/railties@8.0.0.rbi +6287 -0
- data/sorbet/rbi/gems/rainbow@3.1.1.rbi +403 -0
- data/sorbet/rbi/gems/rake@13.2.1.rbi +3091 -0
- data/sorbet/rbi/gems/rbi@0.2.1.rbi +4535 -0
- data/sorbet/rbi/gems/rdoc@6.8.1.rbi +12572 -0
- data/sorbet/rbi/gems/regexp_parser@2.9.2.rbi +3772 -0
- data/sorbet/rbi/gems/reline@0.5.12.rbi +2416 -0
- data/sorbet/rbi/gems/rexml@3.3.9.rbi +4858 -0
- data/sorbet/rbi/gems/rspec-core@3.13.2.rbi +11287 -0
- data/sorbet/rbi/gems/rspec-expectations@3.13.3.rbi +8183 -0
- data/sorbet/rbi/gems/rspec-mocks@3.13.2.rbi +5341 -0
- data/sorbet/rbi/gems/rspec-support@3.13.1.rbi +1630 -0
- data/sorbet/rbi/gems/rspec@3.13.0.rbi +83 -0
- data/sorbet/rbi/gems/rubocop-ast@1.36.1.rbi +7303 -0
- data/sorbet/rbi/gems/rubocop-performance@1.21.1.rbi +9 -0
- data/sorbet/rbi/gems/rubocop@1.65.1.rbi +58170 -0
- data/sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi +1318 -0
- data/sorbet/rbi/gems/securerandom@0.3.2.rbi +395 -0
- data/sorbet/rbi/gems/simplecov-html@0.13.1.rbi +225 -0
- data/sorbet/rbi/gems/simplecov@0.22.0.rbi +2149 -0
- data/sorbet/rbi/gems/simplecov_json_formatter@0.1.4.rbi +9 -0
- data/sorbet/rbi/gems/spoom@1.5.0.rbi +4932 -0
- data/sorbet/rbi/gems/standard-custom@1.0.2.rbi +9 -0
- data/sorbet/rbi/gems/standard-performance@1.4.0.rbi +9 -0
- data/sorbet/rbi/gems/standard@1.40.0.rbi +929 -0
- data/sorbet/rbi/gems/stringio@3.1.2.rbi +9 -0
- data/sorbet/rbi/gems/tapioca@0.16.4.rbi +3597 -0
- data/sorbet/rbi/gems/thor@1.3.2.rbi +4378 -0
- data/sorbet/rbi/gems/timeout@0.4.2.rbi +151 -0
- data/sorbet/rbi/gems/tzinfo@2.0.6.rbi +5918 -0
- data/sorbet/rbi/gems/unicode-display_width@2.6.0.rbi +66 -0
- data/sorbet/rbi/gems/uri@1.0.2.rbi +2377 -0
- data/sorbet/rbi/gems/useragent@0.16.10.rbi +9 -0
- data/sorbet/rbi/gems/websocket-driver@0.7.6.rbi +9 -0
- data/sorbet/rbi/gems/websocket-extensions@0.1.5.rbi +9 -0
- data/sorbet/rbi/gems/yard-sorbet@0.9.0.rbi +435 -0
- data/sorbet/rbi/gems/yard@0.9.37.rbi +18504 -0
- data/sorbet/rbi/gems/zeitwerk@2.7.1.rbi +9 -0
- data/sorbet/tapioca/config.yml +13 -0
- data/sorbet/tapioca/require.rb +12 -0
- metadata +543 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "abstract_unit"
|
|
4
|
+
|
|
5
|
+
require "fixtures/person"
|
|
6
|
+
require "fixtures/customer"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ReflectionTest < ActiveSupport::TestCase
|
|
11
|
+
def test_correct_class_attributes
|
|
12
|
+
object = ActiveResource::Reflection::AssociationReflection.new(:test, :people, {})
|
|
13
|
+
assert_equal :people, object.name
|
|
14
|
+
assert_equal :test, object.macro
|
|
15
|
+
assert_equal({}, object.options)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_correct_class_name_matching_without_class_name
|
|
19
|
+
object = ActiveResource::Reflection::AssociationReflection.new(:test, :people, {})
|
|
20
|
+
assert_equal Person, object.klass
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_correct_class_name_matching_as_string
|
|
24
|
+
object = ActiveResource::Reflection::AssociationReflection.new(:test, :people, class_name: "Person")
|
|
25
|
+
assert_equal Person, object.klass
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_correct_class_name_matching_as_symbol
|
|
29
|
+
object = ActiveResource::Reflection::AssociationReflection.new(:test, :people, class_name: :person)
|
|
30
|
+
assert_equal Person, object.klass
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_correct_class_name_matching_as_class
|
|
34
|
+
object = ActiveResource::Reflection::AssociationReflection.new(:test, :people, class_name: Person)
|
|
35
|
+
assert_equal Person, object.klass
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_correct_class_name_matching_as_string_with_namespace
|
|
39
|
+
object = ActiveResource::Reflection::AssociationReflection.new(:test, :people, class_name: "external/person")
|
|
40
|
+
assert_equal External::Person, object.klass
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def test_correct_class_name_matching_as_plural_string_with_namespace
|
|
44
|
+
object = ActiveResource::Reflection::AssociationReflection.new(:test, :people, class_name: "external/profile_data")
|
|
45
|
+
assert_equal External::ProfileData, object.klass
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_foreign_key_method_with_no_foreign_key_option
|
|
49
|
+
object = ActiveResource::Reflection::AssociationReflection.new(:test, :person, {})
|
|
50
|
+
assert_equal "person_id", object.foreign_key
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_foreign_key_method_with_with_foreign_key_option
|
|
54
|
+
object = ActiveResource::Reflection::AssociationReflection.new(:test, :people, foreign_key: "client_id")
|
|
55
|
+
assert_equal "client_id", object.foreign_key
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_creation_of_reflection
|
|
59
|
+
Person.reflections = {}
|
|
60
|
+
object = Person.create_reflection(:test, :people, {})
|
|
61
|
+
assert_equal ActiveResource::Reflection::AssociationReflection, object.class
|
|
62
|
+
assert_equal 1, Person.reflections.count
|
|
63
|
+
assert_equal Person, Person.reflections[:people].klass
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "abstract_unit"
|
|
4
|
+
require "fixtures/project"
|
|
5
|
+
require "active_support/core_ext/hash/conversions"
|
|
6
|
+
|
|
7
|
+
# The validations are tested thoroughly under ActiveModel::Validations
|
|
8
|
+
# This test case simply makes sure that they are all accessible by
|
|
9
|
+
# Active Resource objects.
|
|
10
|
+
class ValidationsTest < ActiveSupport::TestCase
|
|
11
|
+
VALID_PROJECT_HASH = { name: "My Project", description: "A project" }
|
|
12
|
+
def setup
|
|
13
|
+
@my_proj = { "person" => VALID_PROJECT_HASH }.to_json
|
|
14
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
|
15
|
+
mock.post "/projects.json", {}, @my_proj, 201, "Location" => "/projects/5.json"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_validates_presence_of
|
|
20
|
+
p = new_project(name: nil)
|
|
21
|
+
assert_not p.valid?, "should not be a valid record without name"
|
|
22
|
+
assert_not p.save, "should not have saved an invalid record"
|
|
23
|
+
assert_equal ["can't be blank"], p.errors[:name], "should have an error on name"
|
|
24
|
+
|
|
25
|
+
p.name = "something"
|
|
26
|
+
|
|
27
|
+
assert p.save, "should have saved after fixing the validation, but had: #{p.errors.inspect}"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_fails_save!
|
|
31
|
+
p = new_project(name: nil)
|
|
32
|
+
assert_raise(ActiveResource::ResourceInvalid) { p.save! }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_save_without_validation
|
|
36
|
+
p = new_project(name: nil)
|
|
37
|
+
assert_not p.save
|
|
38
|
+
assert p.save(validate: false)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_validate_callback
|
|
42
|
+
# we have a callback ensuring the description is longer than three letters
|
|
43
|
+
p = new_project(description: "a")
|
|
44
|
+
assert_not p.valid?, "should not be a valid record when it fails a validation callback"
|
|
45
|
+
assert_not p.save, "should not have saved an invalid record"
|
|
46
|
+
assert_equal ["must be greater than three letters long"], p.errors[:description], "should be an error on description"
|
|
47
|
+
|
|
48
|
+
# should now allow this description
|
|
49
|
+
p.description = "abcd"
|
|
50
|
+
assert p.save, "should have saved after fixing the validation, but had: #{p.errors.inspect}"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_client_side_validation_maximum
|
|
54
|
+
project = Project.new(description: "123456789012345")
|
|
55
|
+
assert_not project.valid?
|
|
56
|
+
assert_equal ["is too long (maximum is 10 characters)"], project.errors[:description]
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def test_invalid_method
|
|
60
|
+
p = new_project
|
|
61
|
+
|
|
62
|
+
assert_not p.invalid?
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_validate_bang_method
|
|
66
|
+
p = new_project(name: nil)
|
|
67
|
+
|
|
68
|
+
assert_raise(ActiveModel::ValidationError) { p.validate! }
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
protected
|
|
72
|
+
# quickie helper to create a new project with all the required
|
|
73
|
+
# attributes.
|
|
74
|
+
# Pass in any params you specifically want to override
|
|
75
|
+
def new_project(opts = {})
|
|
76
|
+
Project.new(VALID_PROJECT_HASH.merge(opts))
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# turns everything into the same object
|
|
4
|
+
class AddressXMLFormatter
|
|
5
|
+
include ActiveResource::Formats::XmlFormat
|
|
6
|
+
|
|
7
|
+
def decode(xml)
|
|
8
|
+
data = ActiveResource::Formats::XmlFormat.decode(xml)
|
|
9
|
+
# process address fields
|
|
10
|
+
data.each do |address|
|
|
11
|
+
address["city_state"] = "#{address['city']}, #{address['state']}"
|
|
12
|
+
end
|
|
13
|
+
data
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class AddressResource < ActiveResource::Base
|
|
18
|
+
self.element_name = "address"
|
|
19
|
+
self.format = AddressXMLFormatter.new
|
|
20
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class BeastResource < ActiveResource::Base
|
|
4
|
+
self.site = "http://beast.caboo.se"
|
|
5
|
+
site.user = "foo"
|
|
6
|
+
site.password = "bar"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class Forum < BeastResource
|
|
10
|
+
# taken from BeastResource
|
|
11
|
+
# self.site = 'http://beast.caboo.se'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class Topic < BeastResource
|
|
15
|
+
self.site += "/forums/:forum_id"
|
|
16
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Inventory < ActiveResource::Base
|
|
4
|
+
include ActiveResource::Singleton
|
|
5
|
+
self.site = "http://37s.sunrise.i:3000"
|
|
6
|
+
self.prefix = "/products/:product_id/"
|
|
7
|
+
|
|
8
|
+
schema do
|
|
9
|
+
integer :total
|
|
10
|
+
integer :used
|
|
11
|
+
|
|
12
|
+
string :status
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Person < ActiveResource::Base
|
|
4
|
+
self.site = "http://37s.sunrise.i:3000"
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
module External
|
|
8
|
+
class Person < ActiveResource::Base
|
|
9
|
+
self.site = "http://atq.caffeine.intoxication.it"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class ProfileData < ActiveResource::Base
|
|
13
|
+
self.site = "http://external.profile.data.nl"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Product < ActiveResource::Base
|
|
4
|
+
self.site = "http://37s.sunrise.i:3000"
|
|
5
|
+
# X-Inherited-Header is for testing that any subclasses
|
|
6
|
+
# include the headers of this class
|
|
7
|
+
self.headers["X-Inherited-Header"] = "present"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class SubProduct < Product
|
|
11
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# used to test validations
|
|
4
|
+
class Project < ActiveResource::Base
|
|
5
|
+
self.site = "http://37s.sunrise.i:3000"
|
|
6
|
+
schema do
|
|
7
|
+
string :email
|
|
8
|
+
string :name
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
validates :name, presence: true
|
|
12
|
+
validates :description, presence: false, length: { maximum: 10 }
|
|
13
|
+
validate :description_greater_than_three_letters
|
|
14
|
+
|
|
15
|
+
# to test the validate *callback* works
|
|
16
|
+
def description_greater_than_three_letters
|
|
17
|
+
errors.add :description, "must be greater than three letters long" if description.length < 3 unless description.blank?
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Weather < ActiveResource::Base
|
|
4
|
+
include ActiveResource::Singleton
|
|
5
|
+
self.site = "http://37s.sunrise.i:3000"
|
|
6
|
+
|
|
7
|
+
schema do
|
|
8
|
+
string :status
|
|
9
|
+
string :temperature
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class WeatherDashboard < ActiveResource::Base
|
|
14
|
+
include ActiveResource::Singleton
|
|
15
|
+
self.site = "http://37s.sunrise.i:3000"
|
|
16
|
+
self.singleton_name = "dashboard"
|
|
17
|
+
|
|
18
|
+
schema do
|
|
19
|
+
string :status
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class SetterTrap < BasicObject
|
|
4
|
+
class << self
|
|
5
|
+
def rollback_sets(obj)
|
|
6
|
+
trapped = new(obj)
|
|
7
|
+
yield(trapped).tap { trapped.rollback_sets }
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def initialize(obj)
|
|
12
|
+
@cache = {}
|
|
13
|
+
@obj = obj
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def respond_to?(method)
|
|
17
|
+
@obj.respond_to?(method)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def method_missing(method, *args, &proc)
|
|
21
|
+
@cache[method] ||= @obj.send($`) if method.to_s =~ /=$/
|
|
22
|
+
@obj.send method, *args, &proc
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def rollback_sets
|
|
26
|
+
@cache.each { |k, v| @obj.send k, v }
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "abstract_unit"
|
|
4
|
+
require "fixtures/weather"
|
|
5
|
+
require "fixtures/inventory"
|
|
6
|
+
|
|
7
|
+
class SingletonTest < ActiveSupport::TestCase
|
|
8
|
+
def setup_weather
|
|
9
|
+
weather = { status: "Sunny", temperature: 67 }
|
|
10
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
|
11
|
+
mock.get "/weather.json", {}, weather.to_json
|
|
12
|
+
mock.get "/weather.json?degrees=fahrenheit", {}, weather.merge(temperature: 100).to_json
|
|
13
|
+
mock.post "/weather.json", {}, weather.to_json, 201, "Location" => "/weather.json"
|
|
14
|
+
mock.delete "/weather.json", {}, nil
|
|
15
|
+
mock.put "/weather.json", {}, nil, 204
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def setup_weather_not_found
|
|
20
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
|
21
|
+
mock.get "/weather.json", {}, nil, 404
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def setup_inventory
|
|
26
|
+
inventory = { status: "Sold Out", total: 10, used: 10 }.to_json
|
|
27
|
+
|
|
28
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
|
29
|
+
mock.get "/products/5/inventory.json", {}, inventory
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_custom_singleton_name
|
|
34
|
+
assert_equal "dashboard", WeatherDashboard.singleton_name
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_singleton_path
|
|
38
|
+
assert_equal "/weather.json", Weather.singleton_path
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_singleton_path_with_parameters
|
|
42
|
+
assert_equal "/weather.json?degrees=fahrenheit", Weather.singleton_path(degrees: "fahrenheit")
|
|
43
|
+
assert_equal "/weather.json?degrees=false", Weather.singleton_path(degrees: false)
|
|
44
|
+
assert_equal "/weather.json?degrees=", Weather.singleton_path(degrees: nil)
|
|
45
|
+
|
|
46
|
+
assert_equal "/weather.json?degrees=fahrenheit", Weather.singleton_path("degrees" => "fahrenheit")
|
|
47
|
+
|
|
48
|
+
# Use include? because ordering of param hash is not guaranteed
|
|
49
|
+
path = Weather.singleton_path(degrees: "fahrenheit", lunar: true)
|
|
50
|
+
assert path.include?("weather.json")
|
|
51
|
+
assert path.include?("degrees=fahrenheit")
|
|
52
|
+
assert path.include?("lunar=true")
|
|
53
|
+
|
|
54
|
+
path = Weather.singleton_path(days: ["monday", "saturday and sunday", nil, false])
|
|
55
|
+
assert_equal "/weather.json?days%5B%5D=monday&days%5B%5D=saturday+and+sunday&days%5B%5D=&days%5B%5D=false", path
|
|
56
|
+
|
|
57
|
+
path = Inventory.singleton_path(product_id: 5)
|
|
58
|
+
assert_equal "/products/5/inventory.json", path
|
|
59
|
+
|
|
60
|
+
path = Inventory.singleton_path({ product_id: 5 }, { sold: true })
|
|
61
|
+
assert_equal "/products/5/inventory.json?sold=true", path
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_find_singleton
|
|
65
|
+
setup_weather
|
|
66
|
+
weather = Weather.send(:find_singleton, Hash.new)
|
|
67
|
+
assert_not_nil weather
|
|
68
|
+
assert_equal "Sunny", weather.status
|
|
69
|
+
assert_equal 67, weather.temperature
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def test_find
|
|
73
|
+
setup_weather
|
|
74
|
+
weather = Weather.find
|
|
75
|
+
assert_not_nil weather
|
|
76
|
+
assert_equal "Sunny", weather.status
|
|
77
|
+
assert_equal 67, weather.temperature
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_find_with_param_options
|
|
81
|
+
setup_inventory
|
|
82
|
+
inventory = Inventory.find(params: { product_id: 5 })
|
|
83
|
+
|
|
84
|
+
assert_not_nil inventory
|
|
85
|
+
assert_equal "Sold Out", inventory.status
|
|
86
|
+
assert_equal 10, inventory.used
|
|
87
|
+
assert_equal 10, inventory.total
|
|
88
|
+
assert_equal({ product_id: 5 }, inventory.prefix_options)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def test_find_with_query_options
|
|
92
|
+
setup_weather
|
|
93
|
+
|
|
94
|
+
weather = Weather.find(params: { degrees: "fahrenheit" })
|
|
95
|
+
assert_not_nil weather
|
|
96
|
+
assert_equal "Sunny", weather.status
|
|
97
|
+
assert_equal 100, weather.temperature
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def test_not_found
|
|
101
|
+
setup_weather_not_found
|
|
102
|
+
|
|
103
|
+
assert_raise ActiveResource::ResourceNotFound do
|
|
104
|
+
Weather.find
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def test_create_singleton
|
|
109
|
+
setup_weather
|
|
110
|
+
weather = Weather.create(status: "Sunny", temperature: 67)
|
|
111
|
+
assert_not_nil weather
|
|
112
|
+
assert_equal "Sunny", weather.status
|
|
113
|
+
assert_equal 67, weather.temperature
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def test_destroy
|
|
117
|
+
setup_weather
|
|
118
|
+
|
|
119
|
+
# First Create the Weather
|
|
120
|
+
weather = Weather.create(status: "Sunny", temperature: 67)
|
|
121
|
+
assert_not_nil weather
|
|
122
|
+
|
|
123
|
+
# Now Destroy it
|
|
124
|
+
weather.destroy
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def test_update
|
|
128
|
+
setup_weather
|
|
129
|
+
|
|
130
|
+
# First Create the Weather
|
|
131
|
+
weather = Weather.create(status: "Sunny", temperature: 67)
|
|
132
|
+
assert_not_nil weather
|
|
133
|
+
|
|
134
|
+
# Then update it
|
|
135
|
+
weather.status = "Rainy"
|
|
136
|
+
weather.save
|
|
137
|
+
end
|
|
138
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "abstract_unit"
|
|
4
|
+
|
|
5
|
+
class ThreadsafeAttributesTest < ActiveSupport::TestCase
|
|
6
|
+
class TestClass
|
|
7
|
+
include ThreadsafeAttributes
|
|
8
|
+
threadsafe_attribute :safeattr
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
setup do
|
|
12
|
+
@tester = TestClass.new
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
test "#threadsafe attributes work in a single thread" do
|
|
16
|
+
assert_not @tester.safeattr_defined?
|
|
17
|
+
assert_nil @tester.safeattr
|
|
18
|
+
@tester.safeattr = "a value"
|
|
19
|
+
assert @tester.safeattr_defined?
|
|
20
|
+
assert_equal "a value", @tester.safeattr
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
test "#threadsafe attributes inherit the value of the main thread" do
|
|
24
|
+
@tester.safeattr = "a value"
|
|
25
|
+
Thread.new do
|
|
26
|
+
assert @tester.safeattr_defined?
|
|
27
|
+
assert_equal "a value", @tester.safeattr
|
|
28
|
+
end.join
|
|
29
|
+
assert_equal "a value", @tester.safeattr
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
test "#changing a threadsafe attribute in a thread does not affect the main thread" do
|
|
33
|
+
@tester.safeattr = "a value"
|
|
34
|
+
Thread.new do
|
|
35
|
+
@tester.safeattr = "a new value"
|
|
36
|
+
assert_equal "a new value", @tester.safeattr
|
|
37
|
+
end.join
|
|
38
|
+
assert_equal "a value", @tester.safeattr
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
test "#threadsafe attributes inherit the value of the main thread when value is nil/false" do
|
|
42
|
+
@tester.safeattr = false
|
|
43
|
+
Thread.new do
|
|
44
|
+
assert @tester.safeattr_defined?
|
|
45
|
+
assert_equal false, @tester.safeattr
|
|
46
|
+
end.join
|
|
47
|
+
assert_equal false, @tester.safeattr
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
test "#changing a threadsafe attribute in a thread sets an equal value for the main thread, if no value has been set" do
|
|
51
|
+
assert_not @tester.safeattr_defined?
|
|
52
|
+
assert_nil @tester.safeattr
|
|
53
|
+
Thread.new do
|
|
54
|
+
@tester.safeattr = "value from child"
|
|
55
|
+
assert_equal "value from child", @tester.safeattr
|
|
56
|
+
end.join
|
|
57
|
+
assert @tester.safeattr_defined?
|
|
58
|
+
assert_equal "value from child", @tester.safeattr
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
test "#threadsafe attributes can retrieve non-duplicable from main thread" do
|
|
62
|
+
@tester.safeattr = :symbol_1
|
|
63
|
+
Thread.new do
|
|
64
|
+
assert_equal :symbol_1, @tester.safeattr
|
|
65
|
+
end.join
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
test "#threadsafe attributes work in fibers" do
|
|
69
|
+
@tester.safeattr = :symbol_1
|
|
70
|
+
Fiber.new do
|
|
71
|
+
assert_equal :symbol_1, @tester.safeattr
|
|
72
|
+
end.resume
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
unless RUBY_PLATFORM == "java"
|
|
76
|
+
test "threadsafe attributes can be accessed after forking within a thread" do
|
|
77
|
+
reader, writer = IO.pipe
|
|
78
|
+
@tester.safeattr = "a value"
|
|
79
|
+
Thread.new do
|
|
80
|
+
fork do
|
|
81
|
+
reader.close
|
|
82
|
+
writer.print(@tester.safeattr)
|
|
83
|
+
writer.close
|
|
84
|
+
end
|
|
85
|
+
end.join
|
|
86
|
+
writer.close
|
|
87
|
+
assert_equal "a value", reader.read
|
|
88
|
+
reader.close
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require "rails/generators/active_record"
|
|
2
|
+
|
|
3
|
+
module ActiveCachedResource
|
|
4
|
+
module Generators
|
|
5
|
+
class ActiveRecordGenerator < ::Rails::Generators::Base
|
|
6
|
+
include ::Rails::Generators::Migration
|
|
7
|
+
desc "Generates migration for cache tables"
|
|
8
|
+
|
|
9
|
+
source_paths << File.join(File.dirname(__FILE__), "templates")
|
|
10
|
+
|
|
11
|
+
def self.next_migration_number(dirname)
|
|
12
|
+
::ActiveRecord::Generators::Base.next_migration_number(dirname)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.migration_version
|
|
16
|
+
"[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def create_migration_file
|
|
20
|
+
options = {
|
|
21
|
+
migration_version: migration_version
|
|
22
|
+
}
|
|
23
|
+
migration_template "migration.erb", "db/migrate/create_active_cached_resource_table.rb", options
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def migration_version
|
|
27
|
+
self.class.migration_version
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class CreateActiveCachedResourceTable < ActiveRecord::Migration<%= migration_version %>
|
|
2
|
+
def up
|
|
3
|
+
create_table :active_cached_resources, id: false do |t|
|
|
4
|
+
t.binary :key, limit: 512, null: false
|
|
5
|
+
t.binary :value, null: false
|
|
6
|
+
t.datetime :expires_at, null: false
|
|
7
|
+
|
|
8
|
+
t.index [:key, :expires_at], unique: true, name: "index_active_cached_resources_on_key_and_expires_at"
|
|
9
|
+
t.index :key, name: "index_active_cached_resources_on_key"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def down
|
|
14
|
+
drop_table :active_cached_resources
|
|
15
|
+
end
|
|
16
|
+
end
|
data/sorbet/config
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
**/*.rbi linguist-vendored=true
|