utter_events 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +4 -0
  6. data/CODE_OF_CONDUCT.md +12 -0
  7. data/Gemfile +4 -0
  8. data/Guardfile +70 -0
  9. data/README.md +110 -0
  10. data/Rakefile +1 -0
  11. data/bin/console +8 -0
  12. data/bin/setup +8 -0
  13. data/lib/utter.rb +47 -0
  14. data/lib/utter/version.rb +3 -0
  15. data/sample_rails_app/.gitignore +17 -0
  16. data/sample_rails_app/Gemfile +17 -0
  17. data/sample_rails_app/Gemfile.lock +157 -0
  18. data/sample_rails_app/README.rdoc +28 -0
  19. data/sample_rails_app/Rakefile +6 -0
  20. data/sample_rails_app/app/assets/images/.keep +0 -0
  21. data/sample_rails_app/app/assets/javascripts/application.js +15 -0
  22. data/sample_rails_app/app/assets/javascripts/articles.js +2 -0
  23. data/sample_rails_app/app/assets/javascripts/comments.js +2 -0
  24. data/sample_rails_app/app/assets/javascripts/welcome.js +2 -0
  25. data/sample_rails_app/app/assets/stylesheets/application.css +15 -0
  26. data/sample_rails_app/app/assets/stylesheets/articles.scss +3 -0
  27. data/sample_rails_app/app/assets/stylesheets/comments.scss +3 -0
  28. data/sample_rails_app/app/assets/stylesheets/welcome.scss +3 -0
  29. data/sample_rails_app/app/controllers/application_controller.rb +5 -0
  30. data/sample_rails_app/app/controllers/articles_controller.rb +51 -0
  31. data/sample_rails_app/app/controllers/comments_controller.rb +19 -0
  32. data/sample_rails_app/app/controllers/concerns/.keep +0 -0
  33. data/sample_rails_app/app/controllers/welcome_controller.rb +4 -0
  34. data/sample_rails_app/app/helpers/application_helper.rb +2 -0
  35. data/sample_rails_app/app/helpers/articles_helper.rb +2 -0
  36. data/sample_rails_app/app/helpers/comments_helper.rb +2 -0
  37. data/sample_rails_app/app/helpers/welcome_helper.rb +2 -0
  38. data/sample_rails_app/app/mailers/.keep +0 -0
  39. data/sample_rails_app/app/models/.keep +0 -0
  40. data/sample_rails_app/app/models/article.rb +5 -0
  41. data/sample_rails_app/app/models/comment.rb +3 -0
  42. data/sample_rails_app/app/models/concerns/.keep +0 -0
  43. data/sample_rails_app/app/views/articles/_form.html.erb +31 -0
  44. data/sample_rails_app/app/views/articles/edit.html.erb +5 -0
  45. data/sample_rails_app/app/views/articles/index.html.erb +21 -0
  46. data/sample_rails_app/app/views/articles/new.html.erb +5 -0
  47. data/sample_rails_app/app/views/articles/show.html.erb +18 -0
  48. data/sample_rails_app/app/views/comments/_comment.html.erb +15 -0
  49. data/sample_rails_app/app/views/comments/_form.html.erb +13 -0
  50. data/sample_rails_app/app/views/layouts/application.html.erb +14 -0
  51. data/sample_rails_app/app/views/welcome/index.html.erb +2 -0
  52. data/sample_rails_app/bin/bundle +3 -0
  53. data/sample_rails_app/bin/rails +9 -0
  54. data/sample_rails_app/bin/rake +9 -0
  55. data/sample_rails_app/bin/setup +29 -0
  56. data/sample_rails_app/bin/spring +15 -0
  57. data/sample_rails_app/config.ru +4 -0
  58. data/sample_rails_app/config/application.rb +35 -0
  59. data/sample_rails_app/config/boot.rb +3 -0
  60. data/sample_rails_app/config/database.yml +25 -0
  61. data/sample_rails_app/config/environment.rb +5 -0
  62. data/sample_rails_app/config/environments/development.rb +41 -0
  63. data/sample_rails_app/config/environments/production.rb +79 -0
  64. data/sample_rails_app/config/environments/test.rb +42 -0
  65. data/sample_rails_app/config/initializers/assets.rb +11 -0
  66. data/sample_rails_app/config/initializers/backtrace_silencers.rb +7 -0
  67. data/sample_rails_app/config/initializers/cookies_serializer.rb +3 -0
  68. data/sample_rails_app/config/initializers/filter_parameter_logging.rb +4 -0
  69. data/sample_rails_app/config/initializers/inflections.rb +16 -0
  70. data/sample_rails_app/config/initializers/mime_types.rb +4 -0
  71. data/sample_rails_app/config/initializers/session_store.rb +3 -0
  72. data/sample_rails_app/config/initializers/utter.rb +8 -0
  73. data/sample_rails_app/config/initializers/wrap_parameters.rb +14 -0
  74. data/sample_rails_app/config/locales/en.yml +23 -0
  75. data/sample_rails_app/config/routes.rb +7 -0
  76. data/sample_rails_app/config/secrets.yml +22 -0
  77. data/sample_rails_app/db/migrate/20160218085536_create_articles.rb +10 -0
  78. data/sample_rails_app/db/migrate/20160222061605_create_comments.rb +11 -0
  79. data/sample_rails_app/db/schema.rb +33 -0
  80. data/sample_rails_app/db/seeds.rb +7 -0
  81. data/sample_rails_app/lib/assets/.keep +0 -0
  82. data/sample_rails_app/lib/tasks/.keep +0 -0
  83. data/sample_rails_app/log/.keep +0 -0
  84. data/sample_rails_app/public/404.html +67 -0
  85. data/sample_rails_app/public/422.html +67 -0
  86. data/sample_rails_app/public/500.html +66 -0
  87. data/sample_rails_app/public/favicon.ico +0 -0
  88. data/sample_rails_app/public/robots.txt +5 -0
  89. data/sample_rails_app/vendor/assets/javascripts/.keep +0 -0
  90. data/sample_rails_app/vendor/assets/stylesheets/.keep +0 -0
  91. data/utter.gemspec +31 -0
  92. metadata +221 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a7f9364791c5599be45a3537b0ec6fdcb4070628
4
+ data.tar.gz: 8acd1e350b764ca069915b659fa4f23d3b371f7a
5
+ SHA512:
6
+ metadata.gz: dc4044d8813310cf6653e1d39702c8260f37b1c502f50624990f8c15a3070c5a8593cd9796aa33a17382e0e8a0f00b2b5319b6b13760c11648de333295a6c4b0
7
+ data.tar.gz: 0617c8f3578bf306b4c0e9929edea1371095f99fc2d3b20e6e89b6bf920381f9a10b1d246f6a94d4f9831f31b5b3215aabd77eb33aa4c7fea2f8600480cdc8c4
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1 @@
1
+ 2.0
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.4
4
+ before_install: gem install bundler -v 1.11.2
@@ -0,0 +1,12 @@
1
+ # Contributor Code of Conduct
2
+
3
+ This document provides community guidelines for a safe, respectful, productive, and collaborative place for any person who is willing to contribute to the Ruby community. It applies to all “collaborative space”, which is defined as community communications channels (such as mailing lists, submitted patches, commit comments, etc.).
4
+
5
+ * Participants will be tolerant of opposing views.
6
+ * Participants must ensure that their language and actions are free of personal attacks and disparaging personal remarks.
7
+ * When interpreting the words and actions of others, participants should always assume good intentions.
8
+ * Behaviour which can be reasonably considered harassment will not be tolerated.
9
+
10
+ This Code of Conduct is adapted from the [Ruby Community Conduct Guideline][coc].
11
+
12
+ [coc]: https://www.ruby-lang.org/en/conduct/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in utter.gemspec
4
+ gemspec
@@ -0,0 +1,70 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ ## Uncomment and set this to only include directories you want to watch
5
+ # directories %w(app lib config test spec features) \
6
+ # .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
7
+
8
+ ## Note: if you are using the `directories` clause above and you are not
9
+ ## watching the project directory ('.'), then you will want to move
10
+ ## the Guardfile to a watched dir and symlink it back, e.g.
11
+ #
12
+ # $ mkdir config
13
+ # $ mv Guardfile config/
14
+ # $ ln -s config/Guardfile .
15
+ #
16
+ # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
17
+
18
+ # Note: The cmd option is now required due to the increasing number of ways
19
+ # rspec may be run, below are examples of the most common uses.
20
+ # * bundler: 'bundle exec rspec'
21
+ # * bundler binstubs: 'bin/rspec'
22
+ # * spring: 'bin/rspec' (This will use spring if running and you have
23
+ # installed the spring binstubs per the docs)
24
+ # * zeus: 'zeus rspec' (requires the server to be started separately)
25
+ # * 'just' rspec: 'rspec'
26
+
27
+ guard :rspec, cmd: "bundle exec rspec" do
28
+ require "guard/rspec/dsl"
29
+ dsl = Guard::RSpec::Dsl.new(self)
30
+
31
+ # Feel free to open issues for suggestions and improvements
32
+
33
+ # RSpec files
34
+ rspec = dsl.rspec
35
+ watch(rspec.spec_helper) { rspec.spec_dir }
36
+ watch(rspec.spec_support) { rspec.spec_dir }
37
+ watch(rspec.spec_files)
38
+
39
+ # Ruby files
40
+ ruby = dsl.ruby
41
+ dsl.watch_spec_files_for(ruby.lib_files)
42
+
43
+ # Rails files
44
+ rails = dsl.rails(view_extensions: %w(erb haml slim))
45
+ dsl.watch_spec_files_for(rails.app_files)
46
+ dsl.watch_spec_files_for(rails.views)
47
+
48
+ watch(rails.controllers) do |m|
49
+ [
50
+ rspec.spec.("routing/#{m[1]}_routing"),
51
+ rspec.spec.("controllers/#{m[1]}_controller"),
52
+ rspec.spec.("acceptance/#{m[1]}")
53
+ ]
54
+ end
55
+
56
+ # Rails config changes
57
+ watch(rails.spec_helper) { rspec.spec_dir }
58
+ watch(rails.routes) { "#{rspec.spec_dir}/routing" }
59
+ watch(rails.app_controller) { "#{rspec.spec_dir}/controllers" }
60
+
61
+ # Capybara features specs
62
+ watch(rails.view_dirs) { |m| rspec.spec.("features/#{m[1]}") }
63
+ watch(rails.layouts) { |m| rspec.spec.("features/#{m[1]}") }
64
+
65
+ # Turnip features and steps
66
+ watch(%r{^spec/acceptance/(.+)\.feature$})
67
+ watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) do |m|
68
+ Dir[File.join("**/#{m[1]}.feature")][0] || "spec/acceptance"
69
+ end
70
+ end
@@ -0,0 +1,110 @@
1
+ # Utter
2
+
3
+ ## Installation
4
+
5
+ Add this line to your application's Gemfile:
6
+
7
+ ```ruby
8
+ gem 'utter'
9
+ ```
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install utter
18
+
19
+ ## Usage
20
+
21
+ ### Sending Events
22
+
23
+ ```ruby
24
+ require "utter"
25
+
26
+ # mixin instance methods
27
+ class UserRegistration
28
+ include Utter
29
+
30
+ def register_user(user)
31
+ # code goes here
32
+ # ...
33
+
34
+ utter(:user_registered, payload: {
35
+ username: user.name,
36
+ registration_date: user.created_at
37
+ })
38
+ end
39
+ end
40
+
41
+ # mixin class methods
42
+ class Configuration
43
+ extend Utter
44
+
45
+ def self.user_account_endpoint(subdomain)
46
+ # code goes here
47
+ #...
48
+
49
+ utter(:user_account_endpoint_called, payload: {
50
+ subdomain: subdomain
51
+ })
52
+ end
53
+ end
54
+ ```
55
+
56
+ If you'd like to have access to both instance methods and class methods, you can both `include` and `extend` `Utter` like this:
57
+
58
+ ```ruby
59
+ class IncludeAndExtend
60
+ include Utter
61
+ extend Utter
62
+
63
+ # now you can use `#utter` in both instance methods and class methods
64
+ end
65
+ ```
66
+
67
+ Take note however that doing both an `include` and an `extend` may be a sign that your class is doing too much, and may benefit from a refactoring and separation of concerns.
68
+
69
+ ### Consuming Events
70
+
71
+ `Utter` has a default Global Events Table where it stores events emitted by the calling objects. This events table also mixes in the `Observable` module from the Ruby Standard Library so you can do something like:
72
+
73
+ ```ruby
74
+ class Watcher
75
+ def update(object_id, event, payload)
76
+ # the events table will call `#update` whenever there's an event that is emitted
77
+ # ...
78
+ send_to_amazon_kinesis(event, payload.merge(meta: {object_id: object_id, sent_at: Time.now}))
79
+ end
80
+ end
81
+
82
+ Utter::GLOBAL_EVENTS_TABLE.add_observer(watcher)
83
+ ```
84
+
85
+ If you don't want to observe the events table, there's also an experimental syntax that's inspired by https://github.com/shokai/event_emitter and NodeJS.
86
+
87
+ ```ruby
88
+ user_registration = UserRegistration.new # see above for the class definition
89
+
90
+ # ... call the method that emits an event
91
+ user_registration.register_user(user)
92
+
93
+ # ... somewhere else
94
+ user.on :user_registered do |payload|
95
+ puts "#{data[:username]} was registered on #{data[:registration_date]}"
96
+ end
97
+ ```
98
+
99
+ Note that this doesn't work on events that are called from class methods; you will need to observe the Global Events Table object in those cases.
100
+
101
+ ## Development
102
+
103
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
104
+
105
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
106
+
107
+ ## Contributing
108
+
109
+ Bug reports and pull requests are welcome on GitHub at https://github.com/parasquid/utter. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](https://github.com/parasquid/utter/blob/master/CODE_OF_CONDUCT.md) code of conduct.
110
+
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "utter"
5
+
6
+ ARGV.clear
7
+ require "pry"
8
+ Pry.start
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,47 @@
1
+ require "utter/version"
2
+ require "observer"
3
+
4
+ module Utter
5
+ class EventsTable
6
+ extend Forwardable
7
+ def_delegators :@backing_hash, :[]
8
+
9
+ include Observable
10
+
11
+ def initialize
12
+ @backing_hash = Hash.new { |hash, key|
13
+ hash[key] = Hash.new { |h, k|
14
+ h[k] = []
15
+ }
16
+ }
17
+ end
18
+
19
+ def process_event(object_id, event, payload)
20
+ @backing_hash[object_id][event].compact!
21
+ @backing_hash[object_id][event].each do |block|
22
+ block.call(payload)
23
+ end
24
+ changed
25
+ notify_observers(object_id, event, payload)
26
+ end
27
+ end
28
+ private_constant :EventsTable
29
+
30
+ GLOBAL_EVENTS_TABLE = EventsTable.new
31
+
32
+ def utter(event, payload=nil)
33
+ events.process_event(self.object_id, event.to_sym, payload)
34
+ end
35
+
36
+ def on(event, &block)
37
+ events[self.object_id][event.to_sym].push block
38
+ end
39
+
40
+ private
41
+
42
+ def events
43
+ GLOBAL_EVENTS_TABLE
44
+ end
45
+
46
+
47
+ end
@@ -0,0 +1,3 @@
1
+ module Utter
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,17 @@
1
+ # See https://help.github.com/articles/ignoring-files for more about ignoring files.
2
+ #
3
+ # If you find yourself ignoring temporary files generated by your text editor
4
+ # or operating system, you probably want to add a global ignore instead:
5
+ # git config --global core.excludesfile '~/.gitignore_global'
6
+
7
+ # Ignore bundler config.
8
+ /.bundle
9
+
10
+ # Ignore the default SQLite database.
11
+ /db/*.sqlite3
12
+ /db/*.sqlite3-journal
13
+
14
+ # Ignore all logfiles and tempfiles.
15
+ /log/*
16
+ !/log/.keep
17
+ /tmp
@@ -0,0 +1,17 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '4.2.5.1'
4
+ gem 'sqlite3'
5
+ gem 'sass-rails', '~> 5.0'
6
+ gem 'uglifier', '>= 1.3.0'
7
+ gem 'jquery-rails'
8
+ gem 'jbuilder', '~> 2.0'
9
+ gem 'sdoc', '~> 0.4.0', group: :doc
10
+
11
+ group :development, :test do
12
+ gem 'byebug'
13
+ gem 'web-console', '~> 2.0'
14
+ gem "quiet_assets"
15
+ end
16
+
17
+ gem "utter", path: "../"
@@ -0,0 +1,157 @@
1
+ PATH
2
+ remote: ../
3
+ specs:
4
+ utter (0.1.0)
5
+ gem_config (= 0.3.1)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ actionmailer (4.2.5.1)
11
+ actionpack (= 4.2.5.1)
12
+ actionview (= 4.2.5.1)
13
+ activejob (= 4.2.5.1)
14
+ mail (~> 2.5, >= 2.5.4)
15
+ rails-dom-testing (~> 1.0, >= 1.0.5)
16
+ actionpack (4.2.5.1)
17
+ actionview (= 4.2.5.1)
18
+ activesupport (= 4.2.5.1)
19
+ rack (~> 1.6)
20
+ rack-test (~> 0.6.2)
21
+ rails-dom-testing (~> 1.0, >= 1.0.5)
22
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
23
+ actionview (4.2.5.1)
24
+ activesupport (= 4.2.5.1)
25
+ builder (~> 3.1)
26
+ erubis (~> 2.7.0)
27
+ rails-dom-testing (~> 1.0, >= 1.0.5)
28
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
29
+ activejob (4.2.5.1)
30
+ activesupport (= 4.2.5.1)
31
+ globalid (>= 0.3.0)
32
+ activemodel (4.2.5.1)
33
+ activesupport (= 4.2.5.1)
34
+ builder (~> 3.1)
35
+ activerecord (4.2.5.1)
36
+ activemodel (= 4.2.5.1)
37
+ activesupport (= 4.2.5.1)
38
+ arel (~> 6.0)
39
+ activesupport (4.2.5.1)
40
+ i18n (~> 0.7)
41
+ json (~> 1.7, >= 1.7.7)
42
+ minitest (~> 5.1)
43
+ thread_safe (~> 0.3, >= 0.3.4)
44
+ tzinfo (~> 1.1)
45
+ arel (6.0.3)
46
+ binding_of_caller (0.7.2)
47
+ debug_inspector (>= 0.0.1)
48
+ builder (3.2.2)
49
+ byebug (8.2.2)
50
+ concurrent-ruby (1.0.0)
51
+ debug_inspector (0.0.2)
52
+ erubis (2.7.0)
53
+ execjs (2.6.0)
54
+ gem_config (0.3.1)
55
+ globalid (0.3.6)
56
+ activesupport (>= 4.1.0)
57
+ i18n (0.7.0)
58
+ jbuilder (2.4.1)
59
+ activesupport (>= 3.0.0, < 5.1)
60
+ multi_json (~> 1.2)
61
+ jquery-rails (4.1.0)
62
+ rails-dom-testing (~> 1.0)
63
+ railties (>= 4.2.0)
64
+ thor (>= 0.14, < 2.0)
65
+ json (1.8.3)
66
+ loofah (2.0.3)
67
+ nokogiri (>= 1.5.9)
68
+ mail (2.6.3)
69
+ mime-types (>= 1.16, < 3)
70
+ mime-types (2.99)
71
+ mini_portile2 (2.0.0)
72
+ minitest (5.8.4)
73
+ multi_json (1.11.2)
74
+ nokogiri (1.6.7.2)
75
+ mini_portile2 (~> 2.0.0.rc2)
76
+ quiet_assets (1.1.0)
77
+ railties (>= 3.1, < 5.0)
78
+ rack (1.6.4)
79
+ rack-test (0.6.3)
80
+ rack (>= 1.0)
81
+ rails (4.2.5.1)
82
+ actionmailer (= 4.2.5.1)
83
+ actionpack (= 4.2.5.1)
84
+ actionview (= 4.2.5.1)
85
+ activejob (= 4.2.5.1)
86
+ activemodel (= 4.2.5.1)
87
+ activerecord (= 4.2.5.1)
88
+ activesupport (= 4.2.5.1)
89
+ bundler (>= 1.3.0, < 2.0)
90
+ railties (= 4.2.5.1)
91
+ sprockets-rails
92
+ rails-deprecated_sanitizer (1.0.3)
93
+ activesupport (>= 4.2.0.alpha)
94
+ rails-dom-testing (1.0.7)
95
+ activesupport (>= 4.2.0.beta, < 5.0)
96
+ nokogiri (~> 1.6.0)
97
+ rails-deprecated_sanitizer (>= 1.0.1)
98
+ rails-html-sanitizer (1.0.3)
99
+ loofah (~> 2.0)
100
+ railties (4.2.5.1)
101
+ actionpack (= 4.2.5.1)
102
+ activesupport (= 4.2.5.1)
103
+ rake (>= 0.8.7)
104
+ thor (>= 0.18.1, < 2.0)
105
+ rake (10.5.0)
106
+ rdoc (4.2.2)
107
+ json (~> 1.4)
108
+ sass (3.4.21)
109
+ sass-rails (5.0.4)
110
+ railties (>= 4.0.0, < 5.0)
111
+ sass (~> 3.1)
112
+ sprockets (>= 2.8, < 4.0)
113
+ sprockets-rails (>= 2.0, < 4.0)
114
+ tilt (>= 1.1, < 3)
115
+ sdoc (0.4.1)
116
+ json (~> 1.7, >= 1.7.7)
117
+ rdoc (~> 4.0)
118
+ sprockets (3.5.2)
119
+ concurrent-ruby (~> 1.0)
120
+ rack (> 1, < 3)
121
+ sprockets-rails (3.0.1)
122
+ actionpack (>= 4.0)
123
+ activesupport (>= 4.0)
124
+ sprockets (>= 3.0.0)
125
+ sqlite3 (1.3.11)
126
+ thor (0.19.1)
127
+ thread_safe (0.3.5)
128
+ tilt (2.0.2)
129
+ tzinfo (1.2.2)
130
+ thread_safe (~> 0.1)
131
+ uglifier (2.7.2)
132
+ execjs (>= 0.3.0)
133
+ json (>= 1.8.0)
134
+ web-console (2.3.0)
135
+ activemodel (>= 4.0)
136
+ binding_of_caller (>= 0.7.2)
137
+ railties (>= 4.0)
138
+ sprockets-rails (>= 2.0, < 4.0)
139
+
140
+ PLATFORMS
141
+ ruby
142
+
143
+ DEPENDENCIES
144
+ byebug
145
+ jbuilder (~> 2.0)
146
+ jquery-rails
147
+ quiet_assets
148
+ rails (= 4.2.5.1)
149
+ sass-rails (~> 5.0)
150
+ sdoc (~> 0.4.0)
151
+ sqlite3
152
+ uglifier (>= 1.3.0)
153
+ utter!
154
+ web-console (~> 2.0)
155
+
156
+ BUNDLED WITH
157
+ 1.11.2