hyper-mesh 0.5.2 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +34 -0
- data/README.md +10 -11
- data/docs/activerecord_api.md +55 -39
- data/docs/authorization-policies.md +62 -19
- data/docs/client_side_scoping.md +1 -1
- data/docs/word_game.md +26 -0
- data/examples/action-cable-production-mode/.gitignore +21 -0
- data/examples/action-cable-production-mode/Gemfile +57 -0
- data/examples/action-cable-production-mode/Gemfile.lock +231 -0
- data/examples/action-cable-production-mode/README.md +24 -0
- data/examples/action-cable-production-mode/Rakefile +6 -0
- data/examples/action-cable-production-mode/app/assets/config/manifest.js +3 -0
- data/examples/action-cable-production-mode/app/assets/images/.keep +0 -0
- data/examples/action-cable-production-mode/app/assets/javascripts/application.js +20 -0
- data/examples/action-cable-production-mode/app/assets/javascripts/cable.js +13 -0
- data/examples/action-cable-production-mode/app/assets/javascripts/channels/.keep +0 -0
- data/examples/action-cable-production-mode/app/assets/stylesheets/application.css +15 -0
- data/examples/action-cable-production-mode/app/channels/application_cable/channel.rb +4 -0
- data/examples/action-cable-production-mode/app/channels/application_cable/connection.rb +4 -0
- data/examples/action-cable-production-mode/app/controllers/application_controller.rb +3 -0
- data/examples/action-cable-production-mode/app/controllers/test_controller.rb +5 -0
- data/examples/action-cable-production-mode/app/models/models.rb +2 -0
- data/examples/action-cable-production-mode/app/models/public/application_record.rb +3 -0
- data/examples/action-cable-production-mode/app/models/public/word.rb +2 -0
- data/examples/action-cable-production-mode/app/policies/application_policy.rb +14 -0
- data/examples/action-cable-production-mode/app/views/components.rb +16 -0
- data/examples/action-cable-production-mode/app/views/components/app.rb +18 -0
- data/examples/action-cable-production-mode/app/views/layouts/application.html.erb +14 -0
- data/examples/action-cable-production-mode/bin/bundle +3 -0
- data/examples/action-cable-production-mode/bin/rails +9 -0
- data/examples/action-cable-production-mode/bin/rake +9 -0
- data/examples/action-cable-production-mode/bin/setup +34 -0
- data/examples/action-cable-production-mode/bin/spring +16 -0
- data/examples/action-cable-production-mode/bin/update +29 -0
- data/examples/action-cable-production-mode/config.ru +5 -0
- data/examples/action-cable-production-mode/config/application.rb +18 -0
- data/examples/action-cable-production-mode/config/boot.rb +3 -0
- data/examples/action-cable-production-mode/config/cable.yml +9 -0
- data/examples/action-cable-production-mode/config/database.yml +25 -0
- data/examples/action-cable-production-mode/config/environment.rb +5 -0
- data/examples/action-cable-production-mode/config/environments/development.rb +56 -0
- data/examples/action-cable-production-mode/config/environments/production.rb +89 -0
- data/examples/action-cable-production-mode/config/environments/test.rb +42 -0
- data/examples/action-cable-production-mode/config/initializers/application_controller_renderer.rb +6 -0
- data/examples/action-cable-production-mode/config/initializers/assets.rb +11 -0
- data/examples/action-cable-production-mode/config/initializers/backtrace_silencers.rb +7 -0
- data/examples/action-cable-production-mode/config/initializers/cookies_serializer.rb +5 -0
- data/examples/action-cable-production-mode/config/initializers/filter_parameter_logging.rb +4 -0
- data/examples/action-cable-production-mode/config/initializers/hyper_mesh.rb +4 -0
- data/examples/action-cable-production-mode/config/initializers/inflections.rb +16 -0
- data/examples/action-cable-production-mode/config/initializers/mime_types.rb +4 -0
- data/examples/action-cable-production-mode/config/initializers/new_framework_defaults.rb +24 -0
- data/examples/action-cable-production-mode/config/initializers/session_store.rb +3 -0
- data/examples/action-cable-production-mode/config/initializers/wrap_parameters.rb +14 -0
- data/examples/action-cable-production-mode/config/locales/en.yml +23 -0
- data/examples/action-cable-production-mode/config/puma.rb +47 -0
- data/examples/action-cable-production-mode/config/routes.rb +5 -0
- data/examples/action-cable-production-mode/config/secrets.yml +22 -0
- data/examples/action-cable-production-mode/config/spring.rb +6 -0
- data/examples/action-cable-production-mode/db/migrate/20161114213840_create_words.rb +9 -0
- data/examples/action-cable-production-mode/db/schema.rb +34 -0
- data/examples/action-cable-production-mode/db/seeds.rb +7 -0
- data/examples/action-cable-production-mode/lib/assets/.keep +0 -0
- data/examples/action-cable-production-mode/lib/tasks/.keep +0 -0
- data/examples/action-cable-production-mode/log/.keep +0 -0
- data/examples/action-cable-production-mode/public/404.html +67 -0
- data/examples/action-cable-production-mode/public/422.html +67 -0
- data/examples/action-cable-production-mode/public/500.html +66 -0
- data/examples/action-cable-production-mode/public/apple-touch-icon-precomposed.png +0 -0
- data/examples/action-cable-production-mode/public/apple-touch-icon.png +0 -0
- data/examples/action-cable-production-mode/public/assets/.sprockets-manifest-3e9abd3ee8ba47c39a55b61ae37ed9e1.json +1 -0
- data/examples/action-cable-production-mode/public/assets/application-90043e04e9e784054fd08159fa7aafe5e23d3ffb31584b1bea1e47043c9cfb5a.js +50 -0
- data/examples/action-cable-production-mode/public/assets/application-90043e04e9e784054fd08159fa7aafe5e23d3ffb31584b1bea1e47043c9cfb5a.js.gz +0 -0
- data/examples/action-cable-production-mode/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css +0 -0
- data/examples/action-cable-production-mode/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css.gz +0 -0
- data/examples/action-cable-production-mode/public/favicon.ico +0 -0
- data/examples/action-cable-production-mode/public/robots.txt +5 -0
- data/examples/action-cable-production-mode/test/controllers/.keep +0 -0
- data/examples/action-cable-production-mode/test/fixtures/.keep +0 -0
- data/examples/action-cable-production-mode/test/fixtures/files/.keep +0 -0
- data/examples/action-cable-production-mode/test/fixtures/words.yml +7 -0
- data/examples/action-cable-production-mode/test/helpers/.keep +0 -0
- data/examples/action-cable-production-mode/test/integration/.keep +0 -0
- data/examples/action-cable-production-mode/test/mailers/.keep +0 -0
- data/examples/action-cable-production-mode/test/models/.keep +0 -0
- data/examples/action-cable-production-mode/test/models/word_test.rb +7 -0
- data/examples/action-cable-production-mode/test/test_helper.rb +10 -0
- data/examples/action-cable-production-mode/tmp/.keep +0 -0
- data/examples/action-cable-production-mode/vendor/assets/javascripts/.keep +0 -0
- data/examples/action-cable-production-mode/vendor/assets/stylesheets/.keep +0 -0
- data/examples/action-cable/app/views/layouts/application.html.erb +1 -1
- data/examples/pusher-fake/app/views/layouts/application.html.erb +1 -1
- data/examples/pusher/app/views/layouts/application.html.erb +1 -1
- data/examples/simple-poller/app/views/layouts/application.html.erb +1 -1
- data/examples/word-game/.gitignore +21 -0
- data/examples/word-game/Gemfile +57 -0
- data/examples/word-game/Gemfile.lock +241 -0
- data/examples/word-game/README.md +24 -0
- data/examples/word-game/Rakefile +6 -0
- data/examples/word-game/app/assets/config/manifest.js +3 -0
- data/examples/word-game/app/assets/images/.keep +0 -0
- data/examples/word-game/app/assets/javascripts/application.js +20 -0
- data/examples/word-game/app/assets/javascripts/cable.js +13 -0
- data/examples/word-game/app/assets/javascripts/channels/.keep +0 -0
- data/examples/word-game/app/assets/stylesheets/application.css +15 -0
- data/examples/word-game/app/channels/application_cable/channel.rb +4 -0
- data/examples/word-game/app/channels/application_cable/connection.rb +4 -0
- data/examples/word-game/app/controllers/application_controller.rb +3 -0
- data/examples/word-game/app/controllers/concerns/.keep +0 -0
- data/examples/word-game/app/helpers/application_helper.rb +2 -0
- data/examples/word-game/app/jobs/application_job.rb +2 -0
- data/examples/word-game/app/mailers/application_mailer.rb +4 -0
- data/examples/word-game/app/models/application_record.rb +3 -0
- data/examples/word-game/app/models/concerns/.keep +0 -0
- data/examples/word-game/app/models/models.rb +2 -0
- data/examples/word-game/app/models/public/.keep +0 -0
- data/examples/word-game/app/policies/application_policy.rb +14 -0
- data/examples/word-game/app/views/components.rb +16 -0
- data/examples/word-game/app/views/components/.keep +0 -0
- data/examples/word-game/app/views/layouts/application.html.erb +14 -0
- data/examples/{action-cable → word-game}/app/views/layouts/mailer.html.erb +0 -0
- data/examples/{action-cable → word-game}/app/views/layouts/mailer.text.erb +0 -0
- data/examples/word-game/bin/bundle +3 -0
- data/examples/word-game/bin/rails +9 -0
- data/examples/word-game/bin/rake +9 -0
- data/examples/word-game/bin/setup +34 -0
- data/examples/word-game/bin/spring +16 -0
- data/examples/word-game/bin/update +29 -0
- data/examples/word-game/config.ru +5 -0
- data/examples/word-game/config/application.rb +20 -0
- data/examples/word-game/config/boot.rb +3 -0
- data/examples/word-game/config/cable.yml +9 -0
- data/examples/word-game/config/database.yml +25 -0
- data/examples/word-game/config/environment.rb +5 -0
- data/examples/word-game/config/environments/development.rb +56 -0
- data/examples/word-game/config/environments/production.rb +86 -0
- data/examples/word-game/config/environments/test.rb +42 -0
- data/examples/word-game/config/initializers/application_controller_renderer.rb +6 -0
- data/examples/word-game/config/initializers/assets.rb +11 -0
- data/examples/word-game/config/initializers/backtrace_silencers.rb +7 -0
- data/examples/word-game/config/initializers/cookies_serializer.rb +5 -0
- data/examples/word-game/config/initializers/filter_parameter_logging.rb +4 -0
- data/examples/word-game/config/initializers/hyper_mesh.rb +4 -0
- data/examples/word-game/config/initializers/inflections.rb +16 -0
- data/examples/word-game/config/initializers/mime_types.rb +4 -0
- data/examples/word-game/config/initializers/new_framework_defaults.rb +24 -0
- data/examples/word-game/config/initializers/session_store.rb +3 -0
- data/examples/word-game/config/initializers/wrap_parameters.rb +14 -0
- data/examples/word-game/config/locales/en.yml +23 -0
- data/examples/word-game/config/puma.rb +47 -0
- data/examples/word-game/config/routes.rb +4 -0
- data/examples/word-game/config/secrets.yml +22 -0
- data/examples/word-game/config/spring.rb +6 -0
- data/examples/word-game/db/seeds.rb +7 -0
- data/examples/word-game/lib/assets/.keep +0 -0
- data/examples/word-game/lib/tasks/.keep +0 -0
- data/examples/word-game/log/.keep +0 -0
- data/examples/word-game/public/404.html +67 -0
- data/examples/word-game/public/422.html +67 -0
- data/examples/word-game/public/500.html +66 -0
- data/examples/word-game/public/apple-touch-icon-precomposed.png +0 -0
- data/examples/word-game/public/apple-touch-icon.png +0 -0
- data/examples/word-game/public/favicon.ico +0 -0
- data/examples/word-game/public/robots.txt +5 -0
- data/examples/word-game/test/controllers/.keep +0 -0
- data/examples/word-game/test/fixtures/.keep +0 -0
- data/examples/word-game/test/fixtures/files/.keep +0 -0
- data/examples/word-game/test/helpers/.keep +0 -0
- data/examples/word-game/test/integration/.keep +0 -0
- data/examples/word-game/test/mailers/.keep +0 -0
- data/examples/word-game/test/models/.keep +0 -0
- data/examples/word-game/test/test_helper.rb +10 -0
- data/examples/word-game/tmp/.keep +0 -0
- data/examples/word-game/vendor/assets/javascripts/.keep +0 -0
- data/examples/word-game/vendor/assets/stylesheets/.keep +0 -0
- data/lib/active_record_base.rb +20 -1
- data/lib/hyper-mesh.rb +1 -0
- data/lib/hypermesh/version.rb +1 -1
- data/lib/kernel/itself.rb +5 -0
- data/lib/reactive_record/active_record/class_methods.rb +87 -11
- data/lib/reactive_record/active_record/instance_methods.rb +4 -2
- data/lib/reactive_record/active_record/reactive_record/collection.rb +9 -12
- data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +52 -52
- data/lib/reactive_record/active_record/reactive_record/while_loading.rb +2 -3
- data/lib/reactive_record/scope_description.rb +8 -3
- data/lib/synchromesh/client_drivers.rb +1 -9
- data/lib/synchromesh/connection.rb +2 -2
- data/lib/synchromesh/synchromesh.rb +4 -4
- data/spec/reactive_record/auto_load_itself_spec.rb +24 -0
- data/spec/reactive_record/finder_method_spec.rb +67 -0
- data/spec/reactive_record/save_while_loading_spec.rb +44 -0
- data/spec/reactive_record/update_associations_spec.rb +0 -1
- data/spec/reactive_record/update_scopes_spec.rb +1 -1
- data/spec/spec_helper.rb +5 -0
- data/spec/synchromesh/examples/random_examples.rb +33 -0
- metadata +176 -10
- data/examples/pusher-fake/app/views/layouts/mailer.html.erb +0 -13
- data/examples/pusher-fake/app/views/layouts/mailer.text.erb +0 -1
- data/examples/pusher/app/views/layouts/mailer.html.erb +0 -13
- data/examples/pusher/app/views/layouts/mailer.text.erb +0 -1
- data/examples/simple-poller/app/views/layouts/mailer.html.erb +0 -13
- data/examples/simple-poller/app/views/layouts/mailer.text.erb +0 -1
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,10 @@
|
|
1
|
+
ENV['RAILS_ENV'] ||= 'test'
|
2
|
+
require File.expand_path('../../config/environment', __FILE__)
|
3
|
+
require 'rails/test_help'
|
4
|
+
|
5
|
+
class ActiveSupport::TestCase
|
6
|
+
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
|
7
|
+
fixtures :all
|
8
|
+
|
9
|
+
# Add more helper methods to be used by all tests here...
|
10
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
data/lib/active_record_base.rb
CHANGED
@@ -20,7 +20,6 @@ module ActiveRecord
|
|
20
20
|
end
|
21
21
|
|
22
22
|
alias pre_synchromesh_scope scope
|
23
|
-
alias pre_synchromesh_default_scope default_scope
|
24
23
|
|
25
24
|
def do_not_synchronize
|
26
25
|
@do_not_synchronize = true
|
@@ -32,6 +31,8 @@ module ActiveRecord
|
|
32
31
|
|
33
32
|
if RUBY_ENGINE != 'opal'
|
34
33
|
|
34
|
+
alias pre_synchromesh_default_scope default_scope
|
35
|
+
|
35
36
|
def scope(name, *args, &block)
|
36
37
|
opts = _synchromesh_scope_args_check(args)
|
37
38
|
pre_synchromesh_scope(name, opts[:server], &block)
|
@@ -46,6 +47,15 @@ module ActiveRecord
|
|
46
47
|
define_method name, &block
|
47
48
|
end
|
48
49
|
|
50
|
+
def finder_method(name, &block)
|
51
|
+
singleton_class.send(:define_method, "_#{name}") do |*args|
|
52
|
+
[block.call(*args)]
|
53
|
+
end
|
54
|
+
singleton_class.send(:define_method, name) do |*args|
|
55
|
+
block.call(*args)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
49
59
|
else
|
50
60
|
|
51
61
|
alias pre_synchromesh_method_missing method_missing
|
@@ -103,6 +113,15 @@ module ActiveRecord
|
|
103
113
|
.new(self, nil, nil, self, 'unscoped')
|
104
114
|
.extend(ReactiveRecord::UnscopedCollection)
|
105
115
|
end
|
116
|
+
|
117
|
+
def finder_method(name)
|
118
|
+
ReactiveRecord::ScopeDescription.new(self, "_#{name}", {})
|
119
|
+
[name, "#{name}!"].each do |method|
|
120
|
+
singleton_class.send(:define_method, method) do |*vargs|
|
121
|
+
all.apply_scope("_#{method}", *vargs).first
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
106
125
|
end
|
107
126
|
end
|
108
127
|
|
data/lib/hyper-mesh.rb
CHANGED
@@ -15,6 +15,7 @@ if RUBY_ENGINE == 'opal'
|
|
15
15
|
require 'active_support'
|
16
16
|
require 'time'
|
17
17
|
require 'date'
|
18
|
+
require 'kernel/itself' unless Object.instance_methods.include?(:itself)
|
18
19
|
require "reactive_record/active_record/error"
|
19
20
|
require "reactive_record/server_data_cache"
|
20
21
|
require "reactive_record/active_record/reactive_record/while_loading"
|
data/lib/hypermesh/version.rb
CHANGED
@@ -53,10 +53,95 @@ module ActiveRecord
|
|
53
53
|
# when we implement schema validation we should also implement value checking
|
54
54
|
end
|
55
55
|
|
56
|
+
# ignore any of these methods if they get called on the client. This list should be trimmed down to include only
|
57
|
+
# methods to be called as "macros" such as :after_create, etc...
|
58
|
+
SERVER_METHODS = [
|
59
|
+
:attribute_type_decorations, :defined_enums, :_validators, :timestamped_migrations, :lock_optimistically, :lock_optimistically=,
|
60
|
+
:local_stored_attributes=, :lock_optimistically?, :attribute_aliases?, :attribute_method_matchers?, :defined_enums?,
|
61
|
+
:has_many_without_reactive_record_add_changed_method, :has_many_with_reactive_record_add_changed_method,
|
62
|
+
:belongs_to_without_reactive_record_add_changed_method, :belongs_to_with_reactive_record_add_changed_method,
|
63
|
+
:cache_timestamp_format, :composed_of_with_reactive_record_add_changed_method, :schema_format, :schema_format=,
|
64
|
+
:error_on_ignored_order_or_limit, :error_on_ignored_order_or_limit=, :timestamped_migrations=, :dump_schema_after_migration,
|
65
|
+
:dump_schema_after_migration=, :dump_schemas, :dump_schemas=, :warn_on_records_fetched_greater_than=,
|
66
|
+
:belongs_to_required_by_default, :default_connection_handler, :connection_handler=, :default_connection_handler=,
|
67
|
+
:skip_time_zone_conversion_for_attributes, :skip_time_zone_conversion_for_attributes=, :time_zone_aware_types,
|
68
|
+
:time_zone_aware_types=, :protected_environments, :skip_time_zone_conversion_for_attributes?, :time_zone_aware_types?,
|
69
|
+
:partial_writes, :partial_writes=, :composed_of_without_reactive_record_add_changed_method, :logger, :partial_writes?,
|
70
|
+
:after_initialize, :record_timestamps, :record_timestamps=, :after_find, :after_touch, :before_save, :around_save,
|
71
|
+
:belongs_to_required_by_default=, :default_connection_handler?, :before_create, :around_create, :before_update, :around_update,
|
72
|
+
:after_save, :before_destroy, :around_destroy, :after_create, :after_destroy, :after_update, :_validation_callbacks,
|
73
|
+
:_validation_callbacks?, :_validation_callbacks=, :_initialize_callbacks, :_initialize_callbacks?, :_initialize_callbacks=,
|
74
|
+
:_find_callbacks, :_find_callbacks?, :_find_callbacks=, :_touch_callbacks, :_touch_callbacks?, :_touch_callbacks=, :_save_callbacks,
|
75
|
+
:_save_callbacks?, :_save_callbacks=, :_create_callbacks, :_create_callbacks?, :_create_callbacks=, :_update_callbacks,
|
76
|
+
:_update_callbacks?, :_update_callbacks=, :_destroy_callbacks, :_destroy_callbacks?, :_destroy_callbacks=, :record_timestamps?,
|
77
|
+
:_synchromesh_scope_args_check, :pre_synchromesh_scope, :pre_synchromesh_default_scope, :do_not_synchronize, :do_not_synchronize?,
|
78
|
+
:logger=, :maintain_test_schema, :maintain_test_schema=, :scope, :time_zone_aware_attributes, :time_zone_aware_attributes=,
|
79
|
+
:default_timezone, :default_timezone=, :_attr_readonly, :warn_on_records_fetched_greater_than, :configurations, :configurations=,
|
80
|
+
:_attr_readonly?, :table_name_prefix=, :table_name_suffix=, :schema_migrations_table_name=, :internal_metadata_table_name,
|
81
|
+
:internal_metadata_table_name=, :primary_key_prefix_type, :_attr_readonly=, :pluralize_table_names=, :protected_environments=,
|
82
|
+
:ignored_columns=, :ignored_columns, :index_nested_attribute_errors, :index_nested_attribute_errors=, :primary_key_prefix_type=,
|
83
|
+
:table_name_prefix?, :table_name_suffix?, :schema_migrations_table_name?, :internal_metadata_table_name?, :protected_environments?,
|
84
|
+
:pluralize_table_names?, :ignored_columns?, :store_full_sti_class, :store_full_sti_class=, :nested_attributes_options,
|
85
|
+
:nested_attributes_options=, :store_full_sti_class?, :default_scopes, :default_scope_override, :default_scopes=, :default_scope_override=,
|
86
|
+
:nested_attributes_options?, :cache_timestamp_format=, :cache_timestamp_format?, :reactive_record_association_keys, :_validators=,
|
87
|
+
:has_many, :belongs_to, :composed_of, :belongs_to_without_reactive_record_add_is_method, :_rollback_callbacks, :_commit_callbacks,
|
88
|
+
:_before_commit_callbacks, :attribute_type_decorations=, :_commit_callbacks=, :_commit_callbacks?, :_before_commit_callbacks?,
|
89
|
+
:_before_commit_callbacks=, :_rollback_callbacks=, :_before_commit_without_transaction_enrollment_callbacks?,
|
90
|
+
:_before_commit_without_transaction_enrollment_callbacks=, :_commit_without_transaction_enrollment_callbacks,
|
91
|
+
:_commit_without_transaction_enrollment_callbacks?, :_commit_without_transaction_enrollment_callbacks=, :_rollback_callbacks?,
|
92
|
+
:_rollback_without_transaction_enrollment_callbacks?, :_rollback_without_transaction_enrollment_callbacks=,
|
93
|
+
:_rollback_without_transaction_enrollment_callbacks, :_before_commit_without_transaction_enrollment_callbacks, :aggregate_reflections,
|
94
|
+
:_reflections=, :aggregate_reflections=, :pluralize_table_names, :public_columns_hash, :attributes_to_define_after_schema_loads,
|
95
|
+
:attributes_to_define_after_schema_loads=, :table_name_suffix, :schema_migrations_table_name, :attribute_aliases,
|
96
|
+
:attribute_method_matchers, :connection_handler, :attribute_aliases=, :attribute_method_matchers=, :_validate_callbacks,
|
97
|
+
:_validate_callbacks?, :_validate_callbacks=, :_validators?, :_reflections?, :aggregate_reflections?, :include_root_in_json,
|
98
|
+
:_reflections, :include_root_in_json=, :include_root_in_json?, :local_stored_attributes, :default_scope, :table_name_prefix,
|
99
|
+
:attributes_to_define_after_schema_loads?, :attribute_type_decorations?, :defined_enums=, :suppress, :has_secure_token,
|
100
|
+
:generate_unique_secure_token, :store, :store_accessor, :_store_accessors_module, :stored_attributes, :reflect_on_aggregation,
|
101
|
+
:reflect_on_all_aggregations, :_reflect_on_association, :reflect_on_all_associations, :clear_reflections_cache, :reflections,
|
102
|
+
:reflect_on_association, :reflect_on_all_autosave_associations, :no_touching, :transaction, :after_commit, :after_rollback, :before_commit,
|
103
|
+
:before_commit_without_transaction_enrollment, :after_create_commit, :after_update_commit, :after_destroy_commit,
|
104
|
+
:after_commit_without_transaction_enrollment, :after_rollback_without_transaction_enrollment, :raise_in_transactional_callbacks,
|
105
|
+
:raise_in_transactional_callbacks=, :accepts_nested_attributes_for, :has_secure_password, :has_one, :has_and_belongs_to_many,
|
106
|
+
:before_validation, :after_validation, :serialize, :primary_key, :dangerous_attribute_method?, :get_primary_key, :quoted_primary_key,
|
107
|
+
:define_method_attribute, :reset_primary_key, :primary_key=, :define_method_attribute=, :attribute_names, :initialize_generated_modules,
|
108
|
+
:column_for_attribute, :define_attribute_methods, :undefine_attribute_methods, :instance_method_already_implemented?, :method_defined_within?,
|
109
|
+
:dangerous_class_method?, :class_method_defined_within?, :attribute_method?, :has_attribute?, :generated_attribute_methods,
|
110
|
+
:attribute_method_prefix, :attribute_method_suffix, :attribute_method_affix, :attribute_alias?, :attribute_alias, :define_attribute_method,
|
111
|
+
:update_counters, :locking_enabled?, :locking_column, :locking_column=, :reset_locking_column, :decorate_attribute_type,
|
112
|
+
:decorate_matching_attribute_types, :attribute, :define_attribute, :reset_counters, :increment_counter, :decrement_counter,
|
113
|
+
:validates_absence_of, :validates_length_of, :validates_size_of, :validates_presence_of, :validates_associated, :validates_uniqueness_of,
|
114
|
+
:validates_acceptance_of, :validates_confirmation_of, :validates_exclusion_of, :validates_format_of, :validates_inclusion_of,
|
115
|
+
:validates_numericality_of, :define_callbacks, :normalize_callback_params, :__update_callbacks, :get_callbacks, :set_callback,
|
116
|
+
:set_callbacks, :skip_callback, :reset_callbacks, :deprecated_false_terminator, :define_model_callbacks, :validate, :validators,
|
117
|
+
:validates_each, :validates_with, :clear_validators!, :validators_on, :validates, :_validates_default_keys, :_parse_validates_options,
|
118
|
+
:validates!, :_to_partial_path, :sanitize, :sanitize_sql, :sanitize_conditions, :quote_value, :sanitize_sql_for_conditions, :sanitize_sql_array,
|
119
|
+
:sanitize_sql_for_assignment, :sanitize_sql_hash_for_assignment, :sanitize_sql_for_order, :expand_hash_conditions_for_aggregates, :sanitize_sql_like,
|
120
|
+
:replace_named_bind_variables, :replace_bind_variables, :raise_if_bind_arity_mismatch, :replace_bind_variable, :quote_bound_value, :all,
|
121
|
+
:default_scoped, :valid_scope_name?, :scope_attributes?, :before_remove_const, :ignore_default_scope?, :unscoped, :build_default_scope,
|
122
|
+
:evaluate_default_scope, :ignore_default_scope=, :current_scope, :current_scope=, :scope_attributes, :base_class, :abstract_class?,
|
123
|
+
:finder_needs_type_condition?, :sti_name, :descends_from_active_record?, :abstract_class, :compute_type, :abstract_class=, :table_name, :columns,
|
124
|
+
:table_exists?, :columns_hash, :column_names, :attribute_types, :prefetch_primary_key?, :sequence_name, :quoted_table_name, :_default_attributes,
|
125
|
+
:type_for_attribute, :inheritance_column, :attributes_builder, :inheritance_column=, :reset_table_name, :table_name=, :reset_column_information,
|
126
|
+
:full_table_name_prefix, :full_table_name_suffix, :reset_sequence_name, :sequence_name=, :next_sequence_value, :column_defaults, :content_columns,
|
127
|
+
:readonly_attributes, :attr_readonly, :create, :create!, :instantiate, :find, :type_caster, :arel_table, :find_by, :find_by!, :initialize_find_by_cache,
|
128
|
+
:generated_association_methods, :arel_engine, :arel_attribute, :predicate_builder, :collection_cache_key, :relation_delegate_class,
|
129
|
+
:initialize_relation_delegate_cache, :enum, :collecting_queries_for_explain, :exec_explain, :i18n_scope, :lookup_ancestors, :human_attribute_name,
|
130
|
+
:references, :uniq, :maximum, :none, :exists?, :second, :limit, :order, :eager_load, :update, :delete_all, :destroy, :ids, :many?, :pluck, :third,
|
131
|
+
:delete, :fourth, :fifth, :forty_two, :second_to_last, :third_to_last, :preload, :sum, :take!, :first!, :last!, :second!, :offset, :select, :fourth!,
|
132
|
+
:third!, :third_to_last!, :fifth!, :where, :first_or_create, :second_to_last!, :forty_two!, :first, :having, :any?, :one?, :none?, :find_or_create_by,
|
133
|
+
:from, :first_or_create!, :first_or_initialize, :except, :find_or_create_by!, :find_or_initialize_by, :includes, :destroy_all, :update_all, :or,
|
134
|
+
:find_in_batches, :take, :joins, :find_each, :last, :in_batches, :reorder, :group, :left_joins, :left_outer_joins, :rewhere, :readonly, :create_with,
|
135
|
+
:distinct, :unscope, :calculate, :average, :count_by_sql, :minimum, :lock, :find_by_sql, :count, :cache, :uncached, :connection, :connection_pool,
|
136
|
+
:establish_connection, :connected?, :clear_cache!, :clear_reloadable_connections!, :connection_id, :connection_config, :clear_all_connections!,
|
137
|
+
:remove_connection, :connection_specification_name, :connection_specification_name=, :retrieve_connection, :connection_id=, :clear_active_connections!,
|
138
|
+
:sqlite3_connection, :direct_descendants, :benchmark, :model_name
|
139
|
+
]
|
140
|
+
|
56
141
|
def method_missing(name, *args, &block)
|
57
142
|
if args.count == 1 && name =~ /^find_by_/ && !block
|
58
143
|
find_by(name.gsub(/^find_by_/, "") => args[0])
|
59
|
-
|
144
|
+
elsif !SERVER_METHODS.include?(name)
|
60
145
|
raise "#{self.name}.#{name}(#{args}) (called class method missing)"
|
61
146
|
end
|
62
147
|
end
|
@@ -109,7 +194,7 @@ module ActiveRecord
|
|
109
194
|
name = args.first
|
110
195
|
define_method(name) { @backing_record.reactive_get!(name, nil) }
|
111
196
|
define_method("#{name}=") do |val|
|
112
|
-
@backing_record.reactive_set!(name, backing_record.convert(name, val))
|
197
|
+
@backing_record.reactive_set!(name, backing_record.convert(name, val).itself)
|
113
198
|
end
|
114
199
|
opts = (args.count > 1 and args.last.is_a? Hash) ? args.last : {}
|
115
200
|
Associations::AssociationReflection.new(self, macro, name, opts)
|
@@ -160,15 +245,6 @@ module ActiveRecord
|
|
160
245
|
end
|
161
246
|
end
|
162
247
|
|
163
|
-
[
|
164
|
-
"table_name=", "before_validation", "with_options", "validates_presence_of", "validates_format_of",
|
165
|
-
"accepts_nested_attributes_for", "before_create", "after_create", "before_save", "after_save", "before_destroy", "where", "validate",
|
166
|
-
"attr_protected", "validates_numericality_of", "default_scope", "has_attached_file", "attr_accessible",
|
167
|
-
"serialize"
|
168
|
-
].each do |method|
|
169
|
-
define_method(method.to_s) { |*args, &block| }
|
170
|
-
end
|
171
|
-
|
172
248
|
def _react_param_conversion(param, opt = nil)
|
173
249
|
param = Native(param)
|
174
250
|
param = JSON.from_object(param.to_n) if param.is_a? Native::Object
|
@@ -17,10 +17,12 @@ module ActiveRecord
|
|
17
17
|
# we have to build the backing record first then initialize it so associations work correctly
|
18
18
|
@backing_record = ReactiveRecord::Base.new(self.class, {}, self)
|
19
19
|
@backing_record.instance_eval do
|
20
|
+
h = Hash.new
|
21
|
+
hash.each { |a, v| h[a] = convert(a, v).itself }
|
20
22
|
self.class.load_data do
|
21
|
-
|
23
|
+
h.each do |attribute, value|
|
22
24
|
unless attribute == primary_key
|
23
|
-
reactive_set!(attribute,
|
25
|
+
reactive_set!(attribute, value)
|
24
26
|
changed_attributes << attribute
|
25
27
|
end
|
26
28
|
end
|
@@ -205,18 +205,11 @@ module ReactiveRecord
|
|
205
205
|
@pre_sync_related_records = nil
|
206
206
|
end
|
207
207
|
|
208
|
-
# def in_this_collection(related_records)
|
209
|
-
# related_records.delete_if do |r|
|
210
|
-
# # BELOW IS WRONG... its more complicated isn't it...
|
211
|
-
# if @association.through_association
|
212
|
-
#
|
213
|
-
# else
|
214
|
-
# r.backing_record.attributes[@association.inverse_of] != @owner
|
215
|
-
# end
|
216
|
-
# end
|
217
|
-
|
218
208
|
def apply_scope(name, *vector)
|
219
|
-
|
209
|
+
description = ScopeDescription.find(@target_klass, name)
|
210
|
+
collection = build_child_scope(description, *description.name, *vector)
|
211
|
+
collection.reload_from_db if name == "#{description.name}!"
|
212
|
+
collection
|
220
213
|
end
|
221
214
|
|
222
215
|
def child_scopes
|
@@ -367,6 +360,7 @@ module ReactiveRecord
|
|
367
360
|
end
|
368
361
|
|
369
362
|
def push(item)
|
363
|
+
item.itself # force get of at least the id
|
370
364
|
if collection
|
371
365
|
self.force_push item
|
372
366
|
else
|
@@ -486,8 +480,11 @@ module ReactiveRecord
|
|
486
480
|
def method_missing(method, *args, &block)
|
487
481
|
if [].respond_to? method
|
488
482
|
all.send(method, *args, &block)
|
489
|
-
elsif @target_klass
|
483
|
+
elsif ScopeDescription.find(@target_klass, method) || (args.count == 1 && method =~ /^find_by_/)
|
490
484
|
apply_scope(method, *args)
|
485
|
+
elsif @target_klass.respond_to?(method) && ScopeDescription.find(@target_klass, "_#{method}")
|
486
|
+
puts "here we are..."
|
487
|
+
apply_scope("_#{method}", *args).first
|
491
488
|
else
|
492
489
|
super
|
493
490
|
end
|
@@ -226,74 +226,74 @@ module ReactiveRecord
|
|
226
226
|
end
|
227
227
|
|
228
228
|
def save(validate, force, &block)
|
229
|
-
|
230
229
|
if data_loading?
|
231
|
-
|
232
230
|
sync!
|
233
|
-
|
234
231
|
elsif force or changed?
|
232
|
+
HyperMesh.load do
|
233
|
+
ReactiveRecord.loads_pending! unless self.class.pending_fetches.empty?
|
234
|
+
end.then { save_to_server(validate, force, &block) }
|
235
|
+
#save_to_server(validate, force, &block)
|
236
|
+
else
|
237
|
+
promise = Promise.new
|
238
|
+
yield true, nil, [] if block
|
239
|
+
promise.resolve({success: true})
|
240
|
+
promise
|
241
|
+
end
|
242
|
+
end
|
235
243
|
|
236
|
-
|
237
|
-
|
238
|
-
models, associations, backing_records = self.class.gather_records([self], force, self)
|
244
|
+
def save_to_server(validate, force, &block)
|
245
|
+
models, associations, backing_records = self.class.gather_records([self], force, self)
|
239
246
|
|
240
|
-
|
247
|
+
backing_records.each { |id, record| record.saving! }
|
241
248
|
|
242
|
-
|
249
|
+
promise = Promise.new
|
243
250
|
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
251
|
+
HTTP.post(`window.ReactiveRecordEnginePath`+"/save",
|
252
|
+
payload: {
|
253
|
+
json: {
|
254
|
+
models: models,
|
255
|
+
associations: associations,
|
256
|
+
validate: validate
|
257
|
+
}.to_json
|
258
|
+
}
|
259
|
+
).then do |response|
|
260
|
+
begin
|
261
|
+
response.json[:models] = response.json[:saved_models].collect do |item|
|
262
|
+
backing_records[item[0]].ar_instance
|
263
|
+
end
|
257
264
|
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
265
|
+
if response.json[:success]
|
266
|
+
response.json[:saved_models].each do | item |
|
267
|
+
# was backing_records[item[0]].sync!(item[2])
|
268
|
+
HyperMesh::LocalSync.after_save backing_records[item[0]].ar_instance, item[2]
|
269
|
+
end
|
270
|
+
else
|
271
|
+
log("Reactive Record Save Failed: #{response.json[:message]}", :error)
|
272
|
+
response.json[:saved_models].each do | item |
|
273
|
+
log(" Model: #{item[1]}[#{item[0]}] Attributes: #{item[2]} Errors: #{item[3]}", :error) if item[3]
|
274
|
+
end
|
275
|
+
end
|
269
276
|
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
277
|
+
response.json[:saved_models].each do | item |
|
278
|
+
backing_records[item[0]].sync_unscoped_collection!
|
279
|
+
backing_records[item[0]].errors! item[3]
|
280
|
+
end
|
274
281
|
|
275
|
-
|
276
|
-
|
282
|
+
yield response.json[:success], response.json[:message], response.json[:models] if block
|
283
|
+
promise.resolve response.json
|
277
284
|
|
278
|
-
|
285
|
+
backing_records.each { |id, record| record.saved! }
|
279
286
|
|
280
|
-
rescue Exception => e
|
281
|
-
log("Exception raised while saving - #{e}", :error)
|
282
|
-
end
|
283
|
-
end
|
284
|
-
promise
|
285
287
|
rescue Exception => e
|
286
288
|
log("Exception raised while saving - #{e}", :error)
|
287
|
-
yield false, e.message, [] if block
|
288
|
-
promise.resolve({success: false, message: e.message, models: []})
|
289
|
-
promise
|
290
289
|
end
|
291
|
-
else
|
292
|
-
promise = Promise.new
|
293
|
-
yield true, nil, [] if block
|
294
|
-
promise.resolve({success: true})
|
295
|
-
promise
|
296
290
|
end
|
291
|
+
promise
|
292
|
+
rescue Exception => e
|
293
|
+
log("Exception raised while saving - #{e}", :error)
|
294
|
+
yield false, e.message, [] if block
|
295
|
+
promise.resolve({success: false, message: e.message, models: []})
|
296
|
+
promise
|
297
297
|
end
|
298
298
|
|
299
299
|
else
|
@@ -3,7 +3,7 @@ module HyperMesh
|
|
3
3
|
ReactiveRecord.load &block
|
4
4
|
end
|
5
5
|
end
|
6
|
-
|
6
|
+
|
7
7
|
module ReactiveRecord
|
8
8
|
|
9
9
|
# will repeatedly execute the block until it is loaded
|
@@ -14,7 +14,7 @@ module ReactiveRecord
|
|
14
14
|
@load_stack ||= []
|
15
15
|
@load_stack << @loads_pending
|
16
16
|
@loads_pending = nil
|
17
|
-
result = block.call
|
17
|
+
result = block.call.itself
|
18
18
|
if @loads_pending
|
19
19
|
@blocks_to_load ||= []
|
20
20
|
@blocks_to_load << [Base.last_fetch_at, promise, block]
|
@@ -24,7 +24,6 @@ module ReactiveRecord
|
|
24
24
|
@loads_pending = @load_stack.pop
|
25
25
|
promise
|
26
26
|
rescue Exception => e
|
27
|
-
debugger
|
28
27
|
React::IsomorphicHelpers.log "ReactiveRecord.load exception raised during initial load: #{e}", :error
|
29
28
|
end
|
30
29
|
|