volt 0.9.6 → 0.9.7.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/CHANGELOG.md +26 -0
  4. data/Gemfile +6 -1
  5. data/README.md +2 -0
  6. data/Rakefile +1 -0
  7. data/app/volt/models/active_volt_instance.rb +8 -6
  8. data/app/volt/models/user.rb +11 -2
  9. data/app/volt/models/volt_app_property.rb +8 -0
  10. data/app/volt/tasks/query_tasks.rb +23 -31
  11. data/app/volt/tasks/store_tasks.rb +2 -2
  12. data/app/volt/tasks/volt_admin_tasks.rb +24 -0
  13. data/docs/UPGRADE_GUIDE.md +6 -0
  14. data/lib/volt.rb +19 -12
  15. data/lib/volt/boot.rb +1 -0
  16. data/lib/volt/cli.rb +19 -8
  17. data/lib/volt/cli/console.rb +0 -1
  18. data/lib/volt/cli/generators.rb +14 -3
  19. data/lib/volt/cli/migrate.rb +26 -0
  20. data/lib/volt/config.rb +17 -4
  21. data/lib/volt/controllers/http_controller.rb +12 -0
  22. data/lib/volt/data_stores/base_adaptor_client.rb +2 -2
  23. data/lib/volt/data_stores/base_adaptor_server.rb +2 -0
  24. data/lib/volt/data_stores/data_store.rb +20 -14
  25. data/lib/volt/extra_core/class.rb +28 -14
  26. data/lib/volt/extra_core/hash.rb +5 -0
  27. data/lib/volt/extra_core/string.rb +3 -1
  28. data/lib/volt/helpers/time.rb +9 -43
  29. data/lib/volt/helpers/time/calculations.rb +204 -0
  30. data/lib/volt/helpers/time/distance.rb +63 -0
  31. data/lib/volt/helpers/time/duration.rb +71 -0
  32. data/lib/volt/helpers/time/local_calculations.rb +49 -0
  33. data/lib/volt/helpers/time/local_volt_time.rb +23 -0
  34. data/lib/volt/helpers/time/numeric.rb +59 -0
  35. data/lib/volt/helpers/time/volt_time.rb +170 -0
  36. data/lib/volt/models.rb +5 -0
  37. data/lib/volt/models/array_model.rb +33 -6
  38. data/lib/volt/models/associations.rb +146 -23
  39. data/lib/volt/models/buffer.rb +38 -41
  40. data/lib/volt/models/cursor.rb +15 -0
  41. data/lib/volt/models/errors.rb +11 -0
  42. data/lib/volt/models/field_helpers.rb +108 -68
  43. data/lib/volt/models/helpers/array_model.rb +4 -0
  44. data/lib/volt/models/helpers/base.rb +8 -1
  45. data/lib/volt/models/helpers/change_helpers.rb +31 -12
  46. data/lib/volt/models/helpers/defaults.rb +15 -0
  47. data/lib/volt/models/location.rb +20 -6
  48. data/lib/volt/models/migrations/migration.rb +23 -0
  49. data/lib/volt/models/migrations/migration_runner.rb +146 -0
  50. data/lib/volt/models/model.rb +38 -1
  51. data/lib/volt/models/permissions.rb +8 -1
  52. data/lib/volt/models/persistors/array_store.rb +87 -8
  53. data/lib/volt/models/persistors/base.rb +19 -0
  54. data/lib/volt/models/persistors/model_store.rb +1 -1
  55. data/lib/volt/models/persistors/page.rb +4 -1
  56. data/lib/volt/models/persistors/query/query_identifier.rb +102 -0
  57. data/lib/volt/models/persistors/query/query_listener.rb +57 -12
  58. data/lib/volt/models/root_models/root_models.rb +19 -0
  59. data/lib/volt/models/url.rb +11 -2
  60. data/lib/volt/models/validations/validations.rb +5 -2
  61. data/lib/volt/models/validators/type_validator.rb +11 -0
  62. data/lib/volt/models/validators/unique_validator.rb +2 -2
  63. data/lib/volt/page/bindings/attribute_binding.rb +23 -1
  64. data/lib/volt/page/targets/attribute_section.rb +7 -0
  65. data/lib/volt/page/targets/binding_document/component_node.rb +44 -18
  66. data/lib/volt/page/targets/binding_document/tag_node.rb +41 -0
  67. data/lib/volt/page/tasks.rb +16 -8
  68. data/lib/volt/queries/live_query.rb +109 -0
  69. data/lib/volt/queries/live_query_pool.rb +58 -0
  70. data/lib/volt/queries/live_subquery.rb +0 -0
  71. data/lib/volt/queries/query_association_splitter.rb +31 -0
  72. data/lib/volt/queries/query_diff.rb +100 -0
  73. data/lib/volt/queries/query_runner.rb +110 -0
  74. data/lib/volt/queries/query_subscription.rb +80 -0
  75. data/lib/volt/queries/query_subscription_pool.rb +37 -0
  76. data/lib/volt/reactive/eventable.rb +8 -0
  77. data/lib/volt/reactive/reactive_array.rb +0 -4
  78. data/lib/volt/router/routes.rb +81 -31
  79. data/lib/volt/server/message_bus/base_message_bus.rb +9 -3
  80. data/lib/volt/server/message_bus/peer_to_peer.rb +6 -6
  81. data/lib/volt/server/message_bus/peer_to_peer/server_tracker.rb +1 -1
  82. data/lib/volt/server/middleware/default_middleware_stack.rb +12 -8
  83. data/lib/volt/server/rack/component_paths.rb +31 -4
  84. data/lib/volt/server/rack/http_content_types.rb +62 -0
  85. data/lib/volt/server/rack/http_resource.rb +1 -1
  86. data/lib/volt/server/rack/index_files.rb +8 -1
  87. data/lib/volt/server/rack/opal_files.rb +16 -1
  88. data/lib/volt/server/rack/sprockets_helpers_setup.rb +32 -1
  89. data/lib/volt/server/socket_connection_handler.rb +16 -7
  90. data/lib/volt/server/template_handlers/sprockets_component_handler.rb +5 -3
  91. data/lib/volt/spec/capybara.rb +4 -3
  92. data/lib/volt/spec/setup.rb +5 -0
  93. data/lib/volt/tasks/dispatcher.rb +3 -1
  94. data/lib/volt/utils/data_transformer.rb +4 -4
  95. data/lib/volt/utils/ejson.rb +19 -6
  96. data/lib/volt/utils/promise_extensions.rb +1 -1
  97. data/lib/volt/utils/time_opal_patch.rb +749 -0
  98. data/lib/volt/utils/time_patch.rb +11 -4
  99. data/lib/volt/version.rb +1 -1
  100. data/lib/volt/volt/app.rb +19 -11
  101. data/lib/volt/volt/properties.rb +24 -0
  102. data/lib/volt/volt/server_setup/app.rb +30 -7
  103. data/lib/volt/volt/users.rb +15 -3
  104. data/spec/apps/kitchen_sink/Gemfile +5 -1
  105. data/spec/apps/kitchen_sink/app/main/config/routes.rb +1 -0
  106. data/spec/apps/kitchen_sink/app/main/controllers/save_controller.rb +1 -1
  107. data/spec/apps/kitchen_sink/app/main/controllers/server/simple_http_controller.rb +4 -0
  108. data/spec/apps/kitchen_sink/app/main/controllers/todos_controller.rb +4 -2
  109. data/spec/apps/kitchen_sink/app/main/models/post.rb +0 -1
  110. data/spec/apps/kitchen_sink/app/main/models/todo.rb +4 -0
  111. data/spec/apps/kitchen_sink/app/main/views/mailers/reset_password.html +10 -0
  112. data/spec/apps/kitchen_sink/app/main/views/todos/index.html +2 -0
  113. data/spec/apps/kitchen_sink/config/app.rb +2 -0
  114. data/spec/apps/migrations/config/db/migrations/1445111704_migration1.rb +7 -0
  115. data/spec/apps/migrations/config/db/migrations/1445113517_migration2.rb +7 -0
  116. data/spec/apps/migrations/config/db/migrations/1445115200_migration3.rb +7 -0
  117. data/spec/extra_core/class_spec.rb +10 -0
  118. data/spec/helpers/distance_spec.rb +35 -0
  119. data/spec/helpers/duration_spec.rb +160 -0
  120. data/spec/helpers/volt_time_spec.rb +275 -0
  121. data/spec/integration/callbacks_spec.rb +2 -1
  122. data/spec/integration/http_endpoints_spec.rb +4 -0
  123. data/spec/integration/save_spec.rb +1 -1
  124. data/spec/integration/todos_spec.rb +7 -5
  125. data/spec/models/array_model_spec.rb +17 -3
  126. data/spec/models/associations_spec.rb +48 -1
  127. data/spec/models/field_helpers_spec.rb +7 -3
  128. data/spec/models/migrations/migration_runner_spec.rb +69 -0
  129. data/spec/models/model_spec.rb +42 -8
  130. data/spec/models/permissions_spec.rb +20 -8
  131. data/spec/models/persistors/array_store_spec.rb +18 -0
  132. data/spec/models/persistors/page_spec.rb +15 -10
  133. data/spec/models/persistors/store_spec.rb +13 -3
  134. data/spec/models/url_spec.rb +4 -3
  135. data/spec/models/user_spec.rb +6 -3
  136. data/spec/models/user_validation_spec.rb +3 -3
  137. data/spec/models/validations_spec.rb +4 -0
  138. data/spec/models/validators/block_validations_spec.rb +9 -5
  139. data/spec/models/validators/email_validator_spec.rb +2 -0
  140. data/spec/models/validators/lifecycle_callbacks_spec.rb +86 -0
  141. data/spec/models/validators/unique_validator_spec.rb +1 -0
  142. data/spec/page/path_string_renderer_spec.rb +5 -0
  143. data/spec/queries/live_query_spec.rb +16 -0
  144. data/spec/queries/query_association_splitter_spec.rb +14 -0
  145. data/spec/queries/query_diff_spec.rb +132 -0
  146. data/spec/queries/query_identifier_spec.rb +98 -0
  147. data/spec/queries/query_runner_spec.rb +63 -0
  148. data/spec/queries/query_tracker_spec.rb +141 -0
  149. data/spec/router/routes_spec.rb +52 -21
  150. data/spec/server/middleware/rack_content_types_spec.rb +78 -0
  151. data/spec/server/rack/asset_files_spec.rb +38 -30
  152. data/spec/spec_helper.rb +8 -0
  153. data/spec/utils/ejson_spec.rb +9 -8
  154. data/spec/utils/ejson_volt_time_spec.rb +65 -0
  155. data/templates/migration/migration.rb.tt +9 -0
  156. data/templates/newgem/gitignore.tt +1 -0
  157. data/templates/project/Gemfile.tt +19 -2
  158. data/templates/project/README.md.tt +6 -1
  159. data/templates/project/app/main/config/dependencies.rb +6 -0
  160. data/templates/project/config/app.rb.tt +18 -4
  161. data/volt.gemspec +2 -2
  162. metadata +73 -16
  163. data/app/volt/tasks/live_query/live_query_pool.rb +0 -48
  164. data/app/volt/tasks/live_query/query_tracker.rb +0 -92
  165. data/spec/tasks/live_query_spec.rb +0 -18
  166. data/spec/tasks/query_tasks.rb +0 -7
  167. data/spec/tasks/query_tracker_spec.rb +0 -145
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1fe04baec1557acb6a08015750b7d20fad493f47
4
- data.tar.gz: e2da487f9ee5fb406dcf7f4090bed2dda65f92f3
3
+ metadata.gz: 25051871468c59824f6199f8656f30ebb31134a4
4
+ data.tar.gz: 0a9d1c61f06188fd8395abbe62a05aa7535d297c
5
5
  SHA512:
6
- metadata.gz: 1f71474b6ed762a6662e38d6ab179e50003ce21a172b4514d9608283b90f2f24c93a8ced63284795a5e23e028a0208061c29651441c27d5cc5958d5e2517501d
7
- data.tar.gz: d2ae18337a6654e85864f98b8adf4cd081c0d401045d5882a82b62fbcaf8284c5d1a6f5d6c531dfb6383670c795e56b0570c69f71ee64a97b0c049642b6ca9fa
6
+ metadata.gz: ca789facecc7f76aaa5b2f92e2c8b900113d2b390cfa2a5aca6e771ad4dc3ff32659e578a8fba23bb3243dbc6e4061aad7d842374401dd181c77c46e26465537
7
+ data.tar.gz: 40c1a6edf970b4eac77087023a4d2b94b420cd92b2d28b588e92b0ef70ab23c3080b59b9e6a785f74173924e09fb47dae0a16928e606a3f91390f5c76040a6ed
data/.gitignore CHANGED
@@ -22,4 +22,5 @@ tmp
22
22
  sauce_connect.log
23
23
  .ruby-gemset
24
24
  tags
25
- config/db/
25
+ config/db/
26
+ spec/apps/kitchen_sink/config/db
data/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.9.7
4
+
5
+ ### Added
6
+ You can now do "splat" matches in routes. Splat matches let you match multiple sections at the end of a url.
7
+ ```ruby
8
+ client '/info/{{ *rest_of_path }}', component: 'main', controller: 'main', action: 'info'
9
+ ```
10
+
11
+ By doing the above, anything after /info/ will be matched and placed into the rest_of_path param.
12
+
13
+ - Add send_file(path) to HttpController, send_file streams the file off of disk.
14
+ - ```field``` now accepts :default
15
+ - ```index``` has been added for sql databases:
16
+ ```index :user_id``` (single)
17
+ ```index [:user_id, :name]``` (compound)
18
+ ```index [:user_id, :username], unique: true``` (unique)
19
+
20
+
21
+ ### Changed
22
+ - fixed the issue with serving precompiled assets in production. It also fixes the issue where sometimes non-root urls wouldn't load correctly.
23
+ - fixed issue with some routes not matching
24
+ - fixed issue with attribute bindings in mailer templates
25
+
26
+
27
+
3
28
  ## 0.9.6
4
29
  0.9.6 is mostly a bug fix release with a few minor features.
5
30
 
@@ -17,6 +42,7 @@ Volt.boot(Dir.pwd)
17
42
  - Finally tracked down an illusive memory leak.
18
43
  - Computations now raise an error on their inital run, then log errors (via Volt.logger.error(..)) when running again (since they update on next tick)
19
44
  - fixed template caching issue
45
+ - .validate! return a promise that now rejects when the model is invalid
20
46
  - upgrade the volt-mongo gem to mongo gem 2.1
21
47
  - fixed issue with https web socket connection
22
48
  - improved errors when returning objects from Tasks that can't be serialized
data/Gemfile CHANGED
@@ -3,7 +3,8 @@ source 'http://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  # volt-mongo gem for testing
6
- gem 'volt-mongo'
6
+ # gem 'volt-mongo'
7
+ gem 'volt-sql'
7
8
 
8
9
  # Use rbnacl for message bus encrpytion
9
10
  # (optional, if you don't need encryption, disable in app.rb and remove)
@@ -12,6 +13,10 @@ gem 'rbnacl-libsodium', require: false
12
13
 
13
14
  # temp until 0.8.0 of opal
14
15
  # gem 'opal-rspec', github: 'opal/opal-rspec'
16
+ gem 'sqlite3'
17
+ gem 'pg', '~> 0.18.2'
18
+ gem 'pg_json', '~> 0.1.29'
19
+
15
20
 
16
21
  group :development, :test do
17
22
  # For testing the kitchen sink app
data/README.md CHANGED
@@ -27,6 +27,8 @@ Check out demo apps:
27
27
  - https://github.com/voltrb/todomvc
28
28
  - https://github.com/voltrb/blog5
29
29
 
30
+ For a full list of all things volt, check out [awesome-volt](https://github.com/heri/awesome-volt)
31
+
30
32
  # Docs
31
33
 
32
34
  Read the [full docs on Volt here](http://voltframework.com/docs)
data/Rakefile CHANGED
@@ -31,6 +31,7 @@ task :test do
31
31
  Rake::Task['ruby:rspec'].invoke
32
32
  end
33
33
 
34
+ desc "Run opal specs in the browser"
34
35
  task :opal_specs_in_browser do
35
36
  require 'volt/server/websocket/rack_server_adaptor'
36
37
  require 'rack/cascade'
@@ -1,6 +1,8 @@
1
- class ActiveVoltInstance < Volt::Model
2
- field :server_id, String
3
- field :ips, String
4
- field :port, Fixnum
5
- field :time#, Time
6
- end
1
+ unless ENV['NO_MESSAGE_BUS']
2
+ class ActiveVoltInstance < Volt::Model
3
+ field :server_id, String
4
+ field :ips, String
5
+ field :port, Fixnum
6
+ field :time#, Time
7
+ end
8
+ end
@@ -2,7 +2,15 @@ require 'bcrypt' unless RUBY_PLATFORM == 'opal'
2
2
 
3
3
  module Volt
4
4
  class User < Model
5
- field :password
5
+ field :hashed_password
6
+
7
+ def password=(val)
8
+ set(:password, val)
9
+ end
10
+
11
+ def password
12
+ get(:password)
13
+ end
6
14
 
7
15
  # returns login field name depending on config settings
8
16
  def self.login_field
@@ -44,10 +52,11 @@ module Volt
44
52
 
45
53
  if password.present?
46
54
  # Clear the password
47
- set('password', nil)
55
+ # set('password', nil)
48
56
 
49
57
  # Set the hashed_password field instead
50
58
  set('hashed_password', BCrypt::Password.create(password))
59
+ delete('password')
51
60
  end
52
61
  end
53
62
  end
@@ -0,0 +1,8 @@
1
+ # VoltAppProperty backs the volt_app.properties hash. properties is designed
2
+ # to allow things like gems that have external setup processes (creating an
3
+ # S3 bucket for example) to keep track of if that action has been completed on
4
+ # a global level.
5
+ class VoltAppProperty < Volt::Model
6
+ field :name, String
7
+ field :value, String
8
+ end
@@ -1,8 +1,10 @@
1
+ # QueryTasks is responsible for passing back the data from a query. It will
2
+ # be run both from the client side and server side. From the client it passed
3
+ # data with websockets. From the server it uses the stub channel to pass data
4
+ # directly.
5
+
1
6
  class QueryTasks < Volt::Task
2
7
  def add_listener(collection, query)
3
- live_query = @volt_app.live_query_pool.lookup(collection, query)
4
- track_channel_in_live_query(live_query)
5
-
6
8
  if @channel
7
9
  # For requests from the client (with @channel), we track the channel
8
10
  # so we can send the results back. Server side requests don't stay live,
@@ -11,61 +13,51 @@ class QueryTasks < Volt::Task
11
13
 
12
14
  # live_query.add_channel(@channel)
13
15
  end
14
- live_query.add_channel(@channel)
16
+
17
+ query_subscription = subscription(collection, query)
15
18
 
16
19
  errors = {}
17
20
 
18
21
  begin
19
22
  # Get the initial data
20
- initial_data = live_query.initial_data
23
+ initial_data = query_subscription.initial_data
21
24
  rescue => exception
22
25
  # Capture and pass up any exceptions
23
26
  error = { error: exception.message }
24
27
  end
25
28
 
26
- if initial_data
27
- # Only send the filtered attributes for this user
28
- initial_data.map! do |data|
29
- [data[0], live_query.model_for_filter(data[1]).filtered_attributes.sync]
30
- end
31
- end
32
-
33
29
  [initial_data, error]
34
30
  end
35
31
 
36
32
  def initial_data
37
- data = live_query.initial_data
38
- data[:id] = data[:id].to_s
39
-
40
- data
33
+ live_query.initial_data(@channel)
41
34
  end
42
35
 
43
36
  # Remove a listening channel, the LiveQuery will automatically remove
44
37
  # itsself from the pool when there are no channels.
45
38
  def remove_listener(collection, query)
46
- live_query = @volt_app.live_query_pool.lookup(collection, query)
47
- live_query.remove_channel(@channel)
39
+ # TODO: Need LiveQueryPool to be counting, and we need to remove it
40
+ query_sub = subscription(collection, query)
41
+ query_sub.remove
48
42
  end
49
43
 
50
- # Removes a channel from all associated live queries
44
+ # Remove all QuerySubscriptions for a channel
51
45
  def close!
52
- live_queries = @volt_app.channel_live_queries[@channel]
46
+ query_subscriptions = @volt_app.channel_query_subscriptions[@channel]
53
47
 
54
- if live_queries
55
- live_queries.each do |live_query|
56
- live_query.remove_channel(@channel)
57
- end
48
+ if query_subscriptions
49
+ query_subscriptions.keys.reverse.each(&:remove)
58
50
  end
59
-
60
- @volt_app.channel_live_queries.delete(@channel)
61
51
  end
62
52
 
63
53
  private
64
54
 
65
- # Tracks that this channel will be notified from the live query.
66
- def track_channel_in_live_query(live_query)
67
- channel_live_queries = @volt_app.channel_live_queries
68
- channel_live_queries[@channel] ||= []
69
- channel_live_queries[@channel] << live_query
55
+ def subscription(collection, query)
56
+ # Lookup or create the live query
57
+ live_query = @volt_app.live_query_pool.lookup(collection, query)
58
+
59
+ # Find or create a QuerySubscription for this channel
60
+ live_query.query_subscription_for_channel(@channel)
70
61
  end
62
+
71
63
  end
@@ -2,7 +2,7 @@ require 'volt/models'
2
2
 
3
3
  class StoreTasks < Volt::Task
4
4
  def db
5
- @@db ||= Volt::DataStore.fetch
5
+ @@db ||= Volt::DataStore.fetch(Volt.current_app)
6
6
  end
7
7
 
8
8
  def load_model(collection, path, data)
@@ -66,7 +66,7 @@ class StoreTasks < Volt::Task
66
66
 
67
67
  query.first.then do |model|
68
68
  if model
69
- if model.can_delete?
69
+ if model.can_delete?.sync
70
70
  db.delete(collection, 'id' => id)
71
71
  else
72
72
  fail "Permissions did not allow #{collection} #{id} to be deleted."
@@ -0,0 +1,24 @@
1
+ class VoltAdminTasks < Volt::Task
2
+ def live_queries
3
+ pool = @volt_app.live_query_pool.pool
4
+
5
+ live_queries = []
6
+
7
+ pool.each_pair do |collection, queries|
8
+ if queries
9
+ queries.each do |query, live_query|
10
+ live_queries << live_query
11
+ end
12
+ end
13
+ end
14
+
15
+ data = live_queries.map do |lq|
16
+ [lq.collection, lq.query]
17
+ end
18
+
19
+ puts "--- current query pool ---"
20
+ puts data.map {|collection, query| "#{collection}:\t#{query.inspect}" }
21
+
22
+ data
23
+ end
24
+ end
@@ -1,3 +1,9 @@
1
+ # 0.9.5 to 0.9.7
2
+
3
+ - 0.9.7 adds the awesome VoltTime class.
4
+ To make this work, some stuff had to change in volt-mongo, upgrade volt-mongo to at least 0.2.0. Also, switch any instances of Time to VoltTime.
5
+ -
6
+
1
7
  # 0.9.4 to 0.9.5
2
8
 
3
9
  CSS url's now should be referenced either 1) as relative paths from the css file, or 2) using the full path from inside of app (eg: main/assets/images/background.jpg)
data/lib/volt.rb CHANGED
@@ -6,6 +6,7 @@ require 'volt/utils/modes'
6
6
  require 'volt/utils/volt_user_error'
7
7
  require 'volt/utils/boolean_patch'
8
8
  require 'volt/utils/time_patch'
9
+ require 'volt/utils/time_opal_patch' if RUBY_PLATFORM == 'opal'
9
10
 
10
11
  require 'volt/config'
11
12
  require 'volt/data_stores/data_store' unless RUBY_PLATFORM == 'opal'
@@ -13,12 +14,12 @@ require 'volt/volt/users'
13
14
 
14
15
  module Volt
15
16
  @in_browser = if RUBY_PLATFORM == 'opal'
16
- # When testing with opal-rspec, it technically is in a browser
17
- # but its not setup with our own app code.
18
- `!!document && !window.OPAL_SPEC_PHANTOM && window.$`
19
- else
20
- false
21
- end
17
+ # When testing with opal-rspec, it technically is in a browser
18
+ # but its not setup with our own app code.
19
+ `!!document && !window.OPAL_SPEC_PHANTOM && window.$`
20
+ else
21
+ false
22
+ end
22
23
 
23
24
  include Modes
24
25
 
@@ -38,12 +39,18 @@ module Volt
38
39
  !ENV['SERVER']
39
40
  end
40
41
 
41
- def source_maps?
42
- if !ENV['MAPS']
43
- # If no MAPS is specified, enable it in dev
44
- Volt.env.development?
45
- else
46
- ENV['MAPS'] != 'false'
42
+ if RUBY_PLATFORM != 'opal'
43
+ def console?
44
+ !!ENV['CONSOLE']
45
+ end
46
+
47
+ def source_maps?
48
+ if !ENV['MAPS']
49
+ # If no MAPS is specified, enable it in dev
50
+ Volt.env.development?
51
+ else
52
+ ENV['MAPS'] != 'false'
53
+ end
47
54
  end
48
55
  end
49
56
 
data/lib/volt/boot.rb CHANGED
@@ -2,6 +2,7 @@ unless RUBY_PLATFORM == 'opal'
2
2
  # An option to skip requiring.
3
3
  unless ENV['SKIP_BUNDLER_REQUIRE']
4
4
  # Require in gems
5
+ require 'bundler'
5
6
  Bundler.require(:default, (ENV['VOLT_ENV'] || ENV['RACK_ENV'] || :development).to_sym)
6
7
  end
7
8
  end
data/lib/volt/cli.rb CHANGED
@@ -6,9 +6,15 @@ require 'volt/extra_core/extra_core'
6
6
  require 'volt/cli/generators'
7
7
  require 'volt/cli/generate'
8
8
  require 'volt/cli/destroy'
9
+ require 'volt/cli/migrate'
9
10
  require 'volt/version'
10
11
  require 'volt/cli/bundle'
11
12
 
13
+ # new doesn't run inside of a Gemfile, so don't boot the volt app
14
+ unless ARGV[0] == 'new'
15
+ require 'volt/boot'
16
+ end
17
+
12
18
  module Volt
13
19
  class CLI < Thor
14
20
  include Thor::Actions
@@ -16,10 +22,12 @@ module Volt
16
22
 
17
23
  register(Generate, 'generate', 'generate GENERATOR [args]', 'Run a generator.')
18
24
  register(Destroy, 'destroy', 'destroy GENERATOR [args]', 'Delete files created by a generator.')
25
+ register(CliSubclasses::Migrate, 'migrate', 'migrate up/down', 'Migrate your app data')
19
26
 
20
27
  desc 'new PROJECT_NAME', 'generates a new project.'
21
28
 
22
29
  def new(name)
30
+ ENV['SKIP_BUNDLER_REQUIRE'] = 'true'
23
31
  new_project(name)
24
32
 
25
33
  say ""
@@ -35,6 +43,7 @@ module Volt
35
43
  desc 'console', 'run the console on the project in the current directory'
36
44
 
37
45
  def console
46
+ ENV['CONSOLE'] = 'true'
38
47
  require 'volt/cli/console'
39
48
  Console.start
40
49
  end
@@ -109,11 +118,10 @@ module Volt
109
118
  def drop_collection(collection)
110
119
  ENV['SERVER'] = 'true'
111
120
  move_to_root
112
- require 'volt/boot'
113
121
 
114
- Volt.boot(Dir.pwd)
122
+ volt_app = Volt.boot(Dir.pwd)
115
123
 
116
- db = Volt::DataStore.fetch
124
+ db = Volt::DataStore.fetch(volt_app)
117
125
  drop = db.drop_collection(collection)
118
126
 
119
127
  say("Collection #{collection} could not be dropped", :red) if drop == false
@@ -128,11 +136,11 @@ module Volt
128
136
 
129
137
  # Grab the current volt version
130
138
  directory('project', name, {
131
- version: Volt::Version::STRING,
132
- name: name,
133
- domain: name.dasherize.downcase,
134
- app_name: name.capitalize,
135
- disable_encryption: disable_encryption
139
+ version: Volt::Version::STRING,
140
+ name: name,
141
+ domain: name.dasherize.downcase,
142
+ app_name: name.capitalize,
143
+ disable_encryption: disable_encryption
136
144
  })
137
145
 
138
146
  unless skip_gemfile
@@ -172,6 +180,9 @@ module Volt
172
180
  def self.source_root
173
181
  File.expand_path(File.join(File.dirname(__FILE__), '../../templates'))
174
182
  end
183
+
184
+ map "d" => "destroy"
185
+ map "dc" => "drop_collection"
175
186
  end
176
187
  end
177
188
 
@@ -67,7 +67,6 @@ module Volt
67
67
  ENV['SERVER'] = 'true'
68
68
 
69
69
  require 'volt'
70
- require 'volt/boot'
71
70
  require 'volt/volt/core'
72
71
  require 'volt/server/socket_connection_handler_stub'
73
72