volt 0.9.2 → 0.9.3.pre1
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/CHANGELOG.md +7 -0
- data/CONTRIBUTING.md +4 -0
- data/Gemfile +3 -0
- data/app/volt/assets/js/volt_js_polyfills.js +0 -1
- data/app/volt/assets/js/volt_watch.js +217 -0
- data/app/volt/models/user.rb +7 -2
- data/app/volt/tasks/query_tasks.rb +6 -0
- data/lib/volt/boot.rb +1 -1
- data/lib/volt/cli/generate.rb +1 -1
- data/lib/volt/config.rb +12 -2
- data/lib/volt/controllers/model_controller.rb +1 -1
- data/lib/volt/data_stores/base_adaptor_client.rb +34 -0
- data/lib/volt/data_stores/{base.rb → base_adaptor_server.rb} +1 -1
- data/lib/volt/data_stores/data_store.rb +23 -7
- data/lib/volt/models/array_model.rb +3 -2
- data/lib/volt/models/model.rb +29 -91
- data/lib/volt/models/{dirty.rb → model_helpers/dirty.rb} +0 -0
- data/lib/volt/models/{listener_tracker.rb → model_helpers/listener_tracker.rb} +0 -0
- data/lib/volt/models/model_helpers/model_change_helpers.rb +76 -0
- data/lib/volt/models/{model_helpers.rb → model_helpers/model_helpers.rb} +0 -0
- data/lib/volt/models/persistors/array_store.rb +2 -23
- data/lib/volt/models/persistors/query/normalizer.rb +0 -44
- data/{templates/project/lib/.empty_directory → lib/volt/models/validations/errors.rb} +0 -0
- data/lib/volt/models/{validations.rb → validations/validations.rb} +80 -26
- data/lib/volt/page/bindings/attribute_binding.rb +17 -3
- data/lib/volt/page/page.rb +1 -0
- data/lib/volt/reactive/eventable.rb +1 -0
- data/lib/volt/server.rb +2 -1
- data/lib/volt/server/component_templates.rb +66 -16
- data/lib/volt/server/forking_server.rb +16 -14
- data/lib/volt/server/html_parser/sandlebars_parser.rb +2 -0
- data/lib/volt/server/html_parser/view_scope.rb +2 -0
- data/lib/volt/server/rack/component_paths.rb +4 -2
- data/lib/volt/server/rack/opal_files.rb +4 -2
- data/lib/volt/server/socket_connection_handler.rb +5 -1
- data/lib/volt/server/template_handlers/handlers.rb +0 -0
- data/lib/volt/spec/setup.rb +23 -8
- data/lib/volt/tasks/dispatcher.rb +4 -0
- data/lib/volt/utils/promise_patch.rb +3 -0
- data/lib/volt/version.rb +1 -1
- data/spec/apps/kitchen_sink/Gemfile +5 -0
- data/spec/apps/kitchen_sink/app/main/config/routes.rb +1 -0
- data/spec/apps/kitchen_sink/app/main/controllers/main_controller.rb +10 -0
- data/spec/apps/kitchen_sink/app/main/views/main/bindings.html +20 -0
- data/spec/apps/kitchen_sink/app/main/views/main/form.html +73 -0
- data/spec/apps/kitchen_sink/app/main/views/main/main.html +1 -0
- data/spec/integration/bindings_spec.rb +33 -0
- data/spec/integration/user_spec.rb +51 -21
- data/spec/models/associations_spec.rb +8 -0
- data/spec/models/model_spec.rb +7 -0
- data/spec/models/user_spec.rb +20 -0
- data/spec/models/validations_spec.rb +2 -1
- data/spec/models/validators/block_validations_spec.rb +53 -0
- data/spec/page/bindings/template_binding/view_lookup_for_path_spec.rb +10 -0
- data/spec/page/path_string_renderer_spec.rb +6 -0
- data/spec/reactive/eventable_spec.rb +24 -6
- data/spec/server/component_templates_spec.rb +21 -0
- data/spec/server/html_parser/sandlebars_parser_spec.rb +12 -13
- data/spec/server/html_parser/view_parser_spec.rb +3 -0
- data/spec/server/rack/asset_files_spec.rb +2 -2
- data/spec/server/rack/http_resource_spec.rb +10 -0
- data/spec/tasks/dispatcher_spec.rb +5 -0
- data/spec/tasks/user_tasks_spec.rb +59 -0
- data/spec/utils/task_argument_filtererer_spec.rb +6 -0
- data/templates/newgem/app/newgem/config/initializers/boot.rb +10 -0
- data/templates/newgem/lib/newgem.rb.tt +13 -0
- data/templates/project/Gemfile.tt +3 -0
- data/templates/project/app/main/lib/.empty_directory +0 -0
- data/volt.gemspec +3 -1
- metadata +24 -25
- data/lib/volt/data_stores/mongo_driver.rb +0 -69
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            if RUBY_PLATFORM == 'opal'
         | 
| 2 | 
            +
            else
         | 
| 3 | 
            +
              require 'spec_helper'
         | 
| 4 | 
            +
              require 'benchmark'
         | 
| 5 | 
            +
              require 'volt/server/component_templates'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              describe Volt::ComponentTemplates do
         | 
| 8 | 
            +
                let(:haml_handler) do 
         | 
| 9 | 
            +
                  double(:haml_handler)
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                it 'can be extended' do
         | 
| 13 | 
            +
                  expect( Volt::ComponentTemplates::Handlers.extensions ).to eq([ :html, :email ])
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  Volt::ComponentTemplates.register_template_handler(:haml, haml_handler) 
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  expect( Volt::ComponentTemplates::Handlers.extensions ).to eq([ :html, :email, :haml ])
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            end
         | 
| @@ -20,7 +20,7 @@ class HTMLHandler | |
| 20 20 | 
             
              end
         | 
| 21 21 |  | 
| 22 22 | 
             
              def binding(binding)
         | 
| 23 | 
            -
                @html << "{#{binding}}"
         | 
| 23 | 
            +
                @html << "{{#{binding}}}"
         | 
| 24 24 | 
             
              end
         | 
| 25 25 |  | 
| 26 26 | 
             
              def start_tag(tag_name, attributes, unary)
         | 
| @@ -94,12 +94,13 @@ describe Volt::SandlebarsParser do | |
| 94 94 | 
             
              end
         | 
| 95 95 |  | 
| 96 96 | 
             
              it 'should handle bindings' do
         | 
| 97 | 
            -
                html = '<p>some cool {text} is {awesome}</p>'
         | 
| 97 | 
            +
                html = '<p>some cool {{ text }} is {{ awesome }}</p>'
         | 
| 98 | 
            +
                match = '<p>some cool {{text}} is {{awesome}}</p>'
         | 
| 98 99 | 
             
                test_html(html)
         | 
| 99 100 | 
             
              end
         | 
| 100 101 |  | 
| 101 | 
            -
              it 'should handle bindings with nested { | 
| 102 | 
            -
                html = "<p>testing with {nested { 'binding stuff' }}</p>"
         | 
| 102 | 
            +
              it 'should handle bindings with nested {{and}}' do
         | 
| 103 | 
            +
                html = "<p>testing with {{nested {{ 'binding stuff' }} }}</p>"
         | 
| 103 104 | 
             
                test_html(html)
         | 
| 104 105 | 
             
              end
         | 
| 105 106 |  | 
| @@ -139,7 +140,7 @@ describe Volt::SandlebarsParser do | |
| 139 140 | 
             
              end
         | 
| 140 141 |  | 
| 141 142 | 
             
              it 'should not jump bindings' do
         | 
| 142 | 
            -
                html = '<p>{some} text {binding}</p>'
         | 
| 143 | 
            +
                html = '<p>{{ some }} text {{ binding }}</p>'
         | 
| 143 144 | 
             
                test_html(html)
         | 
| 144 145 | 
             
              end
         | 
| 145 146 |  | 
| @@ -150,8 +151,8 @@ describe Volt::SandlebarsParser do | |
| 150 151 | 
             
              end
         | 
| 151 152 |  | 
| 152 153 | 
             
              it 'should let you escape { and }' do
         | 
| 153 | 
            -
                html = 'should escape {{{{}}} and {{{}}}}'
         | 
| 154 | 
            -
                match = 'should escape { and }'
         | 
| 154 | 
            +
                html = 'should escape {{{{{}}} and {{{}}}}}'
         | 
| 155 | 
            +
                match = 'should escape {{ and }}'
         | 
| 155 156 | 
             
                test_html(html, match)
         | 
| 156 157 | 
             
              end
         | 
| 157 158 |  | 
| @@ -191,11 +192,9 @@ describe Volt::SandlebarsParser do | |
| 191 192 | 
             
                test_html(html)
         | 
| 192 193 | 
             
              end
         | 
| 193 194 |  | 
| 194 | 
            -
               | 
| 195 | 
            -
             | 
| 196 | 
            -
             | 
| 197 | 
            -
               | 
| 198 | 
            -
              #   expect { Volt::SandlebarsParser.new(html, handler) }.to raise_error(Volt::HTMLParseError)
         | 
| 199 | 
            -
              # end
         | 
| 195 | 
            +
              it 'should close self closing elements' do
         | 
| 196 | 
            +
                test_html '<p><p>', '<p></p><p></p>'
         | 
| 197 | 
            +
                test_html '<p><span>1</span>2<p>3</p>', '<p><span>1</span>2</p><p>3</p>'
         | 
| 198 | 
            +
              end
         | 
| 200 199 | 
             
            end
         | 
| 201 200 | 
             
            end
         | 
| @@ -192,6 +192,9 @@ describe Volt::ViewParser do | |
| 192 192 | 
             
                END
         | 
| 193 193 |  | 
| 194 194 | 
             
                view = Volt::ViewParser.new(html, 'main/main/main/body')
         | 
| 195 | 
            +
             | 
| 196 | 
            +
                expected = "    <a href=\"{link_name}\">Link</a>\n"
         | 
| 197 | 
            +
                expect(view.templates["main/main/main/body/body"]["html"]).to eq expected
         | 
| 195 198 | 
             
              end
         | 
| 196 199 |  | 
| 197 200 | 
             
              it 'should parse components' do
         | 
| @@ -13,13 +13,13 @@ if RUBY_PLATFORM != 'opal' | |
| 13 13 | 
             
                  main = Volt::AssetFiles.new('main', @component_paths)
         | 
| 14 14 |  | 
| 15 15 | 
             
                  components = main.components
         | 
| 16 | 
            -
                  expect(components).to eq(%w(volt main shared bootstrap slideshow))
         | 
| 16 | 
            +
                  expect(components).to eq(%w(volt mongo main shared bootstrap slideshow))
         | 
| 17 17 | 
             
                end
         | 
| 18 18 |  | 
| 19 19 | 
             
                it 'should list all JS files' do
         | 
| 20 20 | 
             
                  main = Volt::AssetFiles.new('main', @component_paths)
         | 
| 21 21 |  | 
| 22 | 
            -
                  expect(main.javascript_files(nil)).to eq(['/assets/js/jquery-2.0.3.js', '/assets/js/volt_js_polyfills.js', '/assets/js/bootstrap.js', '/assets/js/test2.js', '/assets/js/test3.js', '/assets/js/test1.js', '/assets/volt/page/page.js', '/components/main.js'])
         | 
| 22 | 
            +
                  expect(main.javascript_files(nil)).to eq(['/assets/js/jquery-2.0.3.js', '/assets/js/volt_js_polyfills.js', '/assets/js/volt_watch.js', '/assets/js/bootstrap.js', '/assets/js/test2.js', '/assets/js/test3.js', '/assets/js/test1.js', '/assets/volt/page/page.js', '/components/main.js'])
         | 
| 23 23 | 
             
                end
         | 
| 24 24 |  | 
| 25 25 | 
             
                it 'should raise an exception for a missing component gem' do
         | 
| @@ -55,5 +55,15 @@ if RUBY_PLATFORM != 'opal' | |
| 55 55 | 
             
                  expect(response.status).to eq(200)
         | 
| 56 56 | 
             
                  expect(response.body).to eq(['show with id 99 and another_param called'])
         | 
| 57 57 | 
             
                end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                it 'should call the supplied app if routes are not matched and cause a 404' do
         | 
| 60 | 
            +
                  http_resource = Volt::HttpResource.new(app, @routes)
         | 
| 61 | 
            +
                  env = Rack::MockRequest.env_for('http://example.com/not_a_valid_param')
         | 
| 62 | 
            +
                  request = Volt::HttpRequest.new(env)
         | 
| 63 | 
            +
                  response = http_resource.call(env)
         | 
| 64 | 
            +
                  expect(response[0]).to eq(404)
         | 
| 65 | 
            +
                  #expect(response.body).to eq(['show with id 99 and another_param called'])
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
             | 
| 58 68 | 
             
              end
         | 
| 59 69 | 
             
            end
         | 
| @@ -10,6 +10,11 @@ if RUBY_PLATFORM != 'opal' | |
| 10 10 | 
             
                  Volt.logger = spy('Volt::VoltLogger')
         | 
| 11 11 | 
             
                end
         | 
| 12 12 |  | 
| 13 | 
            +
                after do
         | 
| 14 | 
            +
                  # Cleanup, make volt make a new logger.  Otherwise this will leak out.
         | 
| 15 | 
            +
                  Volt.logger = nil
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 13 18 | 
             
                it 'should only allow method calls on Task or above in the inheritance chain' do
         | 
| 14 19 | 
             
                  channel = double('channel')
         | 
| 15 20 |  | 
| @@ -0,0 +1,59 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            if RUBY_PLATFORM != 'opal'
         | 
| 4 | 
            +
              describe UserTasks do
         | 
| 5 | 
            +
                let(:fake_response) { double('FakeResponse', fetch_first: true) }
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                let(:fake_users_collection) do
         | 
| 8 | 
            +
                  double('FakeUsersCollection', where: fake_response)
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                let(:fake_store) { double('FakeStore', :_users => fake_users_collection) }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                let(:login_info) { { 'login' => 'Marty', 'password' => 'McFly' } }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                before do
         | 
| 16 | 
            +
                  allow($page).to receive(:store).and_return fake_store
         | 
| 17 | 
            +
                  allow(User).to receive(:login_field).and_return 'user'
         | 
| 18 | 
            +
                  allow(fake_response).to receive(:fetch_first).and_yield(user)
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                describe '#login' do
         | 
| 22 | 
            +
                  context 'with no matching user' do
         | 
| 23 | 
            +
                    let(:user) { false }
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                    it 'raises VoltUserError' do
         | 
| 26 | 
            +
                      expect { subject.login(login_info) }.
         | 
| 27 | 
            +
                        to raise_error('User could not be found')
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  context 'with a matching user' do
         | 
| 32 | 
            +
                    let(:password) { BCrypt::Password.create(login_info['password']) }
         | 
| 33 | 
            +
                    let(:user) { double('User', _id: 1, _hashed_password: password) }
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    it 'fails on bad password' do
         | 
| 36 | 
            +
                      expect { subject.login(login_info.merge 'password' => 'Not McFly') }.
         | 
| 37 | 
            +
                        to raise_error('Password did not match')
         | 
| 38 | 
            +
                    end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                    it 'fails with missing app_secret' do
         | 
| 41 | 
            +
                      allow(Volt.config).to receive(:app_secret).and_return false
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                      expect { subject.login(login_info) }.
         | 
| 44 | 
            +
                        to raise_error('app_secret is not configured')
         | 
| 45 | 
            +
                    end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                    it 'generates a signature digest' do
         | 
| 48 | 
            +
                      allow(Digest::SHA256).to receive(:hexdigest).and_call_original
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                      subject.login(login_info)
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                      expect(Digest::SHA256).to have_received(:hexdigest).with(
         | 
| 53 | 
            +
                        "#{Volt.config.app_secret}::#{user._id}"
         | 
| 54 | 
            +
                      )
         | 
| 55 | 
            +
                    end
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
            end
         | 
| @@ -13,5 +13,11 @@ if RUBY_PLATFORM != 'opal' | |
| 13 13 |  | 
| 14 14 | 
             
                  expect(filtered_args).to eq([:login, { login: 'jim@jim.com', password: '[FILTERED]' }])
         | 
| 15 15 | 
             
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                it 'should create and run a new TaskArgumentFilterer when its filter method is called' do
         | 
| 18 | 
            +
                  filtered_args = TaskArgumentFilterer.filter([{login: 'jam@jam.com', password: 'some password'}])
         | 
| 19 | 
            +
                  expect(filtered_args).to eq([{:login=>"jam@jam.com", :password=>"[FILTERED]"}])
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 16 22 | 
             
              end
         | 
| 17 23 | 
             
            end
         | 
| @@ -0,0 +1,10 @@ | |
| 1 | 
            +
            # Place any code you want to run when the component is included on the client
         | 
| 2 | 
            +
            # or server.
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            # To include code only on the client use:
         | 
| 5 | 
            +
            # if RUBY_PLATFORM == 'opal'
         | 
| 6 | 
            +
            #
         | 
| 7 | 
            +
            # To include code only on the server, use:
         | 
| 8 | 
            +
            # unless RUBY_PLATFORM == 'opal'
         | 
| 9 | 
            +
            # ^^ this will not send compile in code in the conditional to the client.
         | 
| 10 | 
            +
            # ^^ this include code required in the conditional.
         | 
| @@ -1,3 +1,16 @@ | |
| 1 | 
            +
            # If you need to require in code in the gem's app folder, keep in mind that
         | 
| 2 | 
            +
            # the app is not on the load path when the gem is required.  Use
         | 
| 3 | 
            +
            # app/{gemname}/config/initializers/boot.rb to require in client or server
         | 
| 4 | 
            +
            # code.
         | 
| 5 | 
            +
            #
         | 
| 6 | 
            +
            # Also, in volt apps, you typically use the lib folder in the
         | 
| 7 | 
            +
            # app/{componentname} folder instead of this lib folder.  This lib folder is
         | 
| 8 | 
            +
            # for setting up gem code when Bundler.require is called. (or the gem is
         | 
| 9 | 
            +
            # required.)
         | 
| 10 | 
            +
            #
         | 
| 11 | 
            +
            # If you need to configure volt in some way, you can add a Volt.configure block
         | 
| 12 | 
            +
            # in this file.
         | 
| 13 | 
            +
             | 
| 1 14 | 
             
            <%- config[:constant_array].each_with_index do |c,i| -%>
         | 
| 2 15 | 
             
            <%= '  '*i %>module <%= c %>
         | 
| 3 16 | 
             
            <%- end -%>
         | 
| 
            File without changes
         | 
    
        data/volt.gemspec
    CHANGED
    
    | @@ -24,7 +24,6 @@ Gem::Specification.new do |spec| | |
| 24 24 | 
             
              spec.add_dependency 'rack', '~> 1.5.0'
         | 
| 25 25 | 
             
              spec.add_dependency 'sprockets-sass', '~> 1.0.0'
         | 
| 26 26 | 
             
              spec.add_dependency 'sass', '~> 3.2.5'
         | 
| 27 | 
            -
              spec.add_dependency 'mongo', '~> 1.9.0'
         | 
| 28 27 | 
             
              spec.add_dependency 'listen', '~> 2.8.0'
         | 
| 29 28 | 
             
              spec.add_dependency 'uglifier', '>= 2.4.0'
         | 
| 30 29 | 
             
              spec.add_dependency 'configurations', '~> 2.0.0.pre'
         | 
| @@ -34,6 +33,7 @@ Gem::Specification.new do |spec| | |
| 34 33 | 
             
              spec.add_dependency 'faye-websocket', '~> 0.9.2'
         | 
| 35 34 | 
             
              spec.add_dependency 'concurrent-ruby', '~> 0.8.0'
         | 
| 36 35 |  | 
| 36 | 
            +
             | 
| 37 37 | 
             
              # For user passwords
         | 
| 38 38 | 
             
              spec.add_dependency 'bcrypt', '~> 3.1.9'
         | 
| 39 39 |  | 
| @@ -41,6 +41,8 @@ Gem::Specification.new do |spec| | |
| 41 41 | 
             
              spec.add_development_dependency 'rspec', '~> 3.2.0'
         | 
| 42 42 | 
             
              spec.add_development_dependency 'opal-rspec', '~> 0.4.2'
         | 
| 43 43 | 
             
              spec.add_development_dependency 'capybara', '~> 2.4.2'
         | 
| 44 | 
            +
             | 
| 45 | 
            +
              # There is a big performance issue with selenium-webdriver on v2.45.0
         | 
| 44 46 | 
             
              spec.add_development_dependency 'selenium-webdriver', '~> 2.43.0'
         | 
| 45 47 | 
             
              spec.add_development_dependency 'chromedriver2-helper', '~> 0.0.8'
         | 
| 46 48 | 
             
              spec.add_development_dependency 'poltergeist', '~> 1.5.0'
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: volt
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.9. | 
| 4 | 
            +
              version: 0.9.3.pre1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Ryan Stout
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2015-05- | 
| 11 | 
            +
            date: 2015-05-14 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: thor
         | 
| @@ -80,20 +80,6 @@ dependencies: | |
| 80 80 | 
             
                - - "~>"
         | 
| 81 81 | 
             
                  - !ruby/object:Gem::Version
         | 
| 82 82 | 
             
                    version: 3.2.5
         | 
| 83 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 84 | 
            -
              name: mongo
         | 
| 85 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 86 | 
            -
                requirements:
         | 
| 87 | 
            -
                - - "~>"
         | 
| 88 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            -
                    version: 1.9.0
         | 
| 90 | 
            -
              type: :runtime
         | 
| 91 | 
            -
              prerelease: false
         | 
| 92 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 | 
            -
                requirements:
         | 
| 94 | 
            -
                - - "~>"
         | 
| 95 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 96 | 
            -
                    version: 1.9.0
         | 
| 97 83 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 98 84 | 
             
              name: listen
         | 
| 99 85 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -496,6 +482,7 @@ files: | |
| 496 482 | 
             
            - app/volt/assets/css/notices.css.scss
         | 
| 497 483 | 
             
            - app/volt/assets/js/jquery-2.0.3.js
         | 
| 498 484 | 
             
            - app/volt/assets/js/volt_js_polyfills.js
         | 
| 485 | 
            +
            - app/volt/assets/js/volt_watch.js
         | 
| 499 486 | 
             
            - app/volt/config/dependencies.rb
         | 
| 500 487 | 
             
            - app/volt/controllers/notices_controller.rb
         | 
| 501 488 | 
             
            - app/volt/models/user.rb
         | 
| @@ -523,9 +510,9 @@ files: | |
| 523 510 | 
             
            - lib/volt/controllers/actions.rb
         | 
| 524 511 | 
             
            - lib/volt/controllers/http_controller.rb
         | 
| 525 512 | 
             
            - lib/volt/controllers/model_controller.rb
         | 
| 526 | 
            -
            - lib/volt/data_stores/ | 
| 513 | 
            +
            - lib/volt/data_stores/base_adaptor_client.rb
         | 
| 514 | 
            +
            - lib/volt/data_stores/base_adaptor_server.rb
         | 
| 527 515 | 
             
            - lib/volt/data_stores/data_store.rb
         | 
| 528 | 
            -
            - lib/volt/data_stores/mongo_driver.rb
         | 
| 529 516 | 
             
            - lib/volt/extra_core/array.rb
         | 
| 530 517 | 
             
            - lib/volt/extra_core/blank.rb
         | 
| 531 518 | 
             
            - lib/volt/extra_core/class.rb
         | 
| @@ -545,14 +532,15 @@ files: | |
| 545 532 | 
             
            - lib/volt/models/associations.rb
         | 
| 546 533 | 
             
            - lib/volt/models/buffer.rb
         | 
| 547 534 | 
             
            - lib/volt/models/cursor.rb
         | 
| 548 | 
            -
            - lib/volt/models/dirty.rb
         | 
| 549 535 | 
             
            - lib/volt/models/errors.rb
         | 
| 550 536 | 
             
            - lib/volt/models/field_helpers.rb
         | 
| 551 | 
            -
            - lib/volt/models/listener_tracker.rb
         | 
| 552 537 | 
             
            - lib/volt/models/location.rb
         | 
| 553 538 | 
             
            - lib/volt/models/model.rb
         | 
| 554 539 | 
             
            - lib/volt/models/model_hash_behaviour.rb
         | 
| 555 | 
            -
            - lib/volt/models/model_helpers.rb
         | 
| 540 | 
            +
            - lib/volt/models/model_helpers/dirty.rb
         | 
| 541 | 
            +
            - lib/volt/models/model_helpers/listener_tracker.rb
         | 
| 542 | 
            +
            - lib/volt/models/model_helpers/model_change_helpers.rb
         | 
| 543 | 
            +
            - lib/volt/models/model_helpers/model_helpers.rb
         | 
| 556 544 | 
             
            - lib/volt/models/model_wrapper.rb
         | 
| 557 545 | 
             
            - lib/volt/models/permissions.rb
         | 
| 558 546 | 
             
            - lib/volt/models/persistors/array_store.rb
         | 
| @@ -572,7 +560,8 @@ files: | |
| 572 560 | 
             
            - lib/volt/models/state_helpers.rb
         | 
| 573 561 | 
             
            - lib/volt/models/state_manager.rb
         | 
| 574 562 | 
             
            - lib/volt/models/url.rb
         | 
| 575 | 
            -
            - lib/volt/models/validations.rb
         | 
| 563 | 
            +
            - lib/volt/models/validations/errors.rb
         | 
| 564 | 
            +
            - lib/volt/models/validations/validations.rb
         | 
| 576 565 | 
             
            - lib/volt/models/validators/email_validator.rb
         | 
| 577 566 | 
             
            - lib/volt/models/validators/format_validator.rb
         | 
| 578 567 | 
             
            - lib/volt/models/validators/length_validator.rb
         | 
| @@ -651,6 +640,7 @@ files: | |
| 651 640 | 
             
            - lib/volt/server/rack/source_map_server.rb
         | 
| 652 641 | 
             
            - lib/volt/server/socket_connection_handler.rb
         | 
| 653 642 | 
             
            - lib/volt/server/socket_connection_handler_stub.rb
         | 
| 643 | 
            +
            - lib/volt/server/template_handlers/handlers.rb
         | 
| 654 644 | 
             
            - lib/volt/server/websocket/rack_server_adaptor.rb
         | 
| 655 645 | 
             
            - lib/volt/server/websocket/websocket_handler.rb
         | 
| 656 646 | 
             
            - lib/volt/spec/capybara.rb
         | 
| @@ -702,6 +692,7 @@ files: | |
| 702 692 | 
             
            - spec/apps/kitchen_sink/app/main/views/main/cookie_test.html
         | 
| 703 693 | 
             
            - spec/apps/kitchen_sink/app/main/views/main/first_last.html
         | 
| 704 694 | 
             
            - spec/apps/kitchen_sink/app/main/views/main/flash.html
         | 
| 695 | 
            +
            - spec/apps/kitchen_sink/app/main/views/main/form.html
         | 
| 705 696 | 
             
            - spec/apps/kitchen_sink/app/main/views/main/html_safe.html
         | 
| 706 697 | 
             
            - spec/apps/kitchen_sink/app/main/views/main/index.html
         | 
| 707 698 | 
             
            - spec/apps/kitchen_sink/app/main/views/main/main.html
         | 
| @@ -756,6 +747,7 @@ files: | |
| 756 747 | 
             
            - spec/models/user_spec.rb
         | 
| 757 748 | 
             
            - spec/models/user_validation_spec.rb
         | 
| 758 749 | 
             
            - spec/models/validations_spec.rb
         | 
| 750 | 
            +
            - spec/models/validators/block_validations_spec.rb
         | 
| 759 751 | 
             
            - spec/models/validators/email_validator_spec.rb
         | 
| 760 752 | 
             
            - spec/models/validators/format_validator_spec.rb
         | 
| 761 753 | 
             
            - spec/models/validators/length_validator_spec.rb
         | 
| @@ -774,6 +766,7 @@ files: | |
| 774 766 | 
             
            - spec/reactive/reactive_array_spec.rb
         | 
| 775 767 | 
             
            - spec/reactive/reactive_hash_spec.rb
         | 
| 776 768 | 
             
            - spec/router/routes_spec.rb
         | 
| 769 | 
            +
            - spec/server/component_templates_spec.rb
         | 
| 777 770 | 
             
            - spec/server/html_parser/sample_page.html
         | 
| 778 771 | 
             
            - spec/server/html_parser/sandlebars_parser_spec.rb
         | 
| 779 772 | 
             
            - spec/server/html_parser/view_handler_spec.rb
         | 
| @@ -792,6 +785,7 @@ files: | |
| 792 785 | 
             
            - spec/tasks/live_query_spec.rb
         | 
| 793 786 | 
             
            - spec/tasks/query_tasks.rb
         | 
| 794 787 | 
             
            - spec/tasks/query_tracker_spec.rb
         | 
| 788 | 
            +
            - spec/tasks/user_tasks_spec.rb
         | 
| 795 789 | 
             
            - spec/templates/targets/binding_document/component_node_spec.rb
         | 
| 796 790 | 
             
            - spec/utils/generic_counting_pool_spec.rb
         | 
| 797 791 | 
             
            - spec/utils/generic_pool_spec.rb
         | 
| @@ -826,6 +820,7 @@ files: | |
| 826 820 | 
             
            - templates/newgem/app/newgem/assets/css/.empty_directory
         | 
| 827 821 | 
             
            - templates/newgem/app/newgem/assets/js/.empty_directory
         | 
| 828 822 | 
             
            - templates/newgem/app/newgem/config/dependencies.rb
         | 
| 823 | 
            +
            - templates/newgem/app/newgem/config/initializers/boot.rb
         | 
| 829 824 | 
             
            - templates/newgem/app/newgem/config/routes.rb
         | 
| 830 825 | 
             
            - templates/newgem/app/newgem/controllers/main_controller.rb.tt
         | 
| 831 826 | 
             
            - templates/newgem/app/newgem/controllers/server/.empty_directory
         | 
| @@ -853,6 +848,7 @@ files: | |
| 853 848 | 
             
            - templates/project/app/main/config/dependencies.rb
         | 
| 854 849 | 
             
            - templates/project/app/main/config/routes.rb
         | 
| 855 850 | 
             
            - templates/project/app/main/controllers/main_controller.rb
         | 
| 851 | 
            +
            - templates/project/app/main/lib/.empty_directory
         | 
| 856 852 | 
             
            - templates/project/app/main/models/.empty_directory
         | 
| 857 853 | 
             
            - templates/project/app/main/models/user.rb
         | 
| 858 854 | 
             
            - templates/project/app/main/tasks/.empty_directory
         | 
| @@ -863,7 +859,6 @@ files: | |
| 863 859 | 
             
            - templates/project/config/app.rb.tt
         | 
| 864 860 | 
             
            - templates/project/config/base/index.html
         | 
| 865 861 | 
             
            - templates/project/config/initializers/.empty_directory
         | 
| 866 | 
            -
            - templates/project/lib/.empty_directory
         | 
| 867 862 | 
             
            - templates/project/spec/app/main/controllers/server/sample_http_controller_spec.rb
         | 
| 868 863 | 
             
            - templates/project/spec/app/main/integration/sample_integration_spec.rb
         | 
| 869 864 | 
             
            - templates/project/spec/app/main/models/sample_model_spec.rb
         | 
| @@ -888,9 +883,9 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 888 883 | 
             
                  version: '2.1'
         | 
| 889 884 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 890 885 | 
             
              requirements:
         | 
| 891 | 
            -
              - - " | 
| 886 | 
            +
              - - ">"
         | 
| 892 887 | 
             
                - !ruby/object:Gem::Version
         | 
| 893 | 
            -
                  version:  | 
| 888 | 
            +
                  version: 1.3.1
         | 
| 894 889 | 
             
            requirements: []
         | 
| 895 890 | 
             
            rubyforge_project: 
         | 
| 896 891 | 
             
            rubygems_version: 2.4.5
         | 
| @@ -921,6 +916,7 @@ test_files: | |
| 921 916 | 
             
            - spec/apps/kitchen_sink/app/main/views/main/cookie_test.html
         | 
| 922 917 | 
             
            - spec/apps/kitchen_sink/app/main/views/main/first_last.html
         | 
| 923 918 | 
             
            - spec/apps/kitchen_sink/app/main/views/main/flash.html
         | 
| 919 | 
            +
            - spec/apps/kitchen_sink/app/main/views/main/form.html
         | 
| 924 920 | 
             
            - spec/apps/kitchen_sink/app/main/views/main/html_safe.html
         | 
| 925 921 | 
             
            - spec/apps/kitchen_sink/app/main/views/main/index.html
         | 
| 926 922 | 
             
            - spec/apps/kitchen_sink/app/main/views/main/main.html
         | 
| @@ -975,6 +971,7 @@ test_files: | |
| 975 971 | 
             
            - spec/models/user_spec.rb
         | 
| 976 972 | 
             
            - spec/models/user_validation_spec.rb
         | 
| 977 973 | 
             
            - spec/models/validations_spec.rb
         | 
| 974 | 
            +
            - spec/models/validators/block_validations_spec.rb
         | 
| 978 975 | 
             
            - spec/models/validators/email_validator_spec.rb
         | 
| 979 976 | 
             
            - spec/models/validators/format_validator_spec.rb
         | 
| 980 977 | 
             
            - spec/models/validators/length_validator_spec.rb
         | 
| @@ -993,6 +990,7 @@ test_files: | |
| 993 990 | 
             
            - spec/reactive/reactive_array_spec.rb
         | 
| 994 991 | 
             
            - spec/reactive/reactive_hash_spec.rb
         | 
| 995 992 | 
             
            - spec/router/routes_spec.rb
         | 
| 993 | 
            +
            - spec/server/component_templates_spec.rb
         | 
| 996 994 | 
             
            - spec/server/html_parser/sample_page.html
         | 
| 997 995 | 
             
            - spec/server/html_parser/sandlebars_parser_spec.rb
         | 
| 998 996 | 
             
            - spec/server/html_parser/view_handler_spec.rb
         | 
| @@ -1011,6 +1009,7 @@ test_files: | |
| 1011 1009 | 
             
            - spec/tasks/live_query_spec.rb
         | 
| 1012 1010 | 
             
            - spec/tasks/query_tasks.rb
         | 
| 1013 1011 | 
             
            - spec/tasks/query_tracker_spec.rb
         | 
| 1012 | 
            +
            - spec/tasks/user_tasks_spec.rb
         | 
| 1014 1013 | 
             
            - spec/templates/targets/binding_document/component_node_spec.rb
         | 
| 1015 1014 | 
             
            - spec/utils/generic_counting_pool_spec.rb
         | 
| 1016 1015 | 
             
            - spec/utils/generic_pool_spec.rb
         |