GithubHelp home page GithubHelp logo

launchpadlab / token-master Goto Github PK

View Code? Open in Web Editor NEW
17.0 18.0 1.0 178 KB

Minimal and Simple user management for Ruby and Rails applications.

License: MIT License

Ruby 95.46% HTML 1.71% JavaScript 1.75% CSS 1.07%
ruby rails token user-management devise launchpad-lab confirm invite

token-master's Issues

Update Ruby Version

Project is currently on Ruby V 2.3.0, which reached its end of life in 2019.

Ruby >=3 handles positional args vs keyword args differently, users may run into an error with the comments in the config

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

Implement more specific error classes

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
    ...

Refactor out dependence on ActiveRecord

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.

Add ability to 'force complete'

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.

Token master doesn't play nice with Active Admin

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!

Document TokenMaster::Config

  • [] Class
  • [] add_tokenable_options
  • [] get_required_params
  • [] get_token_lifetime
  • [] get_token_length
  • [] options_set?

Add ability to resend instructions

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:

  1. Extend the existing token: set x_created_at to Time.now
  2. Reset the token: generate a new one and update x_created_at, etc.

Perhaps we actually implement the following two methods:

extend_x_token!
send_new_x_token!

Thoughts @inveterateliterate?

Document Error Classes

lib/token_master/error.rb

  • [] NotConfigured
  • [] MissingRequiredParams
  • [] TokenNotFound
  • [] TokenCompleted
  • [] TokenNotCompleted
  • [] TokenExpired
  • [] TokenSent
  • [] TokenNotSent

Update README

Update README to reflect different uses cases of the gem, and code examples.

force_confirm! is undefined on User

screen shot 2018-03-16 at 11 29 34 am

Other methods, like set_confirm_token! work fine:

screen shot 2018-03-16 at 11 30 18 am

User model:

class User < ApplicationRecord
  include TokenMaster::Core
  has_secure_password
  token_master :confirm, :reset_password, :invite
...

Circular dependency issue with ApplicationRecord

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>'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.