launchpadlab / token-master Goto Github PK
View Code? Open in Web Editor NEWMinimal and Simple user management for Ruby and Rails applications.
License: MIT License
Minimal and Simple user management for Ruby and Rails applications.
License: MIT License
Project is currently on Ruby V 2.3.0, which reached its end of life in 2019.
Initializer Template includes guidance liek the below:
# Examples:
# config.add_tokenable_options :confirm, TokenMaster::Config::DEFAULT_VALUES
However, because of the way the second argument (a hash) is deconstructed in lib/config:
def add_tokenable_options(key, **params)
@options[key] = params
end
This results in a conflict with the way Ruby 3.1 is passing those options along:
https://www.ruby-lang.org/en/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/
The fix for the user is to splat their options in the initializer like so:
config.add_tokenable_options :confirm, **TokenMaster::Config::DEFAULT_VALUES
creating an issue in here in case there's an option to update the core code to support either approaches, for example not double-splatting and setting the default to be the TokenMaster default
Currently, whenever things go wrong we throw a generic error with a message. However, clients may want to react differently to different types of errors, ex. an expired token vs the model not found. Possibilities are:
TokenMaster::TokenNotFound
TokenMaster::TokenableComplete
TokenMaster::TokenExpired
TokenMaster::TokenSent
TokenMaster::TokenableDoesNotExist
This will involve handling both the presence and absence of Active Record. We will have to give users the options to handle things like update
, save
, find_by
. More details to come.
Sometimes one needs to 'force' a particular state, ex. when completing an 'invite', I also want to 'confirm' the user. Perhaps there could be a method force_<tokenable>
that would do this. This would also be helpful for testing/seed data.
I'm not 100% certain what the problem is yet, but I just want to get this down as an issue before digging in.
Token master is working as expected with my User
model in my normal client <-> API communication, but when navigating the Active Admin interface I get an error undefined method 'token_master'
.
The stack trace shows the error happening when the app is building the admin routes with ActiveAdmin.routes(self)
.
Relevant user model code:
class User < ApplicationRecord
include TokenMaster::Core
token_master :reset_password
has_secure_password
I will look into this, but if anyone has seen this issue please post here!
General review/cleanup of code & tests.
send_x_instructions!
errs out (intentionally) when the instructions have already been sent. However, we commonly need to implement a "resend invitation" feature since recipients often miss the invitation the first time around.
I can think of two approaches to this "resending" functionality:
x_created_at
to Time.now
Perhaps we actually implement the following two methods:
extend_x_token!
send_new_x_token!
Thoughts @inveterateliterate?
lib/token_master/error.rb
Update README to reflect different uses cases of the gem, and code examples.
http://yardoc.org/guides/index.html
Do we need this? don't we have global defaults?
I am getting this error when using token_master
on Rails 5.1.4: `load_missing_constant': Circular dependency detected while autoloading constant ApplicationRecord (RuntimeError)
I have a solution and will open a PR shortly.
Stack trace below:
rails s -p 4000
=> Booting Puma
=> Rails 5.1.4 application starting in development
=> Run `rails server -h` for more startup options
Exiting
/Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:508:in `load_missing_constant': Circular dependency detected while autoloading constant ApplicationRecord (RuntimeError)
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:202:in `const_missing'
from /Users/ryanfrancis/launchpad/lpl_gems/token-master/lib/token_master/railtie.rb:10:in `block (2 levels) in <class:Railtie>'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/lazy_load_hooks.rb:69:in `instance_eval'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/lazy_load_hooks.rb:69:in `block in execute_hook'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/lazy_load_hooks.rb:60:in `with_execution_control'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/lazy_load_hooks.rb:65:in `execute_hook'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/lazy_load_hooks.rb:50:in `block in run_load_hooks'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/lazy_load_hooks.rb:49:in `each'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/lazy_load_hooks.rb:49:in `run_load_hooks'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activerecord-5.1.4/lib/active_record/base.rb:326:in `<module:ActiveRecord>'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activerecord-5.1.4/lib/active_record/base.rb:25:in `<top (required)>'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:292:in `require'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:292:in `block in require'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:256:in `block in load_dependency'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:661:in `new_constants_in'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:256:in `load_dependency'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:292:in `require'
from /Users/ryanfrancis/launchpad/nsg/buku/app/models/application_record.rb:1:in `<top (required)>'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:476:in `load'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:476:in `block in load_file'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:661:in `new_constants_in'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:475:in `load_file'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:374:in `block in require_or_load'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:36:in `block in load_interlock'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies/interlock.rb:12:in `block in loading'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/concurrency/share_lock.rb:149:in `exclusive'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies/interlock.rb:11:in `loading'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:36:in `load_interlock'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:357:in `require_or_load'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:510:in `load_missing_constant'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:202:in `const_missing'
from /Users/ryanfrancis/launchpad/nsg/buku/app/models/admin_user.rb:1:in `<top (required)>'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:476:in `load'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:476:in `block in load_file'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:661:in `new_constants_in'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:475:in `load_file'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:374:in `block in require_or_load'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:36:in `block in load_interlock'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies/interlock.rb:12:in `block in loading'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/concurrency/share_lock.rb:149:in `exclusive'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies/interlock.rb:11:in `loading'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:36:in `load_interlock'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:357:in `require_or_load'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:510:in `load_missing_constant'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:202:in `const_missing'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/inflector/methods.rb:269:in `const_get'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/inflector/methods.rb:269:in `block in constantize'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/inflector/methods.rb:267:in `each'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/inflector/methods.rb:267:in `inject'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/inflector/methods.rb:267:in `constantize'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:582:in `get'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:613:in `constantize'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise-4.3.0/lib/devise.rb:313:in `get'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise-4.3.0/lib/devise/mapping.rb:81:in `to'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise-4.3.0/lib/devise/mapping.rb:76:in `modules'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise-4.3.0/lib/devise/mapping.rb:93:in `routes'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise-4.3.0/lib/devise/mapping.rb:160:in `default_used_route'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise-4.3.0/lib/devise/mapping.rb:70:in `initialize'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise-4.3.0/lib/devise.rb:343:in `new'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise-4.3.0/lib/devise.rb:343:in `add_mapping'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise-4.3.0/lib/devise/rails/routes.rb:241:in `block in devise_for'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise-4.3.0/lib/devise/rails/routes.rb:240:in `each'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise-4.3.0/lib/devise/rails/routes.rb:240:in `devise_for'
from /Users/ryanfrancis/launchpad/nsg/buku/config/routes.rb:2:in `block in <top (required)>'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/actionpack-5.1.4/lib/action_dispatch/routing/route_set.rb:426:in `instance_exec'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/actionpack-5.1.4/lib/action_dispatch/routing/route_set.rb:426:in `eval_block'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/actionpack-5.1.4/lib/action_dispatch/routing/route_set.rb:408:in `draw'
from /Users/ryanfrancis/launchpad/nsg/buku/config/routes.rb:1:in `<top (required)>'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:286:in `load'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:286:in `block in load'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:258:in `load_dependency'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:286:in `load'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/application/routes_reloader.rb:55:in `block in load_paths'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/application/routes_reloader.rb:55:in `each'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/application/routes_reloader.rb:55:in `load_paths'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/application/routes_reloader.rb:18:in `reload!'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/application/routes_reloader.rb:41:in `block in updater'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.4/lib/active_support/file_update_checker.rb:81:in `execute'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/application/routes_reloader.rb:42:in `updater'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/application/routes_reloader.rb:31:in `execute_if_updated'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/application/finisher.rb:128:in `block in <module:Finisher>'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/initializable.rb:30:in `instance_exec'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/initializable.rb:30:in `run'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/initializable.rb:59:in `block in run_initializers'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/2.3.0/tsort.rb:228:in `block in tsort_each'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/2.3.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/2.3.0/tsort.rb:431:in `each_strongly_connected_component_from'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/2.3.0/tsort.rb:349:in `block in each_strongly_connected_component'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `each'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `call'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `each_strongly_connected_component'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/2.3.0/tsort.rb:226:in `tsort_each'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/2.3.0/tsort.rb:205:in `tsort_each'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/initializable.rb:58:in `run_initializers'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/application.rb:353:in `initialize!'
from /Users/ryanfrancis/launchpad/nsg/buku/config/environment.rb:5:in `<top (required)>'
from config.ru:3:in `require_relative'
from config.ru:3:in `block in <main>'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rack-2.0.3/lib/rack/builder.rb:55:in `instance_eval'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rack-2.0.3/lib/rack/builder.rb:55:in `initialize'
from config.ru:in `new'
from config.ru:in `<main>'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rack-2.0.3/lib/rack/builder.rb:49:in `eval'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rack-2.0.3/lib/rack/builder.rb:49:in `new_from_string'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rack-2.0.3/lib/rack/builder.rb:40:in `parse_file'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rack-2.0.3/lib/rack/server.rb:319:in `build_app_and_options_from_config'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rack-2.0.3/lib/rack/server.rb:219:in `app'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/commands/server/server_command.rb:24:in `app'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rack-2.0.3/lib/rack/server.rb:354:in `wrapped_app'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/commands/server/server_command.rb:80:in `log_to_stdout'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/commands/server/server_command.rb:42:in `start'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/commands/server/server_command.rb:135:in `block in perform'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/commands/server/server_command.rb:130:in `tap'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/commands/server/server_command.rb:130:in `perform'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/thor-0.20.0/lib/thor/command.rb:27:in `run'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/thor-0.20.0/lib/thor/invocation.rb:126:in `invoke_command'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/thor-0.20.0/lib/thor.rb:387:in `dispatch'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/command/base.rb:63:in `perform'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/command.rb:44:in `invoke'
from /Users/ryanfrancis/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.1.4/lib/rails/commands.rb:16:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.