├── .gitignore ├── .rspec ├── .travis.yml ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── Rakefile ├── app ├── assets │ ├── images │ │ ├── .keep │ │ ├── chris_head.png │ │ ├── colorful-robots-sm.jpg │ │ ├── colorful-robots.jpg │ │ ├── creators_bg.png │ │ ├── hash_lg.png │ │ ├── hashrobot.png │ │ ├── hashrobot_sm.png │ │ ├── hashrobot_xs.png │ │ ├── jeff_head.png │ │ ├── robot_chris.png │ │ ├── robot_jeff.png │ │ ├── robot_new_black.png │ │ ├── robot_ryan.png │ │ ├── robot_white.png │ │ ├── ryan_head.png │ │ ├── sky.png │ │ └── sky2.jpeg │ ├── javascripts │ │ ├── application.js │ │ ├── categories.coffee │ │ ├── static.coffee │ │ ├── tweets.coffee │ │ └── users.coffee │ └── stylesheets │ │ ├── animate.css │ │ ├── application.scss │ │ ├── categories.scss │ │ ├── pages.scss │ │ ├── tweets.scss │ │ ├── users.scss │ │ └── welcome.scss ├── controllers │ ├── api │ │ └── categories_controller.rb │ ├── application_controller.rb │ ├── concerns │ │ └── .keep │ ├── labels_controller.rb │ ├── pages_controller.rb │ ├── sessions_controller.rb │ ├── tweets_controller.rb │ └── users_controller.rb ├── helpers │ ├── application_helper.rb │ ├── categories_helper.rb │ ├── static_helper.rb │ ├── tweets_helper.rb │ └── users_helper.rb ├── mailers │ └── .keep ├── models │ ├── .keep │ ├── category.rb │ ├── category_tag.rb │ ├── concerns │ │ └── .keep │ ├── label.rb │ ├── tag.rb │ ├── tweet.rb │ └── user.rb └── views │ ├── categories │ └── index.html.erb │ ├── labels │ ├── index.html.erb │ ├── new.html.erb │ └── show.html.erb │ ├── layouts │ └── application.html.erb │ ├── pages │ ├── about.html.erb │ ├── dashboard.html.erb │ ├── hashboard.html.erb │ └── index.html.erb │ ├── shared │ ├── _footer.html.erb │ └── _nav.html.erb │ ├── tweets │ ├── index.html.erb │ └── new.html.erb │ └── users │ ├── index.html.erb │ └── show.html.erb ├── bin ├── bundle ├── rails ├── rake ├── setup └── spring ├── config.ru ├── config ├── application.rb ├── boot.rb ├── database.yml ├── environment.rb ├── environments │ ├── development.rb │ ├── production.rb │ └── test.rb ├── initializers │ ├── assets.rb │ ├── backtrace_silencers.rb │ ├── cookies_serializer.rb │ ├── filter_parameter_logging.rb │ ├── inflections.rb │ ├── mime_types.rb │ ├── omniauth.rb │ ├── session_store.rb │ ├── twitter_credentials.rb │ └── wrap_parameters.rb ├── locales │ └── en.yml ├── routes.rb └── secrets.yml ├── coverage ├── .last_run.json ├── .resultset.json ├── .resultset.json.lock ├── assets │ └── 0.10.0 │ │ ├── application.css │ │ ├── application.js │ │ ├── colorbox │ │ ├── border.png │ │ ├── controls.png │ │ ├── loading.gif │ │ └── loading_background.png │ │ ├── favicon_green.png │ │ ├── favicon_red.png │ │ ├── favicon_yellow.png │ │ ├── loading.gif │ │ ├── magnify.png │ │ └── smoothness │ │ └── images │ │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ │ ├── ui-bg_flat_75_ffffff_40x100.png │ │ ├── ui-bg_glass_55_fbf9ee_1x400.png │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ ├── ui-bg_glass_75_dadada_1x400.png │ │ ├── ui-bg_glass_75_e6e6e6_1x400.png │ │ ├── ui-bg_glass_95_fef1ec_1x400.png │ │ ├── ui-bg_highlight-soft_75_cccccc_1x100.png │ │ ├── ui-icons_222222_256x240.png │ │ ├── ui-icons_2e83ff_256x240.png │ │ ├── ui-icons_454545_256x240.png │ │ ├── ui-icons_888888_256x240.png │ │ └── ui-icons_cd0a0a_256x240.png └── index.html ├── db ├── migrate │ ├── 20150612061607_create_users.rb │ ├── 20150617190952_create_tweets.rb │ ├── 20150619013447_create_categories.rb │ ├── 20150619184808_create_tags.rb │ ├── 20150623012139_create_category_tags.rb │ ├── 20150623012403_add_category_id_to_tags.rb │ ├── 20150623012552_add_names_to_category_and_tags.rb │ ├── 20150623050908_create_labels.rb │ └── 20150626173834_add_rank_to_tags.rb ├── schema.rb └── seeds.rb ├── lib ├── assets │ └── .keep └── tasks │ ├── .keep │ └── dowload.tweets.rake ├── log └── .keep ├── public ├── 404.html ├── 422.html ├── 500.html ├── assets │ ├── .sprockets-manifest-18b901353a0fb0ddce332dfbe306440e.json │ ├── application-027b8f03445ec56e5a6edc494b1ce449ad1d8daf6db9fff3fa4d3ec468e5ab0b.js │ ├── application-03d0a9d16dc79623cd2901fee1177a8257c38da7bd2d2bdc3df4aa90d3834eee.js │ ├── application-045fef1ae73e1c57d9374dcc597d268c8241aecf4061de74a8c0c539e63197c4.css │ ├── application-071c4870f658a28a6881146d09fd6087dc27d319bc13008833740e090a809c97.css │ ├── application-0e6995ef3f34338ef0e39511a42f5e957d1e83ee637dea342f1d18cca575ba95.js │ ├── application-1052529f2d6c6c37effb5c439ec72a205b8b868404fd9af5d0e6fd6dedfdd4bd.js │ ├── application-144fe3cf15a1a24581bd897c2ff17c745a537dda46d0c4d91f57b8760ec6e6c3.js │ ├── application-1c0c25f5f2d0a29bc9968efcff94056ff2f60634a407bcf3619744c8d91f5e95.js │ ├── application-205c6b9bab11045ad6157d9ef3ba2dcb95b78de56c660c494efe3bd949b8f64f.css │ ├── application-4708c2f4443cf620b44d2bddd22fba33a5a6518c7dac2867b000b5b1d17f20ae.js │ ├── application-4de68cf6d7c04e00bb523da622508af6cf21d0c0e6a5e760a00d7d0280eded8b.css │ ├── application-58b76ea32f6ac46edf7cd5e739e8efe31875aa7090d41cfb30084c0cf01856f0.js │ ├── application-5fc6ff42750f2736383f1913ec0008b52b1a439655b297b1a867c6048ac7e1ce.js │ ├── application-7d03837e7684716383341885934e48f9a72b4148c6216065465410b3819842fb.js │ ├── application-83f116e80d41af1386e386a4150a26af7da0bb8c092dfae6bee21744f997ec0d.css │ ├── application-b255007737bd257a0d1e775bf8bcdeb385676a68d86d850cecb09b94307f0b1e.js │ ├── application-d31d805cd206b80b1e5825025f6d605acd80b62267853df63f5c9c427550bc32.css │ ├── application-d57f23fecb2ad0ab85ff442981895f776a7ea7f413c5629e845b62cbe8405523.css │ ├── application-e7ae94611f08ed414603f848d08c1459a82034d23b8862ec90cf93a3c4c0bd09.css │ ├── application-eca1b68929a0189e2d889219956925deb29be8be9ac3926e4e51deb448f73448.js │ ├── application-ecacc6b84ea4d9dc513a4b0b5689b38788d7f519f845df4b2b43d29185adc630.js │ ├── chris_head-8ab4ab384675d5c657b933f169d226b9086490641c265aca7fcb13ffa5bbe85d.png │ ├── colorful-robots-fbd326709c16b50742a5ad6e289712bdd71aa1ac1888a006a954a4137af91860.jpg │ ├── colorful-robots-sm-ddf8bef86fcb7d5501079d413c586397a0e78482f775ed6b1b658f19b0fe5ee1.jpg │ ├── creators_bg-8eb9572f519e8a6d681685f2e0428c6217bcaea9f006b7ac7093fb17f819d3eb.png │ ├── font-awesome │ │ ├── fontawesome-webfont-9e540a087924a6e64790149d735cac022640e4fa6bff6bd65f5e9f41529bf0b3.ttf │ │ ├── fontawesome-webfont-aadc3580d2b64ff5a7e6f1425587db4e8b033efcbf8f5c332ca52a5ed580c87c.woff2 │ │ ├── fontawesome-webfont-bfdef833219a6edffd9c3cbc28db72739d22bb4d20cc2e2f8d56a7a4d408a206.svg │ │ ├── fontawesome-webfont-cbb644d0ee730ea57dd5fbae35ef5ba4a41d57a254a6b1215de5c9ff8a321c2d.eot │ │ └── fontawesome-webfont-e3870de89716b72cb61a4bba0e17c75783b361cdaba35ea96961c3070bd8ca18.woff │ ├── hash_lg-c589634864b6ed7484a1bc648dc23b22d9749755b128634dd1636941c97bc040.png │ ├── hashrobot-0e9b58c6120bcd4fa59e1388eced561309b9ab5488d9f556593bf271d4db970c.png │ ├── hashrobot_sm-ea4ce03feea39c6cffc1e4e5c8d706381381b1696096439f899bbbfa6be7638c.png │ ├── hashrobot_xs-8a69c3eb3ea4ba1a2c306c1bc5c086a00b489678e36ceed8cafe931c8572588f.png │ ├── jeff_head-8fb554e986e455610ded735230de57fc250ecb031e7c15271e8cd13222789e2a.png │ ├── material-design-icons │ │ ├── LICENSE-04051e0a14494a4997cedd4e371ccc9e9262fcd278c9a96129c36b4277c4129d.txt │ │ ├── Material-Design-Icons-4efd86423405eefbcbe28d543fc5db242d747b47f8b201f6d8bfdd091ff3bbdd.woff2 │ │ ├── Material-Design-Icons-5d97606a426dbb32cb0236483d32e8746b928ab979be7b809db9d3113e6e35df.ttf │ │ ├── Material-Design-Icons-7628d8cc2f0994b135a1419faa1db2949764b7b28070c39ef81fffecc5a041bb.eot │ │ ├── Material-Design-Icons-be00e19b662046cb8f2eb6eb86e4689edeefb0c003f6a215df9c22f0e15e16ad.woff │ │ └── Material-Design-Icons-c3e402679b8c6f20c98e6538749608091e6823ca0e18e927dd7e43ae02767746.svg │ ├── robot_chris-1cceedb844f08b2782e14556a5af42791d7bc7fdad776efc881d16d7cfa19465.png │ ├── robot_jeff-6d64d1898aae49600a2f2af830d04befde74961af0def332d2a89bb44ce0d307.png │ ├── robot_new_black-7e516331319100124f552f8f7340e7cead891b161ed086ce9a7cdcae38085779.png │ ├── robot_ryan-25f8772ac61b126fa240b3ce4184174c5fac2c827e185c34b1f7d30096309b6e.png │ ├── robot_white-c15d8fa318251b6646affc53dd8574f936bf8f629e3edeb85edd2c50a139db22.png │ ├── roboto │ │ ├── Roboto-Bold-594d74a49e307be7cc9e1ee5f1023684e6820cf11bcc968bee590391e1ad5a5a.ttf │ │ ├── Roboto-Bold-8b84b2abc336ee61f48a28a697b6ace2333ea5f1868aa15d5aeb2c7beac6d716.woff2 │ │ ├── Roboto-Bold-e7cbaf29c3812b80577cb845b5d359486242338f25620ba65260e265464fe359.woff │ │ ├── Roboto-Light-2cbb012f1d36c09d3f17100ef2cf8213cbd429d9e519dff536c12ed6f07a0d25.woff │ │ ├── Roboto-Light-94a0ac8d73bb60a9cbe27a4fa36669104f6ffa37c8ff2df29313a6c0d3b64a75.woff2 │ │ ├── Roboto-Light-ee4352049603e5960550f55444ad720d8d4ce322c0dcba1afc77de78c430d0d5.ttf │ │ ├── Roboto-Medium-1cd5c4b37938d932110ec043ce1cc766d18cacf7a4e7cffa6a539855d5bdc08d.woff2 │ │ ├── Roboto-Medium-6e2ec5c5f89e4ce302bb93b46cb7cc336236501de17348e284878914c5e0e723.ttf │ │ ├── Roboto-Medium-72841a4c4171b13ab1edf2c8f8046f0958f2ff608ce4e0d568dd5c6319f8a933.woff │ │ ├── Roboto-Regular-2cd6b07b7855716761250290ce3cf447ccc98e793e484294d3fa8ccbb55b016a.woff │ │ ├── Roboto-Regular-b5c9c23bd12593523a46d79dd0aee80e3226bbde4c9ac05fc30a95e2c1510de0.woff2 │ │ ├── Roboto-Regular-bde8a188e37aa936b167aecc5e5a3da40262f6e51fd54c584f2cf2b6b99d96ca.ttf │ │ ├── Roboto-Thin-ae65b047fa4032f18a40480a93d1aae6707a756e7b3bb5f060467cd1f59b1625.woff │ │ ├── Roboto-Thin-db1d464343bf795307bc90da83d65b93c841fb20f38662f92f1e5e2c5a1d2ec5.ttf │ │ └── Roboto-Thin-fbcf22e622baa9226f9f2dcd2ce4975c9babc01a52eaf9397557a97cdebd7e40.woff2 │ ├── ryan_head-e072d72d37b50f2074078d9fcbe341b37d20156a08a9580d17f61c902299768a.png │ ├── sky-07e0ed834c8b26fe0a46590cf637d2398d96de4b78f25a152b5bbb9a67344c8d.png │ └── sky2-297bc89e9faf9e485174032a56874d613613c3d6e5d99c9c23b6170d61456b94.jpg ├── favicon.ico └── robots.txt ├── spec ├── controllers │ ├── labels_controller_spec.rb │ ├── pages_controller_spec.rb │ ├── tweets_controller_spec.rb │ └── users_controller_spec.rb ├── factories │ ├── labels.rb │ ├── tweets.rb │ └── users.rb ├── models │ ├── category_spec.rb │ ├── category_tag_spec.rb │ ├── label_spec.rb │ ├── tag_spec.rb │ ├── tweet_spec.rb │ └── user_spec.rb ├── rails_helper.rb ├── spec_helper.rb └── views │ └── errors │ ├── file_not_found.html.erb_spec.rb │ ├── internal_server_error.html.erb_spec.rb │ └── unprocessable.html.erb_spec.rb └── vendor └── assets ├── javascripts └── .keep └── stylesheets └── .keep /.gitignore: -------------------------------------------------------------------------------- 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 all logfiles and tempfiles. 11 | /log/* 12 | !/log/.keep 13 | /tmp 14 | 15 | # Ignore application configuration 16 | /config/application.yml 17 | /config/secrets.yml 18 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --color 2 | --require spec_helper 3 | --format documentation -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | rvm: 3 | - 2.0.0-p481 4 | branches: 5 | only: 6 | - master 7 | install: 8 | - travis_retry bundle install 9 | before_script: 10 | - psql -c 'create database hashrobot_test;' -U postgres 11 | deploy: 12 | provider: heroku 13 | api_key: 14 | secure: oj1mB262ozQopwNNrm9LJkSa4Mo5K5h1xHMmBI/QE8yLKKLqGgiIvcuextC8IDRLJczD1NKTQEV8c7hA1XkbMEqlokMg07IC+vipdckiu1hnmX06npjI8g8XR4oO1BPgG2leTIF9kWnBbB/RYObD/SGw60y+CMEe+S7wzxq4bbkhlHTfW9GSAGvoLVCHwp+oZjQ0GyHpZbfoM2zysYGOW9I/2zLzkLZfD9P1W8o8RajGiVrWmUwHWygxNQ9ykqE+W0kgJZ52PF2p4Rez76baFnpNAtxPC5IQt1my+DJnPG03UOxCXMVlctb9ep/BpgcxmKeHQbM0csvHPNQaE9OPvQ48w0eXZZ2zTogLmMY8Vowy26ZH3gsTomgDR2/sKPhVZ3dja5pHZ6kQwGZiODN3KukVYI9kRJEVvrtTNwv7zq8TC4tBMa9kntfiD7REGTE3DH9ed9phAWCmzuUHOSWiE2qdOrqYm6nu+08qGU7U8AZtZn8lyJEoBjfSOIlq9waS97IXA5Rf+Oms4y8PtnsSHdEW08Hh55wg0zJd185XUPcNADLb4OEQbyQFJeqUBWenXZmYRXptu7pEweHRzQN3v8iJw0Sa+vtYNc9kVTebx+H+ku9wiY9lm34ep1yL6S3g5I8IVBFH649C8l5tiXSsPHWKWTkqL6/vD/PzhTNXirY= 15 | app: fathomless-meadow-9258 16 | run: 17 | - "rake db:migrate" 18 | - restart -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' 4 | gem 'rails', '4.2.1' 5 | # Use postgresql as the database for Active Record 6 | gem 'pg' 7 | # Use SCSS for stylesheets 8 | gem 'sass-rails', '~> 5.0' 9 | #materialize css 10 | gem 'materialize-sass' 11 | # Use Uglifier as compressor for JavaScript assets 12 | gem 'uglifier', '>= 1.3.0' 13 | # Use CoffeeScript for .coffee assets and views 14 | gem 'coffee-rails', '~> 4.1.0' 15 | # See https://github.com/rails/execjs#readme for more supported runtimes 16 | # gem 'therubyracer', platforms: :ruby 17 | 18 | #hide our API keys 19 | gem 'figaro' 20 | #access twitter API 21 | gem 'twitter' 22 | #save tweets to database 23 | gem 'grackle' 24 | # Use jquery as the JavaScript library 25 | gem 'jquery-rails' 26 | # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks 27 | # gem 'turbolinks' 28 | # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder 29 | gem 'jbuilder', '~> 2.0' 30 | # bundle exec rake doc:rails generates the API under doc/api. 31 | gem 'sdoc', '~> 0.4.0', group: :doc 32 | #for heroku deployment 33 | gem 'rails_12factor', group: :production 34 | #oauth via twitter 35 | gem 'omniauth-twitter' 36 | #font awesome 37 | gem 'font-awesome-sass' 38 | #convert JSON to hash 39 | gem 'mash' 40 | # Use ActiveModel has_secure_password 41 | # gem 'bcrypt', '~> 3.1.7' 42 | 43 | # Use Unicorn as the app server 44 | # gem 'unicorn' 45 | 46 | # Use Capistrano for deployment 47 | # gem 'capistrano-rails', group: :development 48 | 49 | group :development, :test do 50 | # Call 'byebug' anywhere in the code to stop execution and get a debugger console 51 | gem 'byebug' 52 | 53 | # Access an IRB console on exception pages or by using <%= console %> in views 54 | gem 'web-console', '~> 2.0' 55 | 56 | # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring 57 | gem 'spring' 58 | 59 | # testing 60 | gem 'rspec-rails', '~> 3.0.0' 61 | 62 | # model testing 63 | gem 'shoulda-matchers', require: false 64 | 65 | # integration testing 66 | gem 'capybara' 67 | 68 | gem 'factory_girl_rails' 69 | 70 | gem 'simplecov', :require => false 71 | end 72 | 73 | group :development do 74 | gem 'annotate' 75 | gem 'better_errors' 76 | gem 'binding_of_caller' 77 | end 78 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | actionmailer (4.2.1) 5 | actionpack (= 4.2.1) 6 | actionview (= 4.2.1) 7 | activejob (= 4.2.1) 8 | mail (~> 2.5, >= 2.5.4) 9 | rails-dom-testing (~> 1.0, >= 1.0.5) 10 | actionpack (4.2.1) 11 | actionview (= 4.2.1) 12 | activesupport (= 4.2.1) 13 | rack (~> 1.6) 14 | rack-test (~> 0.6.2) 15 | rails-dom-testing (~> 1.0, >= 1.0.5) 16 | rails-html-sanitizer (~> 1.0, >= 1.0.1) 17 | actionview (4.2.1) 18 | activesupport (= 4.2.1) 19 | builder (~> 3.1) 20 | erubis (~> 2.7.0) 21 | rails-dom-testing (~> 1.0, >= 1.0.5) 22 | rails-html-sanitizer (~> 1.0, >= 1.0.1) 23 | activejob (4.2.1) 24 | activesupport (= 4.2.1) 25 | globalid (>= 0.3.0) 26 | activemodel (4.2.1) 27 | activesupport (= 4.2.1) 28 | builder (~> 3.1) 29 | activerecord (4.2.1) 30 | activemodel (= 4.2.1) 31 | activesupport (= 4.2.1) 32 | arel (~> 6.0) 33 | activesupport (4.2.1) 34 | i18n (~> 0.7) 35 | json (~> 1.7, >= 1.7.7) 36 | minitest (~> 5.1) 37 | thread_safe (~> 0.3, >= 0.3.4) 38 | tzinfo (~> 1.1) 39 | addressable (2.3.8) 40 | annotate (2.6.10) 41 | activerecord (>= 3.2, <= 4.3) 42 | rake (~> 10.4) 43 | arel (6.0.0) 44 | better_errors (2.1.1) 45 | coderay (>= 1.0.0) 46 | erubis (>= 2.6.6) 47 | rack (>= 0.9.0) 48 | binding_of_caller (0.7.2) 49 | debug_inspector (>= 0.0.1) 50 | buftok (0.2.0) 51 | builder (3.2.2) 52 | byebug (5.0.0) 53 | columnize (= 0.9.0) 54 | capybara (2.4.4) 55 | mime-types (>= 1.16) 56 | nokogiri (>= 1.3.3) 57 | rack (>= 1.0.0) 58 | rack-test (>= 0.5.4) 59 | xpath (~> 2.0) 60 | coderay (1.1.0) 61 | coffee-rails (4.1.0) 62 | coffee-script (>= 2.2.0) 63 | railties (>= 4.0.0, < 5.0) 64 | coffee-script (2.4.1) 65 | coffee-script-source 66 | execjs 67 | coffee-script-source (1.9.1.1) 68 | columnize (0.9.0) 69 | debug_inspector (0.0.2) 70 | diff-lcs (1.2.5) 71 | docile (1.1.5) 72 | equalizer (0.0.11) 73 | erubis (2.7.0) 74 | execjs (2.5.2) 75 | factory_girl (4.5.0) 76 | activesupport (>= 3.0.0) 77 | factory_girl_rails (4.5.0) 78 | factory_girl (~> 4.5.0) 79 | railties (>= 3.0.0) 80 | faraday (0.9.1) 81 | multipart-post (>= 1.2, < 3) 82 | figaro (1.1.1) 83 | thor (~> 0.14) 84 | font-awesome-sass (4.3.2.1) 85 | sass (~> 3.2) 86 | globalid (0.3.5) 87 | activesupport (>= 4.1.0) 88 | grackle (0.3.0) 89 | json 90 | mime-types 91 | oauth 92 | hashie (3.4.2) 93 | http (0.6.4) 94 | http_parser.rb (~> 0.6.0) 95 | http_parser.rb (0.6.0) 96 | i18n (0.7.0) 97 | jbuilder (2.2.16) 98 | activesupport (>= 3.0.0, < 5) 99 | multi_json (~> 1.2) 100 | jquery-rails (4.0.3) 101 | rails-dom-testing (~> 1.0) 102 | railties (>= 4.2.0) 103 | thor (>= 0.14, < 2.0) 104 | json (1.8.3) 105 | loofah (2.0.2) 106 | nokogiri (>= 1.5.9) 107 | mail (2.6.3) 108 | mime-types (>= 1.16, < 3) 109 | mash (0.1.1) 110 | materialize-sass (0.96.2) 111 | sass (~> 3.3) 112 | memoizable (0.4.2) 113 | thread_safe (~> 0.3, >= 0.3.1) 114 | mime-types (2.6.1) 115 | mini_portile (0.6.2) 116 | minitest (5.7.0) 117 | multi_json (1.11.0) 118 | multipart-post (2.0.0) 119 | naught (1.0.0) 120 | nokogiri (1.6.6.2) 121 | mini_portile (~> 0.6.0) 122 | oauth (0.4.7) 123 | omniauth (1.2.2) 124 | hashie (>= 1.2, < 4) 125 | rack (~> 1.0) 126 | omniauth-oauth (1.1.0) 127 | oauth 128 | omniauth (~> 1.0) 129 | omniauth-twitter (1.2.0) 130 | json (~> 1.3) 131 | omniauth-oauth (~> 1.1) 132 | pg (0.18.2) 133 | rack (1.6.1) 134 | rack-test (0.6.3) 135 | rack (>= 1.0) 136 | rails (4.2.1) 137 | actionmailer (= 4.2.1) 138 | actionpack (= 4.2.1) 139 | actionview (= 4.2.1) 140 | activejob (= 4.2.1) 141 | activemodel (= 4.2.1) 142 | activerecord (= 4.2.1) 143 | activesupport (= 4.2.1) 144 | bundler (>= 1.3.0, < 2.0) 145 | railties (= 4.2.1) 146 | sprockets-rails 147 | rails-deprecated_sanitizer (1.0.3) 148 | activesupport (>= 4.2.0.alpha) 149 | rails-dom-testing (1.0.6) 150 | activesupport (>= 4.2.0.beta, < 5.0) 151 | nokogiri (~> 1.6.0) 152 | rails-deprecated_sanitizer (>= 1.0.1) 153 | rails-html-sanitizer (1.0.2) 154 | loofah (~> 2.0) 155 | rails_12factor (0.0.3) 156 | rails_serve_static_assets 157 | rails_stdout_logging 158 | rails_serve_static_assets (0.0.4) 159 | rails_stdout_logging (0.0.3) 160 | railties (4.2.1) 161 | actionpack (= 4.2.1) 162 | activesupport (= 4.2.1) 163 | rake (>= 0.8.7) 164 | thor (>= 0.18.1, < 2.0) 165 | rake (10.4.2) 166 | rdoc (4.2.0) 167 | rspec-core (3.0.4) 168 | rspec-support (~> 3.0.0) 169 | rspec-expectations (3.0.4) 170 | diff-lcs (>= 1.2.0, < 2.0) 171 | rspec-support (~> 3.0.0) 172 | rspec-mocks (3.0.4) 173 | rspec-support (~> 3.0.0) 174 | rspec-rails (3.0.2) 175 | actionpack (>= 3.0) 176 | activesupport (>= 3.0) 177 | railties (>= 3.0) 178 | rspec-core (~> 3.0.0) 179 | rspec-expectations (~> 3.0.0) 180 | rspec-mocks (~> 3.0.0) 181 | rspec-support (~> 3.0.0) 182 | rspec-support (3.0.4) 183 | sass (3.4.14) 184 | sass-rails (5.0.3) 185 | railties (>= 4.0.0, < 5.0) 186 | sass (~> 3.1) 187 | sprockets (>= 2.8, < 4.0) 188 | sprockets-rails (>= 2.0, < 4.0) 189 | tilt (~> 1.1) 190 | sdoc (0.4.1) 191 | json (~> 1.7, >= 1.7.7) 192 | rdoc (~> 4.0) 193 | shoulda-matchers (2.8.0) 194 | activesupport (>= 3.0.0) 195 | simple_oauth (0.3.1) 196 | simplecov (0.10.0) 197 | docile (~> 1.1.0) 198 | json (~> 1.8) 199 | simplecov-html (~> 0.10.0) 200 | simplecov-html (0.10.0) 201 | spring (1.3.6) 202 | sprockets (3.2.0) 203 | rack (~> 1.0) 204 | sprockets-rails (2.3.1) 205 | actionpack (>= 3.0) 206 | activesupport (>= 3.0) 207 | sprockets (>= 2.8, < 4.0) 208 | thor (0.19.1) 209 | thread_safe (0.3.5) 210 | tilt (1.4.1) 211 | twitter (5.14.0) 212 | addressable (~> 2.3) 213 | buftok (~> 0.2.0) 214 | equalizer (~> 0.0.9) 215 | faraday (~> 0.9.0) 216 | http (~> 0.6.0) 217 | http_parser.rb (~> 0.6.0) 218 | json (~> 1.8) 219 | memoizable (~> 0.4.0) 220 | naught (~> 1.0) 221 | simple_oauth (~> 0.3.0) 222 | tzinfo (1.2.2) 223 | thread_safe (~> 0.1) 224 | uglifier (2.7.1) 225 | execjs (>= 0.3.0) 226 | json (>= 1.8.0) 227 | web-console (2.1.2) 228 | activemodel (>= 4.0) 229 | binding_of_caller (>= 0.7.2) 230 | railties (>= 4.0) 231 | sprockets-rails (>= 2.0, < 4.0) 232 | xpath (2.0.0) 233 | nokogiri (~> 1.3) 234 | 235 | PLATFORMS 236 | ruby 237 | 238 | DEPENDENCIES 239 | annotate 240 | better_errors 241 | binding_of_caller 242 | byebug 243 | capybara 244 | coffee-rails (~> 4.1.0) 245 | factory_girl_rails 246 | figaro 247 | font-awesome-sass 248 | grackle 249 | jbuilder (~> 2.0) 250 | jquery-rails 251 | mash 252 | materialize-sass 253 | omniauth-twitter 254 | pg 255 | rails (= 4.2.1) 256 | rails_12factor 257 | rspec-rails (~> 3.0.0) 258 | sass-rails (~> 5.0) 259 | sdoc (~> 0.4.0) 260 | shoulda-matchers 261 | simplecov 262 | spring 263 | twitter 264 | uglifier (>= 1.3.0) 265 | web-console (~> 2.0) 266 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Hash Robot](https://raw.githubusercontent.com/rysmith/hashrobot/master/app/assets/images/hashrobot_sm.png) 2 | [![Build Status](https://travis-ci.org/rysmith/hashrobot.svg?branch=master)](https://travis-ci.org/rysmith/hashrobot) 3 | 4 | # HashRobot 5 | A social media assistant. 6 | 7 | ## Goal 8 | HashRobot is your personal marketing consultant. 9 | HashRobot will give the most visible and used hashtags in each category. Adding these hashtags to your tweets will give social media users an edge in getting views and gaining followers. 10 | HashRobot makes it easy for you to tweet right from our hash dash! 11 | 12 | ## Design 13 | HashRobot is designed to process large numbers of current and popular tweets from Twitter's API. 14 | HashRobot then passes them to the MonkeyLearn API to gain data and relevant categories for a each tweet. 15 | HashRobot reivews the results applies its proprietary algorithm then finds the most valuable hash tags for a each category at a given moment. 16 | These hashtags can then be used to raise your social media profile! 17 | 18 | ## Architecture 19 | 20 | * Text analysis with [MonkeyLearn](http://www.monkeylearn.com/ "MonkeyLearn") 21 | * Data from [Twitter](https://twitter.com/ "Twitter") 22 | * Hosted on [Heroku](https://www.heroku.com/ "Heroku") 23 | * Built on [Ruby on Rails](http://rubyonrails.org/ "Rails") with a bit of jQuery 24 | * [Materialise CSS](http://materializecss.com/ "Materialize") for CSS 25 | * Icons from [Font Awesome](https://fortawesome.github.io/Font-Awesome/icons/ "Font Awesome") 26 | * Fonts from [Google Fonts](https://www.google.com/fonts "Google fonts") 27 | 28 | ## License 29 | Copyright (C) 2015 Ryan Smith, Jeff Demers, Chris Wu 30 | 31 | This program is free software: you can redistribute it and/or modify 32 | it under the terms of the GNU General Public License as published by 33 | the Free Software Foundation, either version 3 of the License, or 34 | (at your option) any later version. 35 | 36 | This program is distributed in the hope that it will be useful, 37 | but WITHOUT ANY WARRANTY; without even the implied warranty of 38 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 39 | GNU General Public License for more details. 40 | 41 | You should have received a copy of the GNU General Public License 42 | along with this program. If not, see . 43 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | # Add your own tasks in files placed in lib/tasks ending in .rake, 2 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. 3 | 4 | require File.expand_path('../config/application', __FILE__) 5 | 6 | Rails.application.load_tasks 7 | -------------------------------------------------------------------------------- /app/assets/images/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/.keep -------------------------------------------------------------------------------- /app/assets/images/chris_head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/chris_head.png -------------------------------------------------------------------------------- /app/assets/images/colorful-robots-sm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/colorful-robots-sm.jpg -------------------------------------------------------------------------------- /app/assets/images/colorful-robots.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/colorful-robots.jpg -------------------------------------------------------------------------------- /app/assets/images/creators_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/creators_bg.png -------------------------------------------------------------------------------- /app/assets/images/hash_lg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/hash_lg.png -------------------------------------------------------------------------------- /app/assets/images/hashrobot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/hashrobot.png -------------------------------------------------------------------------------- /app/assets/images/hashrobot_sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/hashrobot_sm.png -------------------------------------------------------------------------------- /app/assets/images/hashrobot_xs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/hashrobot_xs.png -------------------------------------------------------------------------------- /app/assets/images/jeff_head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/jeff_head.png -------------------------------------------------------------------------------- /app/assets/images/robot_chris.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/robot_chris.png -------------------------------------------------------------------------------- /app/assets/images/robot_jeff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/robot_jeff.png -------------------------------------------------------------------------------- /app/assets/images/robot_new_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/robot_new_black.png -------------------------------------------------------------------------------- /app/assets/images/robot_ryan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/robot_ryan.png -------------------------------------------------------------------------------- /app/assets/images/robot_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/robot_white.png -------------------------------------------------------------------------------- /app/assets/images/ryan_head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/ryan_head.png -------------------------------------------------------------------------------- /app/assets/images/sky.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/sky.png -------------------------------------------------------------------------------- /app/assets/images/sky2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/assets/images/sky2.jpeg -------------------------------------------------------------------------------- /app/assets/javascripts/application.js: -------------------------------------------------------------------------------- 1 | // This is a manifest file that'll be compiled into application.js, which will include all the files 2 | // listed below. 3 | // 4 | // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, 5 | // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path. 6 | // 7 | // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the 8 | // compiled file. 9 | // 10 | // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details 11 | // about supported directives. 12 | // 13 | //= require jquery 14 | //= require jquery_ujs 15 | //= require materialize-sprockets 16 | //= require_tree . 17 | 18 | //build the dropdown category list from the categories API endpoint 19 | $(document).ready(function(){ 20 | $.getJSON( "http://www.hashrobot.com/api/categories", function( data ) { 21 | for (var i = 0; i < data.length; i++) { 22 | var categoryName = data[i].name; 23 | var shortCategoryName = categoryName.split(" ")[0]; 24 | $('#dropdown1').append("
  • " + categoryName + "
  • "); 25 | } 26 | 27 | //each click function below displays the hashtags for it's appropriate category 28 | //if there are no hashtags found at the API endpoint, it returns a default hashtag 29 | 30 | $("#Animals").click(function () { 31 | $.getJSON( "http://www.hashrobot.com/api/categories/1", function( data ) { 32 | $('.tag-results').html(""); 33 | if (data.length > 0) { 34 | for (var i = 0; i < data.length; i++) { 35 | var hashtag = data[i].name; 36 | $('.tag-results').append("" + hashtag + "") 37 | } 38 | } else { 39 | $('.tag-results').append("
    #animals
    ") 40 | } 41 | }); 42 | Materialize.toast('Category: Animals', 6000) 43 | }); 44 | 45 | 46 | $("#Beauty").click(function () { 47 | $.getJSON( "http://www.hashrobot.com/api/categories/2", function( data ) { 48 | $('.tag-results').html(""); 49 | if (data.length > 0) { 50 | for (var i = 0; i < data.length; i++) { 51 | var hashtag = data[i].name; 52 | $('.tag-results').append("" + hashtag + "") 53 | } 54 | } else { 55 | $('.tag-results').append("
    #beauty
    ") 56 | } 57 | }); 58 | Materialize.toast('Category: Beauty & Style', 6000) 59 | }); 60 | 61 | $("#Business").click(function () { 62 | $.getJSON( "http://www.hashrobot.com/api/categories/3", function( data ) { 63 | $('.tag-results').html(""); 64 | if (data.length > 0) { 65 | for (var i = 0; i < data.length; i++) { 66 | var hashtag = data[i].name; 67 | $('.tag-results').append("" + hashtag + "") 68 | } 69 | } else { 70 | $('.tag-results').append("
    #business
    ") 71 | } 72 | }); 73 | Materialize.toast('Category: Business & Finance', 6000) 74 | }); 75 | 76 | $("#Computers").click(function () { 77 | $.getJSON( "http://www.hashrobot.com/api/categories/4", function( data ) { 78 | $('.tag-results').html(""); 79 | if (data.length > 0) { 80 | for (var i = 0; i < data.length; i++) { 81 | var hashtag = data[i].name; 82 | $('.tag-results').append("" + hashtag + "") 83 | } 84 | } else { 85 | $('.tag-results').append("
    #computers
    ") 86 | } 87 | }); 88 | Materialize.toast('Category: Computers & Internet', 6000) 89 | }); 90 | 91 | $("#Consumer").click(function () { 92 | $.getJSON( "http://www.hashrobot.com/api/categories/5", function( data ) { 93 | $('.tag-results').html(""); 94 | if (data.length > 0) { 95 | for (var i = 0; i < data.length; i++) { 96 | var hashtag = data[i].name; 97 | $('.tag-results').append("" + hashtag + "") 98 | } 99 | } else { 100 | $('.tag-results').append("
    #electronics
    ") 101 | } 102 | }); 103 | Materialize.toast('Category: Consumer Electronics', 6000) 104 | }); 105 | 106 | $("#Education").click(function () { 107 | $.getJSON( "http://www.hashrobot.com/api/categories/6", function( data ) { 108 | $('.tag-results').html(""); 109 | if (data.length > 0) { 110 | for (var i = 0; i < data.length; i++) { 111 | var hashtag = data[i].name; 112 | $('.tag-results').append("" + hashtag + "") 113 | } 114 | } else { 115 | $('.tag-results').append("
    #education
    ") 116 | } 117 | }); 118 | Materialize.toast('Category: Education', 6000) 119 | }); 120 | 121 | $("#Entertainment").click(function () { 122 | $.getJSON( "http://www.hashrobot.com/api/categories/7", function( data ) { 123 | $('.tag-results').html(""); 124 | if (data.length > 0) { 125 | for (var i = 0; i < data.length; i++) { 126 | var hashtag = data[i].name; 127 | $('.tag-results').append("" + hashtag + "") 128 | } 129 | } else { 130 | $('.tag-results').append("
    #entertainment
    ") 131 | } 132 | }); 133 | Materialize.toast('Category: Entertainment & Recreation', 6000) 134 | }); 135 | 136 | $("#Environment").click(function () { 137 | $.getJSON( "http://www.hashrobot.com/api/categories/8", function( data ) { 138 | $('.tag-results').html(""); 139 | if (data.length > 0) { 140 | for (var i = 0; i < data.length; i++) { 141 | var hashtag = data[i].name; 142 | $('.tag-results').append("" + hashtag + "") 143 | } 144 | } else { 145 | $('.tag-results').append("
    #environment
    ") 146 | } 147 | }); 148 | Materialize.toast('Category: Environment', 6000) 149 | }); 150 | 151 | $("#Food").click(function () { 152 | $.getJSON( "http://www.hashrobot.com/api/categories/9", function( data ) { 153 | $('.tag-results').html(""); 154 | if (data.length > 0) { 155 | for (var i = 0; i < data.length; i++) { 156 | var hashtag = data[i].name; 157 | $('.tag-results').append("" + hashtag + "") 158 | } 159 | } else { 160 | $('.tag-results').append("
    #food
    ") 161 | } 162 | }); 163 | Materialize.toast('Category: Food & Drink', 6000) 164 | }); 165 | 166 | $("#Gardening").click(function () { 167 | $.getJSON( "http://www.hashrobot.com/api/categories/10", function( data ) { 168 | $('.tag-results').html(""); 169 | if (data.length > 0) { 170 | for (var i = 0; i < data.length; i++) { 171 | var hashtag = data[i].name; 172 | $('.tag-results').append("" + hashtag + "") 173 | } 174 | } else { 175 | $('.tag-results').append("
    #gardening
    ") 176 | } 177 | }); 178 | Materialize.toast('Category: Gardening', 6000) 179 | }); 180 | 181 | $("#Health").click(function () { 182 | $.getJSON( "http://www.hashrobot.com/api/categories/11", function( data ) { 183 | $('.tag-results').html(""); 184 | if (data.length > 0) { 185 | for (var i = 0; i < data.length; i++) { 186 | var hashtag = data[i].name; 187 | $('.tag-results').append("" + hashtag + "") 188 | } 189 | } else { 190 | $('.tag-results').append("
    #health
    ") 191 | } 192 | }); 193 | Materialize.toast('Category: Health & Medicine', 6000) 194 | }); 195 | 196 | $("#Home").click(function () { 197 | $.getJSON( "http://www.hashrobot.com/api/categories/12", function( data ) { 198 | $('.tag-results').html(""); 199 | if (data.length > 0) { 200 | for (var i = 0; i < data.length; i++) { 201 | var hashtag = data[i].name; 202 | $('.tag-results').append("" + hashtag + "") 203 | } 204 | } else { 205 | $('.tag-results').append("
    #home
    ") 206 | } 207 | }); 208 | Materialize.toast('Category: Home', 6000) 209 | }); 210 | 211 | $("#Humanities").click(function () { 212 | $.getJSON( "http://www.hashrobot.com/api/categories/13", function( data ) { 213 | $('.tag-results').html(""); 214 | if (data.length > 0) { 215 | for (var i = 0; i < data.length; i++) { 216 | var hashtag = data[i].name; 217 | $('.tag-results').append("" + hashtag + "") 218 | } 219 | } else { 220 | $('.tag-results').append("
    #humanities
    ") 221 | } 222 | }); 223 | Materialize.toast('Category: Humanities', 6000) 224 | }); 225 | 226 | $("#Science").click(function () { 227 | $.getJSON( "http://www.hashrobot.com/api/categories/14", function( data ) { 228 | $('.tag-results').html(""); 229 | if (data.length > 0) { 230 | for (var i = 0; i < data.length; i++) { 231 | var hashtag = data[i].name; 232 | $('.tag-results').append("" + hashtag + "") 233 | } 234 | } else { 235 | $('.tag-results').append("
    #science
    ") 236 | } 237 | }); 238 | Materialize.toast('Category: Science & Mathematics', 6000) 239 | }); 240 | 241 | $("#Society").click(function () { 242 | $.getJSON( "http://www.hashrobot.com/api/categories/15", function( data ) { 243 | $('.tag-results').html(""); 244 | if (data.length > 0) { 245 | for (var i = 0; i < data.length; i++) { 246 | var hashtag = data[i].name; 247 | $('.tag-results').append("" + hashtag + "") 248 | } 249 | } else { 250 | $('.tag-results').append("
    #society
    ") 251 | } 252 | }); 253 | Materialize.toast('Category: Society', 6000) 254 | }); 255 | 256 | $("#Travel").click(function () { 257 | $.getJSON( "http://www.hashrobot.com/api/categories/16", function( data ) { 258 | $('.tag-results').html(""); 259 | if (data.length > 0) { 260 | for (var i = 0; i < data.length; i++) { 261 | var hashtag = data[i].name; 262 | $('.tag-results').append("" + hashtag + "") 263 | } 264 | } else { 265 | $('.tag-results').append("
    #travel
    ") 266 | } 267 | }); 268 | Materialize.toast('Category: Travel', 6000) 269 | }); 270 | }); 271 | 272 | $('.parallax').parallax(); 273 | }); 274 | -------------------------------------------------------------------------------- /app/assets/javascripts/categories.coffee: -------------------------------------------------------------------------------- 1 | # Place all the behaviors and hooks related to the matching controller here. 2 | # All this logic will automatically be available in application.js. 3 | # You can use CoffeeScript in this file: http://coffeescript.org/ 4 | -------------------------------------------------------------------------------- /app/assets/javascripts/static.coffee: -------------------------------------------------------------------------------- 1 | # Place all the behaviors and hooks related to the matching controller here. 2 | # All this logic will automatically be available in application.js. 3 | # You can use CoffeeScript in this file: http://coffeescript.org/ 4 | -------------------------------------------------------------------------------- /app/assets/javascripts/tweets.coffee: -------------------------------------------------------------------------------- 1 | # Place all the behaviors and hooks related to the matching controller here. 2 | # All this logic will automatically be available in application.js. 3 | # You can use CoffeeScript in this file: http://coffeescript.org/ 4 | -------------------------------------------------------------------------------- /app/assets/javascripts/users.coffee: -------------------------------------------------------------------------------- 1 | # Place all the behaviors and hooks related to the matching controller here. 2 | # All this logic will automatically be available in application.js. 3 | # You can use CoffeeScript in this file: http://coffeescript.org/ 4 | -------------------------------------------------------------------------------- /app/assets/stylesheets/application.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * This is a manifest file that'll be compiled into application.css, which will include all the files 3 | * listed below. 4 | * 5 | * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, 6 | * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path. 7 | * 8 | * You're free to add application-wide styles to this file and they'll appear at the bottom of the 9 | * compiled file so the styles you add here take precedence over styles defined in any styles 10 | * defined in the other CSS/SCSS files in this directory. It is generally better to create a new 11 | * file per style scope. 12 | * 13 | *= require_tree . 14 | *= require_self 15 | */ 16 | 17 | @import 'font-awesome-sprockets'; 18 | @import 'font-awesome'; 19 | @import "materialize/components/color"; 20 | $primary-color: #FC8E2D !default; 21 | $secondary-color: #8E2A92; 22 | @import 'materialize'; 23 | @import url(http://fonts.googleapis.com/css?family=Poiret+One|Exo|Play|Orbitron|Varela|Jura); 24 | 25 | body { 26 | display: flex; 27 | min-height: 100vh; 28 | flex-direction: column; 29 | } 30 | 31 | .about a { 32 | color: white; 33 | text-decoration: underline; 34 | } 35 | 36 | main { 37 | flex: 1 0 auto; 38 | } 39 | 40 | .btn { 41 | background-color: $primary-color; 42 | } 43 | 44 | .btn:hover { 45 | background: $secondary-color; 46 | } 47 | 48 | p { 49 | line-height: 2rem; 50 | } 51 | 52 | .button-collapse { 53 | color: #26a69a; 54 | } 55 | div.scroll { 56 | background-color: lightgrey; 57 | height: 200px; 58 | overflow: scroll; 59 | } 60 | 61 | footer.page-footer { 62 | margin-top: 0; 63 | 64 | } 65 | 66 | #nav-mobile { 67 | padding-top: 7px; 68 | } 69 | 70 | nav { 71 | height: 80px; 72 | background-color: #05AAB4; 73 | padding-top: 7px; 74 | padding-bottom: 3px; 75 | } 76 | 77 | footer.page-footer { 78 | background-color: #00B4BF; 79 | } 80 | 81 | .nav-logout-link { 82 | margin-right: 10px; 83 | } 84 | 85 | .user-image { 86 | border-radius: 10px; 87 | } 88 | 89 | footer a { 90 | margin: 5px; 91 | } 92 | -------------------------------------------------------------------------------- /app/assets/stylesheets/categories.scss: -------------------------------------------------------------------------------- 1 | // Place all the styles related to the categories controller here. 2 | // They will automatically be included in application.css. 3 | // You can use Sass (SCSS) here: http://sass-lang.com/ 4 | -------------------------------------------------------------------------------- /app/assets/stylesheets/pages.scss: -------------------------------------------------------------------------------- 1 | .top { 2 | background: #00B4BF; 3 | } 4 | 5 | .creators { 6 | background: black; 7 | border: 5px solid #00B4BF; 8 | width: 200px; 9 | height: 200px; 10 | border-radius: 100%; 11 | background-position: center center; // Center image in the circle 12 | padding-top: 20px; 13 | margin-left: 50px; 14 | } 15 | 16 | .tag-results .card { 17 | padding: 5px; 18 | text-align: center; 19 | background: #8E2A92; 20 | color: white; 21 | } 22 | 23 | .creators h4 { 24 | margin-top: 50px; 25 | } 26 | 27 | .material-icons { 28 | color: white; 29 | } 30 | 31 | #category-dropdown { 32 | display: block; 33 | } 34 | 35 | .tweet-box { 36 | margin-top: 200px; 37 | } 38 | 39 | .tag-results { 40 | width: 200px; 41 | } 42 | 43 | .welcome-btn > a { 44 | color: white; 45 | } 46 | 47 | .parallax-container-0 { 48 | height: 100px !important; 49 | } 50 | 51 | .parallax-container-1 { 52 | height: 300px !important; 53 | } 54 | 55 | .about{ 56 | color: white; 57 | font-size: 20px; 58 | } 59 | 60 | .main_title{ 61 | color: white; 62 | } 63 | 64 | .info { 65 | background-color: #FC8E2D; 66 | } 67 | 68 | .jumbotron { 69 | background-color: #00B4BF; 70 | } 71 | 72 | .jumbotron-header, h4, h2, h3 { 73 | font-family: 'Play', sans-serif; 74 | } 75 | 76 | h5, p, a { 77 | font-family: 'Exo', sans-serif; 78 | } 79 | 80 | .middle-robot-img { 81 | margin: 0px 50px 0px 50px; 82 | } 83 | 84 | #robot-jeff { 85 | background-image: url("robot_jeff.png"); 86 | height: 200px; 87 | width: 200px; 88 | display: inline-block; 89 | background-color: white; 90 | border-radius: 174px; 91 | margin-top: 30px; 92 | background-position: 48% 0%; 93 | } 94 | #robot-ryan { 95 | background-image: url("robot_ryan.png"); 96 | height: 200px; 97 | width: 200px; 98 | display: inline-block; 99 | background-color: white; 100 | border-radius: 174px; 101 | margin-top: 30px; 102 | background-position: 48% 0%; 103 | 104 | } 105 | #robot-chris { 106 | background-image: url("robot_chris.png"); 107 | height: 200px; 108 | width: 200px; 109 | display: inline-block; 110 | background-color: white; 111 | border-radius: 174px; 112 | margin-top: 30px; 113 | background-position: 48% 0%; 114 | } 115 | 116 | .pictures { 117 | background-color: #8E2A92; 118 | color: white; 119 | } 120 | 121 | .tag-results .card { 122 | margin: 5px; 123 | display: inline-block; 124 | } 125 | 126 | .tag-results { 127 | display: inline-block; 128 | overflow: auto; 129 | width: 100%; 130 | margin-top: 10px; 131 | } 132 | 133 | .creators h4 a { 134 | color: white; 135 | text-decoration: underline; 136 | } 137 | -------------------------------------------------------------------------------- /app/assets/stylesheets/tweets.scss: -------------------------------------------------------------------------------- 1 | // Place all the styles related to the Tweets controller here. 2 | // They will automatically be included in application.css. 3 | // You can use Sass (SCSS) here: http://sass-lang.com/ 4 | -------------------------------------------------------------------------------- /app/assets/stylesheets/users.scss: -------------------------------------------------------------------------------- 1 | // Place all the styles related to the Users controller here. 2 | // They will automatically be included in application.css. 3 | // You can use Sass (SCSS) here: http://sass-lang.com/ 4 | -------------------------------------------------------------------------------- /app/assets/stylesheets/welcome.scss: -------------------------------------------------------------------------------- 1 | // Place all the styles related to the static controller here. 2 | // They will automatically be included in application.css. 3 | // You can use Sass (SCSS) here: http://sass-lang.com/ 4 | 5 | #welcome-header { 6 | text-align: center; 7 | } -------------------------------------------------------------------------------- /app/controllers/api/categories_controller.rb: -------------------------------------------------------------------------------- 1 | module Api 2 | class CategoriesController < ApplicationController 3 | 4 | protect_from_forgery with: :null_session 5 | 6 | # expose the list of categories at /api/categories 7 | def index 8 | 9 | @categories = Category.all 10 | render json: @categories 11 | end 12 | 13 | # expose the hastags for each category /api/categories/ 14 | def show 15 | 16 | category = Category.find(params[:id]) 17 | tags = category.tags.order(rank: :desc).limit(15) 18 | render json: tags 19 | end 20 | 21 | # for each Category, get the hashtag ranking and save it to the db 22 | def rank_tags 23 | 24 | category = Category.all 25 | 26 | category.each do |c| 27 | save_tags(get_ranking(c['name'])) 28 | end 29 | 30 | redirect_to dashboard_path 31 | end 32 | 33 | private 34 | 35 | # expects a category name from the Categories table 36 | # returns a single key/value pair 37 | # key is the category_id 38 | # value is an array with the rank and hashtag 39 | def get_ranking(category) 40 | 41 | category_tags = get_categories(Label, category) 42 | rank = get_tag_rank(category_tags) 43 | determine_winners(rank, category) 44 | end 45 | 46 | # expects a category name and the label table 47 | # returns an array of two item arrays with probability and hashtag - e.g. [[1.297, "#hashtag"], ...] 48 | def get_categories(label_table, category) 49 | 50 | #only get hashtags with a monkeylearn probability greater than 20% 51 | cat = label_table.connection.execute("SELECT * FROM Labels WHERE label='#{category}' and probability>=0.200;") 52 | cat_tags = {} 53 | 54 | #convert the psql string 'array' to a true array 55 | cat.each do |t| 56 | 57 | cat_tags.merge!(t['probability'].to_f => t['hashtag'].gsub("{","").gsub("}","").split(",")) 58 | end 59 | 60 | #make all the hashtags lowercase 61 | cat_tags.each do |key, value| 62 | 63 | value.each do |v| 64 | v.downcase! 65 | end 66 | 67 | end 68 | 69 | cat_tags_sep = [] 70 | 71 | #associate each hashtag with a probability as a two item array 72 | cat_tags.each do |key, value| 73 | 74 | value.each do |v| 75 | 76 | cat_tags_sep << "#{key},#{v}".split(",") 77 | end 78 | end 79 | 80 | cat_tags_sep_final = [] 81 | 82 | #convert the probability back to float 83 | cat_tags_sep.each do |e| 84 | 85 | cat_tags_sep_final << [e[0].to_f, e[1]] 86 | end 87 | 88 | #return a two item array with probability and hashtag - e.g. [1.297, "#hashtag"] 89 | cat_tags_sep_final 90 | end 91 | 92 | # rank the tags by how often they appear and the monkeylearn probability 93 | # expects an array of two item arrays e.g. [[0.297, "#hashtag"], ...] 94 | # returns an array of three item arrays each containing the probability, hashtag, and rank 95 | # e.g. [[0.297, "#hashtag", 0.594], ...] 96 | def get_tag_rank(get_categories) 97 | 98 | ranked_hashtags = [] 99 | 100 | get_categories.each do |tag_array| 101 | 102 | tag = tag_array[1] 103 | tag_count = 0 104 | 105 | get_categories.each do |tag_array_nested| 106 | 107 | if tag == tag_array_nested[1] 108 | 109 | tag_count += 1 110 | end 111 | end 112 | 113 | tag_array << tag_count * tag_array[0] 114 | tag_array << tag_count 115 | ranked_hashtags << tag_array 116 | end 117 | 118 | eliminate_tag_dups(ranked_hashtags) 119 | end 120 | 121 | # remove tags that appear more than once 122 | def eliminate_tag_dups(ranked_hashtags) 123 | dups_array = [] 124 | ranked_hashtags.each do |ranked_tag_array| 125 | if ranked_tag_array[3] > 1 126 | dups_array << ranked_tag_array 127 | end 128 | end 129 | if dups_array.length > 1 130 | tag_rank = [] 131 | dups_array.each do |arr| 132 | tag_rank << arr[2] 133 | end 134 | max_index_val = tag_rank.index(tag_rank.max) 135 | tag_to_use = dups_array[max_index_val] 136 | no_dups = ranked_hashtags - dups_array 137 | ranked_tags_no_dups = no_dups << tag_to_use 138 | return ranked_tags_no_dups 139 | else 140 | return ranked_hashtags 141 | end 142 | end 143 | 144 | # convert the category name to a cateogry_id 145 | # allow hashtags through that have a rank of 0.35 or higher 146 | # expects an array of three item arrays each containing the probability, hashtag, and rank 147 | # returns an a hash with the category_id (key), and a two item array with the hashtag and rank (value) 148 | def determine_winners(get_tag_rank, category) 149 | 150 | case category 151 | when "Animals" 152 | category_id = 1 153 | when "Beauty & Style" 154 | category_id = 2 155 | when "Business & Finance" 156 | category_id = 3 157 | when "Computers & Internet" 158 | category_id = 4 159 | when "Consumer Electronics" 160 | category_id = 5 161 | when "Education" 162 | category_id = 6 163 | when "Entertainment & Recreation" 164 | category_id = 7 165 | when "Environment" 166 | category_id = 8 167 | when "Food & Drink" 168 | category_id = 9 169 | when "Gardening" 170 | category_id = 10 171 | when "Health & Medicine" 172 | category_id = 11 173 | when "Home" 174 | category_id = 12 175 | when "Humanities" 176 | category_id = 13 177 | when "Science & Mathematics" 178 | category_id = 14 179 | when "Society" 180 | category_id = 15 181 | when "Travel" 182 | category_id = 16 183 | end 184 | 185 | cat_winners = [] 186 | 187 | get_tag_rank.each do |t| 188 | 189 | if t[2] >=0.35 190 | 191 | cat_winners << [t[1], t[2]] 192 | end 193 | end 194 | 195 | winners = {category_id => cat_winners } 196 | end 197 | 198 | # expects a hash with the category_id (key), and a two item array with the hashtag and rank (value) 199 | # save hashtags and their rank to the Categories table 200 | def save_tags(winners) 201 | 202 | winners.each do |key, value| 203 | 204 | if value.length > 0 205 | 206 | value.each do |v| 207 | 208 | @category = Category.find(key) 209 | @category.tags << Tag.create( :name => v[0], :category_id => key, :rank => v[1]) 210 | end 211 | 212 | else 213 | 214 | puts "category #{key} has no tags" 215 | end 216 | end 217 | end 218 | end 219 | end 220 | -------------------------------------------------------------------------------- /app/controllers/application_controller.rb: -------------------------------------------------------------------------------- 1 | class ApplicationController < ActionController::Base 2 | # Prevent CSRF attacks by raising an exception. 3 | # For APIs, you may want to use :null_session instead. 4 | # protect_from_forgery with: :exception 5 | 6 | helper_method :current_user 7 | 8 | private 9 | 10 | def current_user 11 | @current_user ||= User.find_by(id: session[:user_id]) 12 | end 13 | 14 | #restrict access to specific pages without login 15 | def authorize 16 | unless current_user 17 | flash[:error] = 'you must login to see that page' 18 | redirect_to welcome_path 19 | end 20 | end 21 | 22 | end 23 | -------------------------------------------------------------------------------- /app/controllers/concerns/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/controllers/concerns/.keep -------------------------------------------------------------------------------- /app/controllers/labels_controller.rb: -------------------------------------------------------------------------------- 1 | class LabelsController < ApplicationController 2 | 3 | def index 4 | 5 | @labels = Label.all 6 | end 7 | 8 | # send tweet strings to monkeylearn and save the results to the db 9 | def create 10 | 11 | tweet_content = compile_tweet_content(Tweet) 12 | 13 | tweet_tag = compile_tweet_tags(tweet_content) 14 | 15 | tweet_id = compile_tweet_id(Tweet) 16 | 17 | response = analyze_tweets(tweet_content) 18 | 19 | tweet_category_id = inject_tweet_id(response, tweet_id) 20 | 21 | tweet_category_id_tag = inject_tweet_tag(tweet_category_id, tweet_tag) 22 | 23 | save_tweets(tweet_category_id_tag) 24 | 25 | redirect_to dashboard_path 26 | end 27 | 28 | private 29 | 30 | # compile_tweets assumes your tweet_table has a 'content' attribute 31 | # returns an array of strings 32 | def compile_tweet_content(tweets_table) 33 | 34 | # create an empty array to store the content of each tweet 35 | tweet_content = [] 36 | 37 | # get all the tweets from the db 38 | tweets = tweets_table.connection.execute("SELECT * FROM Tweets WHERE content LIKE '%#%' ORDER BY created DESC;") 39 | 40 | # extract the content for each tweet and push it to tweet_content 41 | tweets.each do |tweet| 42 | 43 | tweet_content << tweet['content'] 44 | end 45 | 46 | # return the content of each tweet 47 | tweet_content 48 | end 49 | 50 | # returns an array of integers (id of the tweets in the tweet table) 51 | def compile_tweet_id(tweets_table) 52 | 53 | # create an empty array to store the id of each tweet 54 | tweet_id = [] 55 | 56 | # get all the tweets from the db 57 | tweets = tweets_table.connection.execute("SELECT * FROM Tweets WHERE content LIKE '%#%' ORDER BY created DESC;") 58 | 59 | # extract the id for each tweet and push it to tweet_id 60 | tweets.each do |tweet| 61 | 62 | tweet_id << tweet['id'] 63 | end 64 | 65 | # return the id of each tweet 66 | tweet_id 67 | end 68 | 69 | def compile_tweet_tags(tweet_content) 70 | # create an empty array to store the content of each tweet 71 | tweet_tags = [] 72 | 73 | # extract the content for each tweet and push it to tweet_content 74 | tweet_content.each do |tweet| 75 | 76 | tweet_tags << tweet.scan(/#[a-z1-9A-Z]+/) 77 | end 78 | 79 | # return the content of each tweet 80 | tweet_tags 81 | end 82 | 83 | # analyse_tweets expects an array of strings 84 | # returns a JSON object 85 | def analyze_tweets(tweet_list) 86 | 87 | # get the monkeylearn API token from Figaro 88 | monkey_token = Figaro.env.monkey_learn_token || MONKEY_LEARN_TOKEN 89 | 90 | # cl_5icAVzKR is the generic topic classifier endpoint 91 | uri = URI.parse("https://api.monkeylearn.com/v2/classifiers/cl_5icAVzKR/classify/") 92 | http = Net::HTTP.new(uri.host, uri.port) 93 | http.use_ssl = true 94 | request = Net::HTTP::Post.new(uri.request_uri) 95 | 96 | # set POST data with the content of each tweet 97 | # the monkeylean API expects an array of strings 98 | request.body = {text_list: tweet_list}.to_json 99 | 100 | # set the response type to JSON in the header 101 | request.add_field("Content-Type", "application/json") 102 | 103 | # pass in the monkeylearn API token in the header 104 | request.add_field("Authorization", "token #{monkey_token}") 105 | 106 | # parse the monkeylearn response to usable JSON 107 | response = JSON.parse http.request(request).body 108 | end 109 | 110 | # once the tweets have been processed add the tweet id back in 111 | def inject_tweet_id (response, tweet_id) 112 | 113 | i = 0 114 | 115 | response['result'].each do |t| 116 | 117 | t[0].merge!("id" => tweet_id[i]) 118 | i += 1 119 | end 120 | end 121 | 122 | # once the tweets have been processed extract and add hash tags 123 | def inject_tweet_tag (response, tweet_tags) 124 | 125 | i = 0 126 | 127 | response.each do |t| 128 | 129 | t[0].merge!("hashtag" => tweet_tags[i]) 130 | i += 1 131 | end 132 | end 133 | 134 | # save the results from the monkeylearn API to the categories table 135 | def save_tweets(analyzed_tweets) 136 | 137 | #extract the arrays of categories 138 | result = analyzed_tweets 139 | 140 | #use only the first category result for each tweet and save it to the categories table 141 | result.each do |t| 142 | 143 | Label.create({:probability => t[0]['probability'], :label => t[0]['label'], :tweet_id => t[0]['id'], :hashtag => t[0]['hashtag'] }) 144 | end 145 | end 146 | end 147 | -------------------------------------------------------------------------------- /app/controllers/pages_controller.rb: -------------------------------------------------------------------------------- 1 | class PagesController < ApplicationController 2 | def index 3 | end 4 | 5 | def about 6 | end 7 | 8 | def dashboard 9 | @tweets = Tweet.all.order(created: :desc) 10 | end 11 | 12 | def hashboard 13 | 14 | end 15 | 16 | end 17 | -------------------------------------------------------------------------------- /app/controllers/sessions_controller.rb: -------------------------------------------------------------------------------- 1 | class SessionsController < ApplicationController 2 | 3 | def create 4 | begin 5 | 6 | @user = User.from_omniauth(request.env['omniauth.auth']) 7 | session[:user_id] = @user.id 8 | flash[:success] = "Welcome, #{@user.name}!" 9 | rescue 10 | 11 | flash[:warning] = 'There was an error while trying to authenticate you...' 12 | end 13 | 14 | redirect_to hashboard_path 15 | end 16 | 17 | def destroy 18 | 19 | if current_user 20 | 21 | session.delete(:user_id) 22 | flash[:success] = 'See you later!' 23 | end 24 | 25 | redirect_to root_path 26 | end 27 | 28 | def auth_failure 29 | 30 | redirect_to root_path 31 | end 32 | end 33 | -------------------------------------------------------------------------------- /app/controllers/tweets_controller.rb: -------------------------------------------------------------------------------- 1 | class TweetsController < ApplicationController 2 | 3 | def index 4 | 5 | @tweets = Tweet.all.order(created: :desc) 6 | end 7 | 8 | def get_latest 9 | 10 | tweets = client.search("*.* -rt", lang: "en", result_type: "mixed", hashtags: true, geocode: tweet_loc_params[:tweet_location] + ',5mi').take(500) 11 | 12 | tweets.each do |t| 13 | 14 | created = DateTime.parse(t.created_at.to_s) 15 | 16 | # create the tweet if it doesnt already exist 17 | unless Tweet.exists?(["created=?", created]) 18 | 19 | Tweet.create({:content => t.text, :created => t.created_at }) 20 | end 21 | end 22 | 23 | redirect_to dashboard_path 24 | end 25 | 26 | def create 27 | 28 | client.update(tweet_params[:tweet_body]) 29 | 30 | redirect_to hashboard_path 31 | end 32 | 33 | private 34 | 35 | def tweet_params 36 | 37 | params.permit(:tweet_body) 38 | end 39 | 40 | def tweet_loc_params 41 | 42 | params.permit(:tweet_location) 43 | end 44 | 45 | def client 46 | 47 | Twitter::REST::Client.new do |config| 48 | 49 | config.consumer_key = Figaro.env.twitter_key 50 | config.consumer_secret = Figaro.env.twitter_secret 51 | config.access_token = current_user.token 52 | config.access_token_secret = current_user.secret 53 | end 54 | end 55 | end 56 | -------------------------------------------------------------------------------- /app/controllers/users_controller.rb: -------------------------------------------------------------------------------- 1 | class UsersController < ApplicationController 2 | def index 3 | end 4 | 5 | def show 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/helpers/application_helper.rb: -------------------------------------------------------------------------------- 1 | module ApplicationHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/helpers/categories_helper.rb: -------------------------------------------------------------------------------- 1 | module CategoriesHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/helpers/static_helper.rb: -------------------------------------------------------------------------------- 1 | module StaticHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/helpers/tweets_helper.rb: -------------------------------------------------------------------------------- 1 | module TweetsHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/helpers/users_helper.rb: -------------------------------------------------------------------------------- 1 | module UsersHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/mailers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/mailers/.keep -------------------------------------------------------------------------------- /app/models/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/models/.keep -------------------------------------------------------------------------------- /app/models/category.rb: -------------------------------------------------------------------------------- 1 | class Category < ActiveRecord::Base 2 | has_many :category_tags 3 | has_many :tags, through: :category_tags 4 | end 5 | -------------------------------------------------------------------------------- /app/models/category_tag.rb: -------------------------------------------------------------------------------- 1 | class CategoryTag < ActiveRecord::Base 2 | belongs_to :category 3 | belongs_to :tag 4 | end 5 | -------------------------------------------------------------------------------- /app/models/concerns/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/models/concerns/.keep -------------------------------------------------------------------------------- /app/models/label.rb: -------------------------------------------------------------------------------- 1 | class Label < ActiveRecord::Base 2 | end 3 | -------------------------------------------------------------------------------- /app/models/tag.rb: -------------------------------------------------------------------------------- 1 | class Tag < ActiveRecord::Base 2 | has_many :category_tags 3 | has_many :categories, through: :category_tags 4 | end 5 | -------------------------------------------------------------------------------- /app/models/tweet.rb: -------------------------------------------------------------------------------- 1 | class Tweet < ActiveRecord::Base 2 | 3 | belongs_to :category 4 | end 5 | 6 | -------------------------------------------------------------------------------- /app/models/user.rb: -------------------------------------------------------------------------------- 1 | class User < ActiveRecord::Base 2 | 3 | def self.from_omniauth(auth_hash) 4 | 5 | user = find_or_create_by(uid: auth_hash['uid'], provider: auth_hash['provider']) 6 | user.name = auth_hash['info']['name'] 7 | user.location = auth_hash['info']['location'] 8 | user.image_url = auth_hash['info']['image'] 9 | user.url = auth_hash['info']['urls']['Twitter'] 10 | user.token = auth_hash['credentials']['token'] 11 | user.secret = auth_hash['credentials']['secret'] 12 | user.save! 13 | user 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /app/views/categories/index.html.erb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/app/views/categories/index.html.erb -------------------------------------------------------------------------------- /app/views/labels/index.html.erb: -------------------------------------------------------------------------------- 1 |
    2 | 3 |

    Categories#index

    4 |

    Find me in app/views/categories/index.html.erb

    5 | 6 |
    7 | <% @labels.each do |cat| %> 8 | 9 | <%= cat.id %> 10 | <%= cat.tweet_id %> 11 | <%= cat.label%> 12 | <%= cat.probability%> 13 |
    14 | 15 | <% end %> 16 |
    17 |
    -------------------------------------------------------------------------------- /app/views/labels/new.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |

    Analyze Tweets

    3 |

    Run the MonkeyLearn analytics on the tweet table

    4 | 5 | <%= form_tag('/labels/create')do %> 6 | <%= button_tag(:class => 'btn') do %> 7 |   Get Latest! 8 | <% end %> 9 | <% end %> 10 | 11 | <%= form_tag('/api/categories/rank_tags')do %> 12 | <%= button_tag(:class => 'btn') do %> 13 |   BAM! 14 | <% end %> 15 | <% end %> 16 | 17 | 18 |
    19 | -------------------------------------------------------------------------------- /app/views/labels/show.html.erb: -------------------------------------------------------------------------------- 1 |

    Categories#show

    2 |

    Find me in app/views/categories/show.html.erb

    3 | -------------------------------------------------------------------------------- /app/views/layouts/application.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Hashrobot 5 | <%= stylesheet_link_tag 'application', media: 'all'%> 6 | <%= javascript_include_tag 'application'%> 7 | <%= csrf_meta_tags %> 8 | 9 | 10 | 11 | 12 | <%= render 'shared/nav' %> 13 | 14 |
    15 | <%= yield %> 16 |
    17 | 18 | <%= render 'shared/footer' %> 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/views/pages/about.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |

    About #Robot

    3 | 4 |

    Purpose

    5 |

    6 | #Robot will give the user the best hast tag choices based on a chosen category. 7 | Users can then tweet right from the application with the suggested hash tags. 8 |

    9 | 10 |

    Design

    11 |

    12 | #Robot is designed to ingest large numbers of tweets from Twitter's API. 13 | It then passes them to the Monkey Learn API to get the relevant category for a particular tweet. 14 | It then finds the most used hash tags for a particular category and returns those to a user upon request. 15 |

    16 | 17 |

    Creators

    18 |

    19 | #Robot was created by Ryan Smith, Jeff Demers, and Chris Wu 20 | while taking General Assembly's 12-week Web Development Immersive program. 21 |

    22 |
    23 | 24 | -------------------------------------------------------------------------------- /app/views/pages/dashboard.html.erb: -------------------------------------------------------------------------------- 1 | <% if current_user && current_user.id == 1 %> 2 |
    3 | 4 |

    Dashboard

    5 | 6 |
    7 |
    8 | <%= form_tag('/tweets/get_latest')do %> 9 | <%= text_field_tag :tweet_location, nil, :placeholder => "e.g. 34.101509,-118.32691" %> 10 | <%= button_tag(:class => 'btn') do %> 11 |   Get Tweets 12 | <% end %> 13 | <% end %> 14 |
    15 | 16 |
    17 | <%= form_tag('/labels/create')do %> 18 | <%= button_tag(:class => 'btn') do %> 19 |   Categorize Tweets 20 | <% end %> 21 | <% end %> 22 |
    23 | 24 |
    25 | <%= form_tag('/api/categories/rank_tags')do %> 26 | <%= button_tag(:class => 'btn') do %> 27 |   Rank Tags 28 | <% end %> 29 | <% end %> 30 |
    31 |
    32 | 33 |
    All Tweets
    34 | 35 |
    36 | 37 | <% @tweets.each do |tweet| %> 38 | 39 | <%= tweet.id%> 40 | <%= tweet.content%> 41 | <%= tweet.created%> 42 |
    43 | 44 | <% end %> 45 | 46 |
    47 |
    48 | <% end %> 49 | -------------------------------------------------------------------------------- /app/views/pages/hashboard.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |

    Welcome to the #Board

    3 |
    4 | 5 | 6 | Pick a Category 7 | 8 | 9 |
    10 | 11 |
    12 | 13 |
    14 | 15 | <% if current_user %> 16 |
    17 | <%= form_tag('/tweets/create')do %> 18 | <%= text_field_tag :tweet_body, nil, :placeholder => "Enter tweet here" %> 19 | <%= button_tag(:class => 'btn') do %> 20 |   Tweet! 21 | <% end %> 22 | <% end %> 23 |
    24 |
    25 | <% end %> 26 | 27 | 28 |
    29 | -------------------------------------------------------------------------------- /app/views/pages/index.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
    3 |
    4 |
    5 |
    6 |

    #Robot

    7 |
    Great content deserves to be #noticed.
    8 | <% if current_user %> 9 | <%= link_to 'Log Out', logout_path, method: :delete, 'class' => 'waves-effect waves-light btn-large welcome-btn' %> 10 | <%= link_to '#board', hashboard_path, 'class' => 'waves-effect waves-light btn-large welcome-btn' %> 11 | <% else %> 12 | <%= button_tag(:class => 'waves-effect waves-light btn-large welcome-btn') do %> 13 | Login with Twitter 14 | <% end %> 15 | <% end %> 16 |
    17 |
    18 |
    19 |
    20 | 21 | 22 |
    23 |
    <%= image_tag 'colorful-robots-sm.jpg' %>
    24 |
    25 | 26 |
    27 |

    Make a big impact with your social media content.

    28 |
    29 |
    30 | trending_up 31 |
    Goal
    32 |

    #Robot is your personal marketing consultant. 33 |

    #Robot will give the most visible and used hashtags in each category. Adding these hashtags to your tweets will give social media users an edge in getting views and gaining followers. 34 |

    #Robot makes it easy for you to tweet right from our hash dash! 35 |

    36 |
    37 |
    38 | track_changes 39 |
    Design
    40 |

    #Robot is designed to process large numbers of current and popular tweets from Twitter's API. 41 | #Robot then passes them to the MonkeyLearn API to gain data and relevant categories for a each tweet. 42 | #Robot reivews the results applies its proprietary algorithm then finds the most valuable hash tags for a each category at a given moment. 43 |

    These hashtags can then be used to raise your social media profile! 44 |

    45 |
    46 |
    47 | web 48 |
    Architecture
    49 | 59 |
    60 |
    61 |
    62 | 63 | 64 |
    65 |
    <%= image_tag 'creators_bg.png' %>
    66 |
    67 | 68 |
    69 |
    70 |
    71 |
    72 |
    73 |

    Creators

    74 |
    75 | Conceived and created during General Assembly's 12-week WDI program. 76 |
    77 |
    78 |
    79 |
    80 | 86 |
    87 | 91 |
    92 |
    93 | 97 |
    98 |
    99 |
    100 |
    101 |
    102 | 103 |
    104 |
    <%= image_tag 'colorful-robots-sm.jpg' %>
    105 |
    106 | -------------------------------------------------------------------------------- /app/views/shared/_footer.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 |
    5 |
    Links
    6 |
      7 | Follow @hash_robot 8 | 9 | 10 | Email Us! 11 |
    12 |
    13 |
    14 |
    15 | 20 |
    21 | -------------------------------------------------------------------------------- /app/views/shared/_nav.html.erb: -------------------------------------------------------------------------------- 1 | 18 |
    19 | <% flash.each do |key, value| %> 20 |
    21 | <%= value %> 22 |
    23 | <% end %> 24 |
    25 | -------------------------------------------------------------------------------- /app/views/tweets/index.html.erb: -------------------------------------------------------------------------------- 1 |
    2 | 3 |

    #Robot Command Central

    4 | 5 | <%= form_tag('/tweets/get_latest')do %> 6 | <%= button_tag(:class => 'btn') do %> 7 |   Get Tweets 8 | <% end %> 9 | <% end %> 10 | 11 |

    Show all the tweets in the db

    12 | 13 |
    14 | 15 | <% @tweets.each do |tweet| %> 16 | 17 | <%= tweet.id%> 18 | <%= tweet.content%> 19 | <%= tweet.created%> 20 |
    21 | 22 | <% end %> 23 | 24 |
    25 | 26 | 27 |
    28 | 29 |
    30 |

    Analyze Tweets

    31 |

    Run the MonkeyLearn analytics on the tweet table

    32 | 33 | <%= form_tag('/labels/create')do %> 34 | <%= button_tag(:class => 'btn') do %> 35 |   Categorize Tweets 36 | <% end %> 37 | <% end %> 38 | 39 | <%= form_tag('/api/categories/rank_tags')do %> 40 | <%= button_tag(:class => 'btn') do %> 41 |   Rank Hashtags and Update API 42 | <% end %> 43 | <% end %> 44 | 45 | 46 |
    47 | -------------------------------------------------------------------------------- /app/views/tweets/new.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |

    This is the page for making new tweets

    3 |

    It will eventually be rolled back into the the standard dashboard

    4 | 5 | 6 | <%= form_tag('/tweets/create')do %> 7 | <%= text_field_tag (:tweet_body) %> 8 | <%= button_tag(:class => 'btn') do %> 9 |   Tweet! 10 | 11 | <% end %> 12 | <% end %> 13 | 14 |
    -------------------------------------------------------------------------------- /app/views/users/index.html.erb: -------------------------------------------------------------------------------- 1 |

    Users#index

    2 |

    Find me in app/views/users/index.html.erb

    3 | -------------------------------------------------------------------------------- /app/views/users/show.html.erb: -------------------------------------------------------------------------------- 1 |

    Users#show

    2 |

    Find me in app/views/users/show.html.erb

    3 | -------------------------------------------------------------------------------- /bin/bundle: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 3 | load Gem.bin_path('bundler', 'bundle') 4 | -------------------------------------------------------------------------------- /bin/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | begin 3 | load File.expand_path("../spring", __FILE__) 4 | rescue LoadError 5 | end 6 | APP_PATH = File.expand_path('../../config/application', __FILE__) 7 | require_relative '../config/boot' 8 | require 'rails/commands' 9 | -------------------------------------------------------------------------------- /bin/rake: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | begin 3 | load File.expand_path("../spring", __FILE__) 4 | rescue LoadError 5 | end 6 | require_relative '../config/boot' 7 | require 'rake' 8 | Rake.application.run 9 | -------------------------------------------------------------------------------- /bin/setup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require 'pathname' 3 | 4 | # path to your application root. 5 | APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) 6 | 7 | Dir.chdir APP_ROOT do 8 | # This script is a starting point to setup your application. 9 | # Add necessary setup steps to this file: 10 | 11 | puts "== Installing dependencies ==" 12 | system "gem install bundler --conservative" 13 | system "bundle check || bundle install" 14 | 15 | # puts "\n== Copying sample files ==" 16 | # unless File.exist?("config/database.yml") 17 | # system "cp config/database.yml.sample config/database.yml" 18 | # end 19 | 20 | puts "\n== Preparing database ==" 21 | system "bin/rake db:setup" 22 | 23 | puts "\n== Removing old logs and tempfiles ==" 24 | system "rm -f log/*" 25 | system "rm -rf tmp/cache" 26 | 27 | puts "\n== Restarting application server ==" 28 | system "touch tmp/restart.txt" 29 | end 30 | -------------------------------------------------------------------------------- /bin/spring: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | # This file loads spring without using Bundler, in order to be fast. 4 | # It gets overwritten when you run the `spring binstub` command. 5 | 6 | unless defined?(Spring) 7 | require "rubygems" 8 | require "bundler" 9 | 10 | if match = Bundler.default_lockfile.read.match(/^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m) 11 | Gem.paths = { "GEM_PATH" => [Bundler.bundle_path.to_s, *Gem.path].uniq } 12 | gem "spring", match[1] 13 | require "spring/binstub" 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /config.ru: -------------------------------------------------------------------------------- 1 | # This file is used by Rack-based servers to start the application. 2 | 3 | require ::File.expand_path('../config/environment', __FILE__) 4 | run Rails.application 5 | -------------------------------------------------------------------------------- /config/application.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('../boot', __FILE__) 2 | 3 | require "rails" 4 | # Pick the frameworks you want: 5 | require "active_model/railtie" 6 | require "active_job/railtie" 7 | require "active_record/railtie" 8 | require "action_controller/railtie" 9 | require "action_mailer/railtie" 10 | require "action_view/railtie" 11 | require "sprockets/railtie" 12 | # require "rails/test_unit/railtie" 13 | 14 | # Require the gems listed in Gemfile, including any gems 15 | # you've limited to :test, :development, or :production. 16 | Bundler.require(*Rails.groups) 17 | 18 | module Hashrobot 19 | class Application < Rails::Application 20 | # Settings in config/environments/* take precedence over those specified here. 21 | # Application configuration should go into files in config/initializers 22 | # -- all .rb files in that directory are automatically loaded. 23 | 24 | # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. 25 | # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. 26 | # config.time_zone = 'Central Time (US & Canada)' 27 | 28 | # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. 29 | # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] 30 | # config.i18n.default_locale = :de 31 | 32 | # Do not swallow errors in after_commit/after_rollback callbacks. 33 | config.active_record.raise_in_transactional_callbacks = true 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /config/boot.rb: -------------------------------------------------------------------------------- 1 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 2 | 3 | require 'bundler/setup' # Set up gems listed in the Gemfile. 4 | -------------------------------------------------------------------------------- /config/database.yml: -------------------------------------------------------------------------------- 1 | # PostgreSQL. Versions 8.2 and up are supported. 2 | # 3 | # Install the pg driver: 4 | # gem install pg 5 | # On OS X with Homebrew: 6 | # gem install pg -- --with-pg-config=/usr/local/bin/pg_config 7 | # On OS X with MacPorts: 8 | # gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config 9 | # On Windows: 10 | # gem install pg 11 | # Choose the win32 build. 12 | # Install PostgreSQL and put its /bin directory on your path. 13 | # 14 | # Configure Using Gemfile 15 | # gem 'pg' 16 | # 17 | default: &default 18 | adapter: postgresql 19 | encoding: unicode 20 | # For details on connection pooling, see rails configuration guide 21 | # http://guides.rubyonrails.org/configuring.html#database-pooling 22 | pool: 5 23 | 24 | development: 25 | <<: *default 26 | database: hashrobot_development 27 | 28 | # The specified database role being used to connect to postgres. 29 | # To create additional roles in postgres see `$ createuser --help`. 30 | # When left blank, postgres will use the default role. This is 31 | # the same name as the operating system user that initialized the database. 32 | #username: hashrobot 33 | 34 | # The password associated with the postgres role (username). 35 | #password: 36 | 37 | # Connect on a TCP socket. Omitted by default since the client uses a 38 | # domain socket that doesn't need configuration. Windows does not have 39 | # domain sockets, so uncomment these lines. 40 | #host: localhost 41 | 42 | # The TCP port the server listens on. Defaults to 5432. 43 | # If your server runs on a different port number, change accordingly. 44 | #port: 5432 45 | 46 | # Schema search path. The server defaults to $user,public 47 | #schema_search_path: myapp,sharedapp,public 48 | 49 | # Minimum log levels, in increasing order: 50 | # debug5, debug4, debug3, debug2, debug1, 51 | # log, notice, warning, error, fatal, and panic 52 | # Defaults to warning. 53 | #min_messages: notice 54 | 55 | # Warning: The database defined as "test" will be erased and 56 | # re-generated from your development database when you run "rake". 57 | # Do not set this db to the same as development or production. 58 | test: 59 | <<: *default 60 | database: hashrobot_test 61 | 62 | # As with config/secrets.yml, you never want to store sensitive information, 63 | # like your database password, in your source code. If your source code is 64 | # ever seen by anyone, they now have access to your database. 65 | # 66 | # Instead, provide the password as a unix environment variable when you boot 67 | # the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database 68 | # for a full rundown on how to provide these environment variables in a 69 | # production deployment. 70 | # 71 | # On Heroku and other platform providers, you may have a full connection URL 72 | # available as an environment variable. For example: 73 | # 74 | # DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" 75 | # 76 | # You can use this database configuration with: 77 | # 78 | # production: 79 | # url: <%= ENV['DATABASE_URL'] %> 80 | # 81 | production: 82 | <<: *default 83 | database: hashrobot_production 84 | username: hashrobot 85 | password: <%= ENV['HASHROBOT_DATABASE_PASSWORD'] %> 86 | -------------------------------------------------------------------------------- /config/environment.rb: -------------------------------------------------------------------------------- 1 | # Load the Rails application. 2 | require File.expand_path('../application', __FILE__) 3 | 4 | # Initialize the Rails application. 5 | Rails.application.initialize! 6 | -------------------------------------------------------------------------------- /config/environments/development.rb: -------------------------------------------------------------------------------- 1 | Rails.application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb. 3 | 4 | # In the development environment your application's code is reloaded on 5 | # every request. This slows down response time but is perfect for development 6 | # since you don't have to restart the web server when you make code changes. 7 | config.cache_classes = false 8 | 9 | # Do not eager load code on boot. 10 | config.eager_load = false 11 | 12 | # Show full error reports and disable caching. 13 | config.consider_all_requests_local = true 14 | config.action_controller.perform_caching = false 15 | 16 | # Don't care if the mailer can't send. 17 | config.action_mailer.raise_delivery_errors = false 18 | 19 | # Print deprecation notices to the Rails logger. 20 | config.active_support.deprecation = :log 21 | 22 | # Raise an error on page load if there are pending migrations. 23 | config.active_record.migration_error = :page_load 24 | 25 | # Debug mode disables concatenation and preprocessing of assets. 26 | # This option may cause significant delays in view rendering with a large 27 | # number of complex assets. 28 | config.assets.debug = true 29 | 30 | # Asset digests allow you to set far-future HTTP expiration dates on all assets, 31 | # yet still be able to expire them through the digest params. 32 | config.assets.digest = true 33 | 34 | # Adds additional error checking when serving assets at runtime. 35 | # Checks for improperly declared sprockets dependencies. 36 | # Raises helpful error messages. 37 | config.assets.raise_runtime_errors = true 38 | 39 | # Raises error for missing translations 40 | # config.action_view.raise_on_missing_translations = true 41 | end 42 | -------------------------------------------------------------------------------- /config/environments/production.rb: -------------------------------------------------------------------------------- 1 | Rails.application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb. 3 | 4 | # Code is not reloaded between requests. 5 | config.cache_classes = true 6 | 7 | # Eager load code on boot. This eager loads most of Rails and 8 | # your application in memory, allowing both threaded web servers 9 | # and those relying on copy on write to perform better. 10 | # Rake tasks automatically ignore this option for performance. 11 | config.eager_load = true 12 | 13 | # Full error reports are disabled and caching is turned on. 14 | config.consider_all_requests_local = false 15 | config.action_controller.perform_caching = true 16 | 17 | # Enable Rack::Cache to put a simple HTTP cache in front of your application 18 | # Add `rack-cache` to your Gemfile before enabling this. 19 | # For large-scale production use, consider using a caching reverse proxy like 20 | # NGINX, varnish or squid. 21 | # config.action_dispatch.rack_cache = true 22 | 23 | # Disable serving static files from the `/public` folder by default since 24 | # Apache or NGINX already handles this. 25 | config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present? 26 | 27 | # Compress JavaScripts and CSS. 28 | config.assets.js_compressor = :uglifier 29 | # config.assets.css_compressor = :sass 30 | 31 | # Do not fallback to assets pipeline if a precompiled asset is missed. 32 | config.assets.compile = false 33 | 34 | # Asset digests allow you to set far-future HTTP expiration dates on all assets, 35 | # yet still be able to expire them through the digest params. 36 | config.assets.digest = true 37 | 38 | # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb 39 | 40 | # Specifies the header that your server uses for sending files. 41 | # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache 42 | # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX 43 | 44 | # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. 45 | # config.force_ssl = true 46 | 47 | # Use the lowest log level to ensure availability of diagnostic information 48 | # when problems arise. 49 | config.log_level = :debug 50 | 51 | # Prepend all log lines with the following tags. 52 | # config.log_tags = [ :subdomain, :uuid ] 53 | 54 | # Use a different logger for distributed setups. 55 | # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) 56 | 57 | # Use a different cache store in production. 58 | # config.cache_store = :mem_cache_store 59 | 60 | # Enable serving of images, stylesheets, and JavaScripts from an asset server. 61 | # config.action_controller.asset_host = 'http://assets.example.com' 62 | 63 | # Ignore bad email addresses and do not raise email delivery errors. 64 | # Set this to true and configure the email server for immediate delivery to raise delivery errors. 65 | # config.action_mailer.raise_delivery_errors = false 66 | 67 | # Enable locale fallbacks for I18n (makes lookups for any locale fall back to 68 | # the I18n.default_locale when a translation cannot be found). 69 | config.i18n.fallbacks = true 70 | 71 | # Send deprecation notices to registered listeners. 72 | config.active_support.deprecation = :notify 73 | 74 | # Use default logging formatter so that PID and timestamp are not suppressed. 75 | config.log_formatter = ::Logger::Formatter.new 76 | 77 | # Do not dump schema after migrations. 78 | config.active_record.dump_schema_after_migration = false 79 | end 80 | -------------------------------------------------------------------------------- /config/environments/test.rb: -------------------------------------------------------------------------------- 1 | Rails.application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb. 3 | 4 | # The test environment is used exclusively to run your application's 5 | # test suite. You never need to work with it otherwise. Remember that 6 | # your test database is "scratch space" for the test suite and is wiped 7 | # and recreated between test runs. Don't rely on the data there! 8 | config.cache_classes = true 9 | 10 | # Do not eager load code on boot. This avoids loading your whole application 11 | # just for the purpose of running a single test. If you are using a tool that 12 | # preloads Rails for running tests, you may have to set it to true. 13 | config.eager_load = false 14 | 15 | # Configure static file server for tests with Cache-Control for performance. 16 | config.serve_static_files = true 17 | config.static_cache_control = 'public, max-age=3600' 18 | 19 | # Show full error reports and disable caching. 20 | config.consider_all_requests_local = true 21 | config.action_controller.perform_caching = false 22 | 23 | # Raise exceptions instead of rendering exception templates. 24 | config.action_dispatch.show_exceptions = false 25 | 26 | # Disable request forgery protection in test environment. 27 | config.action_controller.allow_forgery_protection = false 28 | 29 | # Tell Action Mailer not to deliver emails to the real world. 30 | # The :test delivery method accumulates sent emails in the 31 | # ActionMailer::Base.deliveries array. 32 | config.action_mailer.delivery_method = :test 33 | 34 | # Randomize the order test cases are executed. 35 | config.active_support.test_order = :random 36 | 37 | # Print deprecation notices to the stderr. 38 | config.active_support.deprecation = :stderr 39 | 40 | # Raises error for missing translations 41 | # config.action_view.raise_on_missing_translations = true 42 | end 43 | -------------------------------------------------------------------------------- /config/initializers/assets.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Version of your assets, change this if you want to expire all your assets. 4 | Rails.application.config.assets.version = '1.0' 5 | 6 | # Add additional assets to the asset load path 7 | # Rails.application.config.assets.paths << Emoji.images_path 8 | 9 | # Precompile additional assets. 10 | # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. 11 | # Rails.application.config.assets.precompile += %w( search.js ) 12 | -------------------------------------------------------------------------------- /config/initializers/backtrace_silencers.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. 4 | # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } 5 | 6 | # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. 7 | # Rails.backtrace_cleaner.remove_silencers! 8 | -------------------------------------------------------------------------------- /config/initializers/cookies_serializer.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | Rails.application.config.action_dispatch.cookies_serializer = :json 4 | -------------------------------------------------------------------------------- /config/initializers/filter_parameter_logging.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Configure sensitive parameters which will be filtered from the log file. 4 | Rails.application.config.filter_parameters += [:password] 5 | -------------------------------------------------------------------------------- /config/initializers/inflections.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new inflection rules using the following format. Inflections 4 | # are locale specific, and you may define rules for as many different 5 | # locales as you wish. All of these examples are active by default: 6 | # ActiveSupport::Inflector.inflections(:en) do |inflect| 7 | # inflect.plural /^(ox)$/i, '\1en' 8 | # inflect.singular /^(ox)en/i, '\1' 9 | # inflect.irregular 'person', 'people' 10 | # inflect.uncountable %w( fish sheep ) 11 | # end 12 | 13 | # These inflection rules are supported but not enabled by default: 14 | # ActiveSupport::Inflector.inflections(:en) do |inflect| 15 | # inflect.acronym 'RESTful' 16 | # end 17 | -------------------------------------------------------------------------------- /config/initializers/mime_types.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new mime types for use in respond_to blocks: 4 | # Mime::Type.register "text/richtext", :rtf 5 | -------------------------------------------------------------------------------- /config/initializers/omniauth.rb: -------------------------------------------------------------------------------- 1 | Rails.application.config.middleware.use OmniAuth::Builder do 2 | provider :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET'] 3 | 4 | OmniAuth.config.on_failure = Proc.new do |env| 5 | SessionsController.action(:auth_failure).call(env) 6 | end 7 | 8 | end 9 | -------------------------------------------------------------------------------- /config/initializers/session_store.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | Rails.application.config.session_store :cookie_store, key: '_hashrobot_session' 4 | -------------------------------------------------------------------------------- /config/initializers/twitter_credentials.rb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/config/initializers/twitter_credentials.rb -------------------------------------------------------------------------------- /config/initializers/wrap_parameters.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # This file contains settings for ActionController::ParamsWrapper which 4 | # is enabled by default. 5 | 6 | # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. 7 | ActiveSupport.on_load(:action_controller) do 8 | wrap_parameters format: [:json] if respond_to?(:wrap_parameters) 9 | end 10 | 11 | # To enable root element in JSON for ActiveRecord objects. 12 | # ActiveSupport.on_load(:active_record) do 13 | # self.include_root_in_json = true 14 | # end 15 | -------------------------------------------------------------------------------- /config/locales/en.yml: -------------------------------------------------------------------------------- 1 | # Files in the config/locales directory are used for internationalization 2 | # and are automatically loaded by Rails. If you want to use locales other 3 | # than English, add the necessary files in this directory. 4 | # 5 | # To use the locales, use `I18n.t`: 6 | # 7 | # I18n.t 'hello' 8 | # 9 | # In views, this is aliased to just `t`: 10 | # 11 | # <%= t('hello') %> 12 | # 13 | # To use a different locale, set it with `I18n.locale`: 14 | # 15 | # I18n.locale = :es 16 | # 17 | # This would use the information in config/locales/es.yml. 18 | # 19 | # To learn more, please read the Rails Internationalization guide 20 | # available at http://guides.rubyonrails.org/i18n.html. 21 | 22 | en: 23 | hello: "Hello world" 24 | -------------------------------------------------------------------------------- /config/routes.rb: -------------------------------------------------------------------------------- 1 | Rails.application.routes.draw do 2 | 3 | namespace :api do 4 | 5 | resources :categories, except: [:new, :edit] 6 | end 7 | 8 | #send users to the welcome page upon arrival 9 | root 'pages#index' 10 | 11 | #basic static pages, welcome, about, and contact 12 | get 'pages/index' => 'pages#index', as: :welcome 13 | 14 | get 'pages/about' => 'pages#about', as: :about 15 | 16 | get 'pages/dashboard' => 'pages#dashboard', as: :dashboard 17 | 18 | get 'pages/hashboard' => 'pages#hashboard', as: :hashboard 19 | 20 | #create a new session for twitter oauth 21 | get '/auth/:provider/callback' => 'sessions#create', as: :twitter 22 | 23 | #delete session for twitter oauth 24 | delete '/logout' => 'sessions#destroy' 25 | 26 | get 'labels/index' => 'labels#index', as: :labels 27 | 28 | get 'labels/show/:id' => 'labels#show', as: :label 29 | 30 | get 'labels/new' => 'labels#new', as: :new_label 31 | 32 | post 'labels/create' => 'labels#create' 33 | 34 | post 'api/categories/rank_tags' => 'api/categories#rank_tags' 35 | 36 | #get all the current tweet in our db 37 | get 'tweets/index' => 'tweets#index', as: :tweets 38 | 39 | #compose a new tweet 40 | get 'tweets/new' => 'tweets#new', as: :new_tweet 41 | 42 | #create the tweet on your twitter account 43 | post 'tweets/create' => 'tweets#create' 44 | 45 | #hit the twitter REST API and get some tweets for the db 46 | post 'tweets/get_latest' => 'tweets#get_latest' 47 | 48 | post 'tweets/get_latest' => 'tweets#get_latest' 49 | end 50 | -------------------------------------------------------------------------------- /config/secrets.yml: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Your secret key is used for verifying the integrity of signed cookies. 4 | # If you change this key, all old signed cookies will become invalid! 5 | 6 | # Make sure the secret is at least 30 characters and all random, 7 | # no regular words or you'll be exposed to dictionary attacks. 8 | # You can use `rake secret` to generate a secure secret key. 9 | 10 | # Make sure the secrets in this file are kept private 11 | # if you're sharing your code publicly. 12 | 13 | development: 14 | secret_key_base: b9b61bb5806a87d7d8a343d26c7489a6b24ca12d50edfc6085e8999e4d9e8143c0a75592a7aacbabefd818b7ea09e0a8b6620a851d32cf464f75895a3d3e1cec 15 | 16 | test: 17 | secret_key_base: 2889a8e881a201f4acd4a2af77cf443a3565f0bb6cdabac6f0334c2c61944e5ea50771c941d11feef6bbd75d61f8b7807fa684be9dbf124a19c2861b0749436e 18 | 19 | # Do not keep production secrets in the repository, 20 | # instead read values from the environment. 21 | production: 22 | secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> 23 | -------------------------------------------------------------------------------- /coverage/.last_run.json: -------------------------------------------------------------------------------- 1 | { 2 | "result": { 3 | "covered_percent": 59.42 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /coverage/.resultset.json: -------------------------------------------------------------------------------- 1 | { 2 | "RSpec": { 3 | "coverage": { 4 | "/Users/judyair/bighippo/projects/hashrobot/hashrobot/app/helpers/application_helper.rb": [ 5 | 1, 6 | null 7 | ], 8 | "/Users/judyair/bighippo/projects/hashrobot/hashrobot/app/helpers/categories_helper.rb": [ 9 | 1, 10 | null 11 | ], 12 | "/Users/judyair/bighippo/projects/hashrobot/hashrobot/app/helpers/static_helper.rb": [ 13 | 1, 14 | null 15 | ], 16 | "/Users/judyair/bighippo/projects/hashrobot/hashrobot/app/helpers/tweets_helper.rb": [ 17 | 1, 18 | null 19 | ], 20 | "/Users/judyair/bighippo/projects/hashrobot/hashrobot/app/helpers/users_helper.rb": [ 21 | 1, 22 | null 23 | ], 24 | "/Users/judyair/bighippo/projects/hashrobot/hashrobot/app/controllers/pages_controller.rb": [ 25 | 1, 26 | 1, 27 | null, 28 | null, 29 | 1, 30 | null, 31 | null 32 | ], 33 | "/Users/judyair/bighippo/projects/hashrobot/hashrobot/app/controllers/application_controller.rb": [ 34 | 1, 35 | null, 36 | null, 37 | 1, 38 | null, 39 | 1, 40 | null, 41 | 1, 42 | null, 43 | 1, 44 | 0, 45 | null, 46 | null, 47 | null, 48 | 1, 49 | 0, 50 | 0, 51 | 0, 52 | null, 53 | null, 54 | null, 55 | null, 56 | null 57 | ], 58 | "/Users/judyair/bighippo/projects/hashrobot/hashrobot/app/controllers/tweets_controller.rb": [ 59 | 1, 60 | null, 61 | 1, 62 | null, 63 | 1, 64 | null, 65 | 0, 66 | null, 67 | null, 68 | 1, 69 | null, 70 | null, 71 | null, 72 | 1, 73 | null, 74 | null, 75 | null, 76 | 1, 77 | null, 78 | null, 79 | 0, 80 | null, 81 | 0, 82 | null, 83 | 0, 84 | null, 85 | null, 86 | 0, 87 | null, 88 | 0, 89 | null, 90 | null, 91 | null, 92 | 0, 93 | null, 94 | null, 95 | 1, 96 | null, 97 | 0, 98 | 0, 99 | null, 100 | null, 101 | 1, 102 | null, 103 | 1, 104 | null, 105 | 0, 106 | null, 107 | null, 108 | 1, 109 | null, 110 | 0, 111 | null, 112 | 0, 113 | 0, 114 | 0, 115 | 0, 116 | null, 117 | null, 118 | null 119 | ], 120 | "/Users/judyair/bighippo/projects/hashrobot/hashrobot/app/controllers/users_controller.rb": [ 121 | 1, 122 | 1, 123 | null, 124 | null, 125 | 1, 126 | null, 127 | null 128 | ], 129 | "/Users/judyair/bighippo/projects/hashrobot/hashrobot/app/models/category.rb": [ 130 | 1, 131 | 1, 132 | 1, 133 | null 134 | ], 135 | "/Users/judyair/bighippo/projects/hashrobot/hashrobot/app/models/category_tag.rb": [ 136 | 1, 137 | 1, 138 | 1, 139 | null 140 | ], 141 | "/Users/judyair/bighippo/projects/hashrobot/hashrobot/app/models/label.rb": [ 142 | 1, 143 | null 144 | ], 145 | "/Users/judyair/bighippo/projects/hashrobot/hashrobot/app/models/tag.rb": [ 146 | 1, 147 | 1, 148 | 1, 149 | null 150 | ], 151 | "/Users/judyair/bighippo/projects/hashrobot/hashrobot/app/models/tweet.rb": [ 152 | 1, 153 | null, 154 | 1, 155 | null, 156 | null 157 | ], 158 | "/Users/judyair/bighippo/projects/hashrobot/hashrobot/app/models/user.rb": [ 159 | 1, 160 | null, 161 | 1, 162 | null, 163 | 0, 164 | 0, 165 | 0, 166 | 0, 167 | 0, 168 | 0, 169 | 0, 170 | 0, 171 | 0, 172 | null, 173 | null 174 | ] 175 | }, 176 | "timestamp": 1435369033 177 | } 178 | } -------------------------------------------------------------------------------- /coverage/.resultset.json.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/.resultset.json.lock -------------------------------------------------------------------------------- /coverage/assets/0.10.0/colorbox/border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/colorbox/border.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/colorbox/controls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/colorbox/controls.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/colorbox/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/colorbox/loading.gif -------------------------------------------------------------------------------- /coverage/assets/0.10.0/colorbox/loading_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/colorbox/loading_background.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/favicon_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/favicon_green.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/favicon_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/favicon_red.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/favicon_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/favicon_yellow.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/loading.gif -------------------------------------------------------------------------------- /coverage/assets/0.10.0/magnify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/magnify.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/smoothness/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/smoothness/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/smoothness/images/ui-icons_2e83ff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/smoothness/images/ui-icons_2e83ff_256x240.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/smoothness/images/ui-icons_454545_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/smoothness/images/ui-icons_454545_256x240.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/smoothness/images/ui-icons_888888_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/smoothness/images/ui-icons_888888_256x240.png -------------------------------------------------------------------------------- /coverage/assets/0.10.0/smoothness/images/ui-icons_cd0a0a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/coverage/assets/0.10.0/smoothness/images/ui-icons_cd0a0a_256x240.png -------------------------------------------------------------------------------- /db/migrate/20150612061607_create_users.rb: -------------------------------------------------------------------------------- 1 | class CreateUsers < ActiveRecord::Migration 2 | def change 3 | create_table :users do |t| 4 | t.string :provider, null: false 5 | t.string :uid, null: false 6 | t.string :name 7 | t.string :location 8 | t.string :image_url 9 | t.string :url 10 | t.string :token 11 | t.string :secret 12 | 13 | t.timestamps null: false 14 | end 15 | add_index :users, :provider 16 | add_index :users, :uid 17 | add_index :users, [:provider, :uid], unique: true 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /db/migrate/20150617190952_create_tweets.rb: -------------------------------------------------------------------------------- 1 | class CreateTweets < ActiveRecord::Migration 2 | def self.up 3 | create_table :tweets do |t| 4 | t.string :content 5 | t.datetime :created 6 | end 7 | end 8 | 9 | def self.down 10 | drop_table :tweets 11 | end 12 | end -------------------------------------------------------------------------------- /db/migrate/20150619013447_create_categories.rb: -------------------------------------------------------------------------------- 1 | class CreateCategories < ActiveRecord::Migration 2 | def change 3 | create_table :categories do |t| 4 | 5 | t.timestamps null: false 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /db/migrate/20150619184808_create_tags.rb: -------------------------------------------------------------------------------- 1 | class CreateTags < ActiveRecord::Migration 2 | def change 3 | create_table :tags do |t| 4 | 5 | t.timestamps null: false 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /db/migrate/20150623012139_create_category_tags.rb: -------------------------------------------------------------------------------- 1 | class CreateCategoryTags < ActiveRecord::Migration 2 | def change 3 | create_table :category_tags do |t| 4 | t.references :category, index: true, foreign_key: true 5 | t.references :tag, index: true, foreign_key: true 6 | 7 | t.timestamps null: false 8 | end 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /db/migrate/20150623012403_add_category_id_to_tags.rb: -------------------------------------------------------------------------------- 1 | class AddCategoryIdToTags < ActiveRecord::Migration 2 | def change 3 | add_column :tags, :category_id, :integer 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20150623012552_add_names_to_category_and_tags.rb: -------------------------------------------------------------------------------- 1 | class AddNamesToCategoryAndTags < ActiveRecord::Migration 2 | def change 3 | add_column :categories, :name, :string 4 | add_column :tags, :name, :string 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20150623050908_create_labels.rb: -------------------------------------------------------------------------------- 1 | class CreateLabels < ActiveRecord::Migration 2 | def change 3 | create_table :labels do |t| 4 | t.integer :tweet_id 5 | t.string :label 6 | t.float :probability 7 | t.string :hashtag, array:true, default:[] 8 | t.integer :count 9 | 10 | t.timestamps null: false 11 | end 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /db/migrate/20150626173834_add_rank_to_tags.rb: -------------------------------------------------------------------------------- 1 | class AddRankToTags < ActiveRecord::Migration 2 | def change 3 | add_column :tags, :rank, :float 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/schema.rb: -------------------------------------------------------------------------------- 1 | # encoding: UTF-8 2 | # This file is auto-generated from the current state of the database. Instead 3 | # of editing this file, please use the migrations feature of Active Record to 4 | # incrementally modify your database, and then regenerate this schema definition. 5 | # 6 | # Note that this schema.rb definition is the authoritative source for your 7 | # database schema. If you need to create the application database on another 8 | # system, you should be using db:schema:load, not running all the migrations 9 | # from scratch. The latter is a flawed and unsustainable approach (the more migrations 10 | # you'll amass, the slower it'll run and the greater likelihood for issues). 11 | # 12 | # It's strongly recommended that you check this file into your version control system. 13 | 14 | ActiveRecord::Schema.define(version: 20150626173834) do 15 | 16 | # These are extensions that must be enabled in order to support this database 17 | enable_extension "plpgsql" 18 | 19 | create_table "categories", force: :cascade do |t| 20 | t.datetime "created_at", null: false 21 | t.datetime "updated_at", null: false 22 | t.string "name" 23 | end 24 | 25 | create_table "category_tags", force: :cascade do |t| 26 | t.integer "category_id" 27 | t.integer "tag_id" 28 | t.datetime "created_at", null: false 29 | t.datetime "updated_at", null: false 30 | end 31 | 32 | add_index "category_tags", ["category_id"], name: "index_category_tags_on_category_id", using: :btree 33 | add_index "category_tags", ["tag_id"], name: "index_category_tags_on_tag_id", using: :btree 34 | 35 | create_table "labels", force: :cascade do |t| 36 | t.integer "tweet_id" 37 | t.string "label" 38 | t.float "probability" 39 | t.string "hashtag", default: [], array: true 40 | t.integer "count" 41 | t.datetime "created_at", null: false 42 | t.datetime "updated_at", null: false 43 | end 44 | 45 | create_table "tags", force: :cascade do |t| 46 | t.datetime "created_at", null: false 47 | t.datetime "updated_at", null: false 48 | t.integer "category_id" 49 | t.string "name" 50 | t.float "rank" 51 | end 52 | 53 | create_table "tweets", force: :cascade do |t| 54 | t.string "content" 55 | t.datetime "created" 56 | end 57 | 58 | create_table "users", force: :cascade do |t| 59 | t.string "provider", null: false 60 | t.string "uid", null: false 61 | t.string "name" 62 | t.string "location" 63 | t.string "image_url" 64 | t.string "url" 65 | t.string "token" 66 | t.string "secret" 67 | t.datetime "created_at", null: false 68 | t.datetime "updated_at", null: false 69 | end 70 | 71 | add_index "users", ["provider", "uid"], name: "index_users_on_provider_and_uid", unique: true, using: :btree 72 | add_index "users", ["provider"], name: "index_users_on_provider", using: :btree 73 | add_index "users", ["uid"], name: "index_users_on_uid", using: :btree 74 | 75 | add_foreign_key "category_tags", "categories" 76 | add_foreign_key "category_tags", "tags" 77 | end 78 | -------------------------------------------------------------------------------- /db/seeds.rb: -------------------------------------------------------------------------------- 1 | # This file should contain all the record creation needed to seed the database with its default values. 2 | # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). 3 | # 4 | # Examples: 5 | # 6 | # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) 7 | # Mayor.create(name: 'Emanuel', city: cities.first) 8 | 9 | Category.create([ 10 | { name: "Animals" }, 11 | { name: "Beauty & Style"}, 12 | { name: "Business & Finance"}, 13 | { name: "Computers & Internet"}, 14 | { name: "Consumer Electronics"}, 15 | { name: "Education"}, 16 | { name: "Entertainment & Recreation"}, 17 | { name: "Environment"}, 18 | { name: "Food & Drink"}, 19 | { name: "Gardening"}, 20 | { name: "Health & Medicine"}, 21 | { name: "Home"}, 22 | { name: "Humanities"}, 23 | { name: "Science & Mathematics"}, 24 | { name: "Society"}, 25 | { name: "Travel"} 26 | ]) -------------------------------------------------------------------------------- /lib/assets/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/lib/assets/.keep -------------------------------------------------------------------------------- /lib/tasks/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/lib/tasks/.keep -------------------------------------------------------------------------------- /lib/tasks/dowload.tweets.rake: -------------------------------------------------------------------------------- 1 | task :download_tweets => :environment do 2 | Tweet.get_latest 3 | end -------------------------------------------------------------------------------- /log/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/log/.keep -------------------------------------------------------------------------------- /public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The page you were looking for doesn't exist (404) 5 | 6 | 91 | 92 | 93 | 94 | 95 |
    96 | 99 |
    100 | 101 |
    102 |
    103 | 404 104 |
    105 | 106 |
    107 |
    108 |

    The page you were looking for doesn't exist.

    109 |

    You may have mistyped the address or the page may have moved.

    110 |
    111 |
    112 | 113 | 114 | -------------------------------------------------------------------------------- /public/422.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The page you were looking for doesn't exist (404) 5 | 6 | 90 | 91 | 92 | 93 | 94 |
    95 | 98 |
    99 | 100 | 101 |
    102 |
    103 | 422 104 |
    105 | 106 | 107 | 108 | 109 | 110 |
    111 |
    112 |

    The change you wanted was rejected.

    113 |

    Maybe you tried to change something you didn't have access to.

    114 |
    115 |
    116 | 117 | 118 | -------------------------------------------------------------------------------- /public/500.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The page you were looking for doesn't exist (404) 5 | 6 | 90 | 91 | 92 | 93 | 94 |
    95 | 98 |
    99 | 100 | 101 |
    102 |
    103 | 500 104 |
    105 | 106 | 107 | 108 | 109 | 110 |
    111 |
    112 |

    Something went wrong.

    113 |

    You may have mistyped the address or the page may have moved.

    114 |
    115 |
    116 | 117 | 118 | -------------------------------------------------------------------------------- /public/assets/.sprockets-manifest-18b901353a0fb0ddce332dfbe306440e.json: -------------------------------------------------------------------------------- 1 | {"files":{"chris_head-8ab4ab384675d5c657b933f169d226b9086490641c265aca7fcb13ffa5bbe85d.png":{"logical_path":"chris_head.png","mtime":"2015-08-30T19:13:05-07:00","size":17515,"digest":"8ab4ab384675d5c657b933f169d226b9086490641c265aca7fcb13ffa5bbe85d","integrity":"sha256-irSrOEZ11cZXuTPxadImuQhkkGQcJlrKf8sT/6W76F0="},"colorful-robots-fbd326709c16b50742a5ad6e289712bdd71aa1ac1888a006a954a4137af91860.jpg":{"logical_path":"colorful-robots.jpg","mtime":"2015-08-30T19:13:05-07:00","size":3758453,"digest":"fbd326709c16b50742a5ad6e289712bdd71aa1ac1888a006a954a4137af91860","integrity":"sha256-+9MmcJwWtQdCpa1uKJcSvdcaoawYiKAGqVSkE3r5GGA="},"creators_bg-8eb9572f519e8a6d681685f2e0428c6217bcaea9f006b7ac7093fb17f819d3eb.png":{"logical_path":"creators_bg.png","mtime":"2015-08-30T19:13:05-07:00","size":132768,"digest":"8eb9572f519e8a6d681685f2e0428c6217bcaea9f006b7ac7093fb17f819d3eb","integrity":"sha256-jrlXL1Geim1oFoXy4EKMYhe8rqnwBrescJP7F/gZ0+s="},"hash_lg-c589634864b6ed7484a1bc648dc23b22d9749755b128634dd1636941c97bc040.png":{"logical_path":"hash_lg.png","mtime":"2015-06-20T16:23:44-07:00","size":24633,"digest":"c589634864b6ed7484a1bc648dc23b22d9749755b128634dd1636941c97bc040","integrity":"sha256-xYljSGS27XSEobxkjcI7Itl0l1WxKGNN0WNpQcl7wEA="},"hashrobot-0e9b58c6120bcd4fa59e1388eced561309b9ab5488d9f556593bf271d4db970c.png":{"logical_path":"hashrobot.png","mtime":"2015-06-10T19:45:58-07:00","size":53350,"digest":"0e9b58c6120bcd4fa59e1388eced561309b9ab5488d9f556593bf271d4db970c","integrity":"sha256-DptYxhILzU+lnhOI7O1WEwm5q1SI2fVWWTvycdTblww="},"hashrobot_sm-ea4ce03feea39c6cffc1e4e5c8d706381381b1696096439f899bbbfa6be7638c.png":{"logical_path":"hashrobot_sm.png","mtime":"2015-06-10T19:45:58-07:00","size":5409,"digest":"ea4ce03feea39c6cffc1e4e5c8d706381381b1696096439f899bbbfa6be7638c","integrity":"sha256-6kzgP+6jnGz/weTlyNcGOBOBsWlglkOfiZu7+mvnY4w="},"hashrobot_xs-8a69c3eb3ea4ba1a2c306c1bc5c086a00b489678e36ceed8cafe931c8572588f.png":{"logical_path":"hashrobot_xs.png","mtime":"2015-06-18T15:42:10-07:00","size":4633,"digest":"8a69c3eb3ea4ba1a2c306c1bc5c086a00b489678e36ceed8cafe931c8572588f","integrity":"sha256-imnD6z6kuhosMGwbxcCGoAtIlnjjbO7Yyv6THIVyWI8="},"jeff_head-8fb554e986e455610ded735230de57fc250ecb031e7c15271e8cd13222789e2a.png":{"logical_path":"jeff_head.png","mtime":"2015-08-30T19:13:05-07:00","size":8136,"digest":"8fb554e986e455610ded735230de57fc250ecb031e7c15271e8cd13222789e2a","integrity":"sha256-j7VU6YbkVWEN7XNSMN5X/CUOywMefBUnHozRMiJ4nio="},"robot_chris-1cceedb844f08b2782e14556a5af42791d7bc7fdad776efc881d16d7cfa19465.png":{"logical_path":"robot_chris.png","mtime":"2015-08-30T19:13:05-07:00","size":66693,"digest":"1cceedb844f08b2782e14556a5af42791d7bc7fdad776efc881d16d7cfa19465","integrity":"sha256-HM7tuETwiyeC4UVWpa9CeR17x/2td278iB0W18+hlGU="},"robot_jeff-6d64d1898aae49600a2f2af830d04befde74961af0def332d2a89bb44ce0d307.png":{"logical_path":"robot_jeff.png","mtime":"2015-08-30T19:13:05-07:00","size":27295,"digest":"6d64d1898aae49600a2f2af830d04befde74961af0def332d2a89bb44ce0d307","integrity":"sha256-bWTRiYquSWAKLyr4MNBL7950lhrw3vMy0qibtEzg0wc="},"robot_new_black-7e516331319100124f552f8f7340e7cead891b161ed086ce9a7cdcae38085779.png":{"logical_path":"robot_new_black.png","mtime":"2015-08-30T19:13:05-07:00","size":32741,"digest":"7e516331319100124f552f8f7340e7cead891b161ed086ce9a7cdcae38085779","integrity":"sha256-flFjMTGRABJPVS+Pc0Dnzq2JGxYe0IbOmnzcrjgIV3k="},"robot_ryan-25f8772ac61b126fa240b3ce4184174c5fac2c827e185c34b1f7d30096309b6e.png":{"logical_path":"robot_ryan.png","mtime":"2015-08-30T19:13:05-07:00","size":67269,"digest":"25f8772ac61b126fa240b3ce4184174c5fac2c827e185c34b1f7d30096309b6e","integrity":"sha256-Jfh3KsYbEm+iQLPOQYQXTF+sLIJ+GFw0sffTAJYwm24="},"robot_white-c15d8fa318251b6646affc53dd8574f936bf8f629e3edeb85edd2c50a139db22.png":{"logical_path":"robot_white.png","mtime":"2015-08-30T19:13:05-07:00","size":94489,"digest":"c15d8fa318251b6646affc53dd8574f936bf8f629e3edeb85edd2c50a139db22","integrity":"sha256-wV2PoxglG2ZGr/xT3YV0+Ta/j2KePt64Xt0sUKE52yI="},"ryan_head-e072d72d37b50f2074078d9fcbe341b37d20156a08a9580d17f61c902299768a.png":{"logical_path":"ryan_head.png","mtime":"2015-08-30T19:13:05-07:00","size":20977,"digest":"e072d72d37b50f2074078d9fcbe341b37d20156a08a9580d17f61c902299768a","integrity":"sha256-4HLXLTe1DyB0B42fy+NBs30gFWoIqVgNF/YckCKZdoo="},"sky-07e0ed834c8b26fe0a46590cf637d2398d96de4b78f25a152b5bbb9a67344c8d.png":{"logical_path":"sky.png","mtime":"2015-08-30T19:13:06-07:00","size":2519523,"digest":"07e0ed834c8b26fe0a46590cf637d2398d96de4b78f25a152b5bbb9a67344c8d","integrity":"sha256-B+Dtg0yLJv4KRlkM9jfSOY2W3kt48loVK1u7mmc0TI0="},"sky2-297bc89e9faf9e485174032a56874d613613c3d6e5d99c9c23b6170d61456b94.jpg":{"logical_path":"sky2.jpg","mtime":"2015-08-30T19:13:06-07:00","size":176349,"digest":"297bc89e9faf9e485174032a56874d613613c3d6e5d99c9c23b6170d61456b94","integrity":"sha256-KXvInp+vnkhRdAMqVodNYTYTw9bl2ZycI7YXDWFFa5Q="},"application-4708c2f4443cf620b44d2bddd22fba33a5a6518c7dac2867b000b5b1d17f20ae.js":{"logical_path":"application.js","mtime":"2015-06-28T19:13:07-07:00","size":244597,"digest":"4708c2f4443cf620b44d2bddd22fba33a5a6518c7dac2867b000b5b1d17f20ae","integrity":"sha256-RwjC9EQ89iC0TSvd0i+6M6WmUYx9rChnsAC1sdF/IK4="},"application-4de68cf6d7c04e00bb523da622508af6cf21d0c0e6a5e760a00d7d0280eded8b.css":{"logical_path":"application.css","mtime":"2015-06-28T19:11:22-07:00","size":199480,"digest":"4de68cf6d7c04e00bb523da622508af6cf21d0c0e6a5e760a00d7d0280eded8b","integrity":"sha256-TeaM9tfATgC7Uj2mIlCK9s8h0MDmpedgoA19AoDt7Ys="},"material-design-icons/LICENSE-04051e0a14494a4997cedd4e371ccc9e9262fcd278c9a96129c36b4277c4129d.txt":{"logical_path":"material-design-icons/LICENSE.txt","mtime":"2015-06-11T08:24:58-07:00","size":20164,"digest":"04051e0a14494a4997cedd4e371ccc9e9262fcd278c9a96129c36b4277c4129d","integrity":"sha256-BAUeChRJSkmXzt1ONxzMnpJi/NJ4yalhKcNrQnfEEp0="},"material-design-icons/Material-Design-Icons-7628d8cc2f0994b135a1419faa1db2949764b7b28070c39ef81fffecc5a041bb.eot":{"logical_path":"material-design-icons/Material-Design-Icons.eot","mtime":"2015-06-11T08:24:58-07:00","size":102112,"digest":"7628d8cc2f0994b135a1419faa1db2949764b7b28070c39ef81fffecc5a041bb","integrity":"sha256-dijYzC8JlLE1oUGfqh2ylJdkt7KAcMOe+B//7MWgQbs="},"material-design-icons/Material-Design-Icons-c3e402679b8c6f20c98e6538749608091e6823ca0e18e927dd7e43ae02767746.svg":{"logical_path":"material-design-icons/Material-Design-Icons.svg","mtime":"2015-06-11T08:24:58-07:00","size":330095,"digest":"c3e402679b8c6f20c98e6538749608091e6823ca0e18e927dd7e43ae02767746","integrity":"sha256-w+QCZ5uMbyDJjmU4dJYICR5oI8oOGOkn3X5DrgJ2d0Y="},"material-design-icons/Material-Design-Icons-5d97606a426dbb32cb0236483d32e8746b928ab979be7b809db9d3113e6e35df.ttf":{"logical_path":"material-design-icons/Material-Design-Icons.ttf","mtime":"2015-06-11T08:24:58-07:00","size":101892,"digest":"5d97606a426dbb32cb0236483d32e8746b928ab979be7b809db9d3113e6e35df","integrity":"sha256-XZdgakJtuzLLAjZIPTLodGuSirl5vnuAnbnTET5uNd8="},"material-design-icons/Material-Design-Icons-be00e19b662046cb8f2eb6eb86e4689edeefb0c003f6a215df9c22f0e15e16ad.woff":{"logical_path":"material-design-icons/Material-Design-Icons.woff","mtime":"2015-06-11T08:24:58-07:00","size":101968,"digest":"be00e19b662046cb8f2eb6eb86e4689edeefb0c003f6a215df9c22f0e15e16ad","integrity":"sha256-vgDhm2YgRsuPLrbrhuRont7vsMAD9qIV35wi8OFeFq0="},"material-design-icons/Material-Design-Icons-4efd86423405eefbcbe28d543fc5db242d747b47f8b201f6d8bfdd091ff3bbdd.woff2":{"logical_path":"material-design-icons/Material-Design-Icons.woff2","mtime":"2015-06-11T08:24:58-07:00","size":33220,"digest":"4efd86423405eefbcbe28d543fc5db242d747b47f8b201f6d8bfdd091ff3bbdd","integrity":"sha256-Tv2GQjQF7vvL4o1UP8XbJC10e0f4sgH22L/dCR/zu90="},"roboto/Roboto-Bold-594d74a49e307be7cc9e1ee5f1023684e6820cf11bcc968bee590391e1ad5a5a.ttf":{"logical_path":"roboto/Roboto-Bold.ttf","mtime":"2015-06-11T08:24:58-07:00","size":127744,"digest":"594d74a49e307be7cc9e1ee5f1023684e6820cf11bcc968bee590391e1ad5a5a","integrity":"sha256-WU10pJ4we+fMnh7l8QI2hOaCDPEbzJaL7lkDkeGtWlo="},"roboto/Roboto-Bold-e7cbaf29c3812b80577cb845b5d359486242338f25620ba65260e265464fe359.woff":{"logical_path":"roboto/Roboto-Bold.woff","mtime":"2015-06-11T08:24:58-07:00","size":62876,"digest":"e7cbaf29c3812b80577cb845b5d359486242338f25620ba65260e265464fe359","integrity":"sha256-58uvKcOBK4BXfLhFtdNZSGJCM48lYgumUmDiZUZP41k="},"roboto/Roboto-Bold-8b84b2abc336ee61f48a28a697b6ace2333ea5f1868aa15d5aeb2c7beac6d716.woff2":{"logical_path":"roboto/Roboto-Bold.woff2","mtime":"2015-06-11T08:24:58-07:00","size":49976,"digest":"8b84b2abc336ee61f48a28a697b6ace2333ea5f1868aa15d5aeb2c7beac6d716","integrity":"sha256-i4Syq8M27mH0iiiml7as4jM+pfGGiqFdWusse+rG1xY="},"roboto/Roboto-Light-ee4352049603e5960550f55444ad720d8d4ce322c0dcba1afc77de78c430d0d5.ttf":{"logical_path":"roboto/Roboto-Light.ttf","mtime":"2015-06-11T08:24:58-07:00","size":126792,"digest":"ee4352049603e5960550f55444ad720d8d4ce322c0dcba1afc77de78c430d0d5","integrity":"sha256-7kNSBJYD5ZYFUPVURK1yDY1M4yLA3Loa/HfeeMQw0NU="},"roboto/Roboto-Light-2cbb012f1d36c09d3f17100ef2cf8213cbd429d9e519dff536c12ed6f07a0d25.woff":{"logical_path":"roboto/Roboto-Light.woff","mtime":"2015-06-11T08:24:58-07:00","size":62316,"digest":"2cbb012f1d36c09d3f17100ef2cf8213cbd429d9e519dff536c12ed6f07a0d25","integrity":"sha256-LLsBLx02wJ0/FxAO8s+CE8vUKdnlGd/1NsEu1vB6DSU="},"roboto/Roboto-Light-94a0ac8d73bb60a9cbe27a4fa36669104f6ffa37c8ff2df29313a6c0d3b64a75.woff2":{"logical_path":"roboto/Roboto-Light.woff2","mtime":"2015-06-11T08:24:58-07:00","size":49380,"digest":"94a0ac8d73bb60a9cbe27a4fa36669104f6ffa37c8ff2df29313a6c0d3b64a75","integrity":"sha256-lKCsjXO7YKnL4npPo2ZpEE9v+jfI/y3ykxOmwNO2SnU="},"roboto/Roboto-Medium-6e2ec5c5f89e4ce302bb93b46cb7cc336236501de17348e284878914c5e0e723.ttf":{"logical_path":"roboto/Roboto-Medium.ttf","mtime":"2015-06-11T08:24:58-07:00","size":127488,"digest":"6e2ec5c5f89e4ce302bb93b46cb7cc336236501de17348e284878914c5e0e723","integrity":"sha256-bi7FxfieTOMCu5O0bLfMM2I2UB3hc0jihIeJFMXg5yM="},"roboto/Roboto-Medium-72841a4c4171b13ab1edf2c8f8046f0958f2ff608ce4e0d568dd5c6319f8a933.woff":{"logical_path":"roboto/Roboto-Medium.woff","mtime":"2015-06-11T08:24:58-07:00","size":62980,"digest":"72841a4c4171b13ab1edf2c8f8046f0958f2ff608ce4e0d568dd5c6319f8a933","integrity":"sha256-coQaTEFxsTqx7fLI+ARvCVjy/2CM5ODVaN1cYxn4qTM="},"roboto/Roboto-Medium-1cd5c4b37938d932110ec043ce1cc766d18cacf7a4e7cffa6a539855d5bdc08d.woff2":{"logical_path":"roboto/Roboto-Medium.woff2","mtime":"2015-06-11T08:24:58-07:00","size":50224,"digest":"1cd5c4b37938d932110ec043ce1cc766d18cacf7a4e7cffa6a539855d5bdc08d","integrity":"sha256-HNXEs3k42TIRDsBDzhzHZtGMrPek58/6alOYVdW9wI0="},"roboto/Roboto-Regular-bde8a188e37aa936b167aecc5e5a3da40262f6e51fd54c584f2cf2b6b99d96ca.ttf":{"logical_path":"roboto/Roboto-Regular.ttf","mtime":"2015-06-11T08:24:58-07:00","size":126072,"digest":"bde8a188e37aa936b167aecc5e5a3da40262f6e51fd54c584f2cf2b6b99d96ca","integrity":"sha256-veihiON6qTaxZ67MXlo9pAJi9uUf1UxYTyzytrmdlso="},"roboto/Roboto-Regular-2cd6b07b7855716761250290ce3cf447ccc98e793e484294d3fa8ccbb55b016a.woff":{"logical_path":"roboto/Roboto-Regular.woff","mtime":"2015-06-11T08:24:58-07:00","size":61736,"digest":"2cd6b07b7855716761250290ce3cf447ccc98e793e484294d3fa8ccbb55b016a","integrity":"sha256-LNawe3hVcWdhJQKQzjz0R8zJjnk+SEKU0/qMy7VbAWo="},"roboto/Roboto-Regular-b5c9c23bd12593523a46d79dd0aee80e3226bbde4c9ac05fc30a95e2c1510de0.woff2":{"logical_path":"roboto/Roboto-Regular.woff2","mtime":"2015-06-11T08:24:58-07:00","size":49236,"digest":"b5c9c23bd12593523a46d79dd0aee80e3226bbde4c9ac05fc30a95e2c1510de0","integrity":"sha256-tcnCO9Elk1I6Rted0K7oDjImu95MmsBfwwqV4sFRDeA="},"roboto/Roboto-Thin-db1d464343bf795307bc90da83d65b93c841fb20f38662f92f1e5e2c5a1d2ec5.ttf":{"logical_path":"roboto/Roboto-Thin.ttf","mtime":"2015-06-11T08:24:58-07:00","size":127584,"digest":"db1d464343bf795307bc90da83d65b93c841fb20f38662f92f1e5e2c5a1d2ec5","integrity":"sha256-2x1GQ0O/eVMHvJDag9Zbk8hB+yDzhmL5Lx5eLFodLsU="},"roboto/Roboto-Thin-ae65b047fa4032f18a40480a93d1aae6707a756e7b3bb5f060467cd1f59b1625.woff":{"logical_path":"roboto/Roboto-Thin.woff","mtime":"2015-06-11T08:24:58-07:00","size":61628,"digest":"ae65b047fa4032f18a40480a93d1aae6707a756e7b3bb5f060467cd1f59b1625","integrity":"sha256-rmWwR/pAMvGKQEgKk9Gq5nB6dW57O7XwYEZ80fWbFiU="},"roboto/Roboto-Thin-fbcf22e622baa9226f9f2dcd2ce4975c9babc01a52eaf9397557a97cdebd7e40.woff2":{"logical_path":"roboto/Roboto-Thin.woff2","mtime":"2015-06-11T08:24:58-07:00","size":48524,"digest":"fbcf22e622baa9226f9f2dcd2ce4975c9babc01a52eaf9397557a97cdebd7e40","integrity":"sha256-+88i5iK6qSJvny3NLOSXXJurwBpS6vk5dVepfN69fkA="},"font-awesome/fontawesome-webfont-cbb644d0ee730ea57dd5fbae35ef5ba4a41d57a254a6b1215de5c9ff8a321c2d.eot":{"logical_path":"font-awesome/fontawesome-webfont.eot","mtime":"2015-06-17T14:15:43-07:00","size":60767,"digest":"cbb644d0ee730ea57dd5fbae35ef5ba4a41d57a254a6b1215de5c9ff8a321c2d","integrity":"sha256-y7ZE0O5zDqV91fuuNe9bpKQdV6JUprEhXeXJ/4oyHC0="},"font-awesome/fontawesome-webfont-bfdef833219a6edffd9c3cbc28db72739d22bb4d20cc2e2f8d56a7a4d408a206.svg":{"logical_path":"font-awesome/fontawesome-webfont.svg","mtime":"2015-06-17T14:15:43-07:00","size":313398,"digest":"bfdef833219a6edffd9c3cbc28db72739d22bb4d20cc2e2f8d56a7a4d408a206","integrity":"sha256-v974MyGabt/9nDy8KNtyc50iu00gzC4vjVanpNQIogY="},"font-awesome/fontawesome-webfont-9e540a087924a6e64790149d735cac022640e4fa6bff6bd65f5e9f41529bf0b3.ttf":{"logical_path":"font-awesome/fontawesome-webfont.ttf","mtime":"2015-06-17T14:15:43-07:00","size":122092,"digest":"9e540a087924a6e64790149d735cac022640e4fa6bff6bd65f5e9f41529bf0b3","integrity":"sha256-nlQKCHkkpuZHkBSdc1ysAiZA5Ppr/2vWX16fQVKb8LM="},"font-awesome/fontawesome-webfont-e3870de89716b72cb61a4bba0e17c75783b361cdaba35ea96961c3070bd8ca18.woff":{"logical_path":"font-awesome/fontawesome-webfont.woff","mtime":"2015-06-17T14:15:43-07:00","size":71508,"digest":"e3870de89716b72cb61a4bba0e17c75783b361cdaba35ea96961c3070bd8ca18","integrity":"sha256-44cN6JcWtyy2Gku6DhfHV4OzYc2ro16paWHDBwvYyhg="},"font-awesome/fontawesome-webfont-aadc3580d2b64ff5a7e6f1425587db4e8b033efcbf8f5c332ca52a5ed580c87c.woff2":{"logical_path":"font-awesome/fontawesome-webfont.woff2","mtime":"2015-06-17T14:15:43-07:00","size":56780,"digest":"aadc3580d2b64ff5a7e6f1425587db4e8b033efcbf8f5c332ca52a5ed580c87c","integrity":"sha256-qtw1gNK2T/Wn5vFCVYfbTosDPvy/j1wzLKUqXtWAyHw="},"application-03d0a9d16dc79623cd2901fee1177a8257c38da7bd2d2bdc3df4aa90d3834eee.js":{"logical_path":"application.js","mtime":"2015-06-28T20:16:52-07:00","size":245876,"digest":"03d0a9d16dc79623cd2901fee1177a8257c38da7bd2d2bdc3df4aa90d3834eee","integrity":"sha256-A9Cp0W3HliPNKQH+4Rd6glfDjae9LSvcPfSqkNODTu4="},"application-5fc6ff42750f2736383f1913ec0008b52b1a439655b297b1a867c6048ac7e1ce.js":{"logical_path":"application.js","mtime":"2015-06-28T20:26:12-07:00","size":245875,"digest":"5fc6ff42750f2736383f1913ec0008b52b1a439655b297b1a867c6048ac7e1ce","integrity":"sha256-X8b/QnUPJzY4PxkT7AAItSsaQ5ZVspexqGfGBIrH4c4="},"application-d31d805cd206b80b1e5825025f6d605acd80b62267853df63f5c9c427550bc32.css":{"logical_path":"application.css","mtime":"2015-06-28T20:26:12-07:00","size":199520,"digest":"d31d805cd206b80b1e5825025f6d605acd80b62267853df63f5c9c427550bc32","integrity":"sha256-0x2AXNIGuAseWCUCX21gWs2AtiJnhT32P1ycQnVQvDI="},"application-071c4870f658a28a6881146d09fd6087dc27d319bc13008833740e090a809c97.css":{"logical_path":"application.css","mtime":"2015-06-28T20:40:33-07:00","size":199565,"digest":"071c4870f658a28a6881146d09fd6087dc27d319bc13008833740e090a809c97","integrity":"sha256-BxxIcPZYoopogRRtCf1gh9wn0xm8EwCIM3QOCQqAnJc="},"application-7d03837e7684716383341885934e48f9a72b4148c6216065465410b3819842fb.js":{"logical_path":"application.js","mtime":"2015-06-28T20:50:34-07:00","size":245907,"digest":"7d03837e7684716383341885934e48f9a72b4148c6216065465410b3819842fb","integrity":"sha256-fQODfnaEcWODNBiFk05I+acrQUjGIWBlRlQQs4GYQvs="},"application-205c6b9bab11045ad6157d9ef3ba2dcb95b78de56c660c494efe3bd949b8f64f.css":{"logical_path":"application.css","mtime":"2015-06-28T20:50:34-07:00","size":199544,"digest":"205c6b9bab11045ad6157d9ef3ba2dcb95b78de56c660c494efe3bd949b8f64f","integrity":"sha256-IFxrm6sRBFrWFX2e87oty5W3jeVsZgxJTv472Um49k8="},"application-d57f23fecb2ad0ab85ff442981895f776a7ea7f413c5629e845b62cbe8405523.css":{"logical_path":"application.css","mtime":"2015-06-28T21:02:06-07:00","size":199606,"digest":"d57f23fecb2ad0ab85ff442981895f776a7ea7f413c5629e845b62cbe8405523","integrity":"sha256-1X8j/ssq0KuF/0QpgYlfd2p+p/QTxWKehFtiy+hAVSM="},"application-b255007737bd257a0d1e775bf8bcdeb385676a68d86d850cecb09b94307f0b1e.js":{"logical_path":"application.js","mtime":"2015-06-28T21:25:07-07:00","size":246339,"digest":"b255007737bd257a0d1e775bf8bcdeb385676a68d86d850cecb09b94307f0b1e","integrity":"sha256-slUAdze9JXoNHndb+Lzes4VnamjYbYUM7LCblDB/Cx4="},"application-0e6995ef3f34338ef0e39511a42f5e957d1e83ee637dea342f1d18cca575ba95.js":{"logical_path":"application.js","mtime":"2015-06-28T22:46:48-07:00","size":247044,"digest":"0e6995ef3f34338ef0e39511a42f5e957d1e83ee637dea342f1d18cca575ba95","integrity":"sha256-DmmV7z80M47w45URpC9elX0eg+5jfeo0Lx0YzKV1upU="},"application-e7ae94611f08ed414603f848d08c1459a82034d23b8862ec90cf93a3c4c0bd09.css":{"logical_path":"application.css","mtime":"2015-06-28T21:49:48-07:00","size":257369,"digest":"e7ae94611f08ed414603f848d08c1459a82034d23b8862ec90cf93a3c4c0bd09","integrity":"sha256-566UYR8I7UFGA/hI0IwUWaggNNI7iGLskM+To8TAvQk="},"colorful-robots-sm-ddf8bef86fcb7d5501079d413c586397a0e78482f775ed6b1b658f19b0fe5ee1.jpg":{"logical_path":"colorful-robots-sm.jpg","mtime":"2015-08-30T19:13:05-07:00","size":308707,"digest":"ddf8bef86fcb7d5501079d413c586397a0e78482f775ed6b1b658f19b0fe5ee1","integrity":"sha256-3fi++G/LfVUBB51BPFhjl6DnhIL3de1rG2WPGbD+XuE="},"application-045fef1ae73e1c57d9374dcc597d268c8241aecf4061de74a8c0c539e63197c4.css":{"logical_path":"application.css","mtime":"2015-06-28T22:56:21-07:00","size":257422,"digest":"045fef1ae73e1c57d9374dcc597d268c8241aecf4061de74a8c0c539e63197c4","integrity":"sha256-BF/vGuc+HFfZN03MWX0mjIJBrs9AYd50qMDFOeYxl8Q="},"application-ecacc6b84ea4d9dc513a4b0b5689b38788d7f519f845df4b2b43d29185adc630.js":{"logical_path":"application.js","mtime":"2015-08-30T20:19:40-07:00","size":247112,"digest":"ecacc6b84ea4d9dc513a4b0b5689b38788d7f519f845df4b2b43d29185adc630","integrity":"sha256-7KzGuE6k2dxROksLVomzh4jX9Rn4Rd9LK0PSkYWtxjA="},"application-83f116e80d41af1386e386a4150a26af7da0bb8c092dfae6bee21744f997ec0d.css":{"logical_path":"application.css","mtime":"2015-08-30T21:07:45-07:00","size":257439,"digest":"83f116e80d41af1386e386a4150a26af7da0bb8c092dfae6bee21744f997ec0d","integrity":"sha256-g/EW6A1BrxOG44akFQomr32gu4wJLfrmvuIXRPmX7A0="},"application-144fe3cf15a1a24581bd897c2ff17c745a537dda46d0c4d91f57b8760ec6e6c3.js":{"logical_path":"application.js","mtime":"2015-09-08T21:48:49-07:00","size":234260,"digest":"144fe3cf15a1a24581bd897c2ff17c745a537dda46d0c4d91f57b8760ec6e6c3","integrity":"sha256-FE/jzxWhokWBvYl8L/F8dFpTfdpG0MTZH1e4dg7G5sM="},"application-027b8f03445ec56e5a6edc494b1ce449ad1d8daf6db9fff3fa4d3ec468e5ab0b.js":{"logical_path":"application.js","mtime":"2015-09-09T20:16:31-07:00","size":234090,"digest":"027b8f03445ec56e5a6edc494b1ce449ad1d8daf6db9fff3fa4d3ec468e5ab0b","integrity":"sha256-AnuPA0RexW5abtxJSxzkSa0dja9tuf/z+k0+xGjlqws="},"application-1052529f2d6c6c37effb5c439ec72a205b8b868404fd9af5d0e6fd6dedfdd4bd.js":{"logical_path":"application.js","mtime":"2015-09-29T20:06:36-07:00","size":235090,"digest":"1052529f2d6c6c37effb5c439ec72a205b8b868404fd9af5d0e6fd6dedfdd4bd","integrity":"sha256-EFJSny1sbDfv+1xDnscqIFuLhoQE/Zr10Ob9be391L0="},"application-1c0c25f5f2d0a29bc9968efcff94056ff2f60634a407bcf3619744c8d91f5e95.js":{"logical_path":"application.js","mtime":"2015-09-29T20:54:36-07:00","size":235018,"digest":"1c0c25f5f2d0a29bc9968efcff94056ff2f60634a407bcf3619744c8d91f5e95","integrity":"sha256-HAwl9fLQopvJlo78/5QFb/L2BjSkB7zzYZdEyNkfXpU="},"application-58b76ea32f6ac46edf7cd5e739e8efe31875aa7090d41cfb30084c0cf01856f0.js":{"logical_path":"application.js","mtime":"2015-09-29T21:05:55-07:00","size":235070,"digest":"58b76ea32f6ac46edf7cd5e739e8efe31875aa7090d41cfb30084c0cf01856f0","integrity":"sha256-WLduoy9qxG7ffNXnOejv4xh1qnCQ1Bz7MAhMDPAYVvA="},"application-eca1b68929a0189e2d889219956925deb29be8be9ac3926e4e51deb448f73448.js":{"logical_path":"application.js","mtime":"2015-09-30T22:30:32-07:00","size":235071,"digest":"eca1b68929a0189e2d889219956925deb29be8be9ac3926e4e51deb448f73448","integrity":"sha256-7KG2iSmgGJ4tiJIZlWkl3rKb6L6aw5JuTlHetEj3NEg="}},"assets":{"chris_head.png":"chris_head-8ab4ab384675d5c657b933f169d226b9086490641c265aca7fcb13ffa5bbe85d.png","colorful-robots.jpg":"colorful-robots-fbd326709c16b50742a5ad6e289712bdd71aa1ac1888a006a954a4137af91860.jpg","creators_bg.png":"creators_bg-8eb9572f519e8a6d681685f2e0428c6217bcaea9f006b7ac7093fb17f819d3eb.png","hash_lg.png":"hash_lg-c589634864b6ed7484a1bc648dc23b22d9749755b128634dd1636941c97bc040.png","hashrobot.png":"hashrobot-0e9b58c6120bcd4fa59e1388eced561309b9ab5488d9f556593bf271d4db970c.png","hashrobot_sm.png":"hashrobot_sm-ea4ce03feea39c6cffc1e4e5c8d706381381b1696096439f899bbbfa6be7638c.png","hashrobot_xs.png":"hashrobot_xs-8a69c3eb3ea4ba1a2c306c1bc5c086a00b489678e36ceed8cafe931c8572588f.png","jeff_head.png":"jeff_head-8fb554e986e455610ded735230de57fc250ecb031e7c15271e8cd13222789e2a.png","robot_chris.png":"robot_chris-1cceedb844f08b2782e14556a5af42791d7bc7fdad776efc881d16d7cfa19465.png","robot_jeff.png":"robot_jeff-6d64d1898aae49600a2f2af830d04befde74961af0def332d2a89bb44ce0d307.png","robot_new_black.png":"robot_new_black-7e516331319100124f552f8f7340e7cead891b161ed086ce9a7cdcae38085779.png","robot_ryan.png":"robot_ryan-25f8772ac61b126fa240b3ce4184174c5fac2c827e185c34b1f7d30096309b6e.png","robot_white.png":"robot_white-c15d8fa318251b6646affc53dd8574f936bf8f629e3edeb85edd2c50a139db22.png","ryan_head.png":"ryan_head-e072d72d37b50f2074078d9fcbe341b37d20156a08a9580d17f61c902299768a.png","sky.png":"sky-07e0ed834c8b26fe0a46590cf637d2398d96de4b78f25a152b5bbb9a67344c8d.png","sky2.jpg":"sky2-297bc89e9faf9e485174032a56874d613613c3d6e5d99c9c23b6170d61456b94.jpg","application.js":"application-eca1b68929a0189e2d889219956925deb29be8be9ac3926e4e51deb448f73448.js","application.css":"application-83f116e80d41af1386e386a4150a26af7da0bb8c092dfae6bee21744f997ec0d.css","material-design-icons/LICENSE.txt":"material-design-icons/LICENSE-04051e0a14494a4997cedd4e371ccc9e9262fcd278c9a96129c36b4277c4129d.txt","material-design-icons/Material-Design-Icons.eot":"material-design-icons/Material-Design-Icons-7628d8cc2f0994b135a1419faa1db2949764b7b28070c39ef81fffecc5a041bb.eot","material-design-icons/Material-Design-Icons.svg":"material-design-icons/Material-Design-Icons-c3e402679b8c6f20c98e6538749608091e6823ca0e18e927dd7e43ae02767746.svg","material-design-icons/Material-Design-Icons.ttf":"material-design-icons/Material-Design-Icons-5d97606a426dbb32cb0236483d32e8746b928ab979be7b809db9d3113e6e35df.ttf","material-design-icons/Material-Design-Icons.woff":"material-design-icons/Material-Design-Icons-be00e19b662046cb8f2eb6eb86e4689edeefb0c003f6a215df9c22f0e15e16ad.woff","material-design-icons/Material-Design-Icons.woff2":"material-design-icons/Material-Design-Icons-4efd86423405eefbcbe28d543fc5db242d747b47f8b201f6d8bfdd091ff3bbdd.woff2","roboto/Roboto-Bold.ttf":"roboto/Roboto-Bold-594d74a49e307be7cc9e1ee5f1023684e6820cf11bcc968bee590391e1ad5a5a.ttf","roboto/Roboto-Bold.woff":"roboto/Roboto-Bold-e7cbaf29c3812b80577cb845b5d359486242338f25620ba65260e265464fe359.woff","roboto/Roboto-Bold.woff2":"roboto/Roboto-Bold-8b84b2abc336ee61f48a28a697b6ace2333ea5f1868aa15d5aeb2c7beac6d716.woff2","roboto/Roboto-Light.ttf":"roboto/Roboto-Light-ee4352049603e5960550f55444ad720d8d4ce322c0dcba1afc77de78c430d0d5.ttf","roboto/Roboto-Light.woff":"roboto/Roboto-Light-2cbb012f1d36c09d3f17100ef2cf8213cbd429d9e519dff536c12ed6f07a0d25.woff","roboto/Roboto-Light.woff2":"roboto/Roboto-Light-94a0ac8d73bb60a9cbe27a4fa36669104f6ffa37c8ff2df29313a6c0d3b64a75.woff2","roboto/Roboto-Medium.ttf":"roboto/Roboto-Medium-6e2ec5c5f89e4ce302bb93b46cb7cc336236501de17348e284878914c5e0e723.ttf","roboto/Roboto-Medium.woff":"roboto/Roboto-Medium-72841a4c4171b13ab1edf2c8f8046f0958f2ff608ce4e0d568dd5c6319f8a933.woff","roboto/Roboto-Medium.woff2":"roboto/Roboto-Medium-1cd5c4b37938d932110ec043ce1cc766d18cacf7a4e7cffa6a539855d5bdc08d.woff2","roboto/Roboto-Regular.ttf":"roboto/Roboto-Regular-bde8a188e37aa936b167aecc5e5a3da40262f6e51fd54c584f2cf2b6b99d96ca.ttf","roboto/Roboto-Regular.woff":"roboto/Roboto-Regular-2cd6b07b7855716761250290ce3cf447ccc98e793e484294d3fa8ccbb55b016a.woff","roboto/Roboto-Regular.woff2":"roboto/Roboto-Regular-b5c9c23bd12593523a46d79dd0aee80e3226bbde4c9ac05fc30a95e2c1510de0.woff2","roboto/Roboto-Thin.ttf":"roboto/Roboto-Thin-db1d464343bf795307bc90da83d65b93c841fb20f38662f92f1e5e2c5a1d2ec5.ttf","roboto/Roboto-Thin.woff":"roboto/Roboto-Thin-ae65b047fa4032f18a40480a93d1aae6707a756e7b3bb5f060467cd1f59b1625.woff","roboto/Roboto-Thin.woff2":"roboto/Roboto-Thin-fbcf22e622baa9226f9f2dcd2ce4975c9babc01a52eaf9397557a97cdebd7e40.woff2","font-awesome/fontawesome-webfont.eot":"font-awesome/fontawesome-webfont-cbb644d0ee730ea57dd5fbae35ef5ba4a41d57a254a6b1215de5c9ff8a321c2d.eot","font-awesome/fontawesome-webfont.svg":"font-awesome/fontawesome-webfont-bfdef833219a6edffd9c3cbc28db72739d22bb4d20cc2e2f8d56a7a4d408a206.svg","font-awesome/fontawesome-webfont.ttf":"font-awesome/fontawesome-webfont-9e540a087924a6e64790149d735cac022640e4fa6bff6bd65f5e9f41529bf0b3.ttf","font-awesome/fontawesome-webfont.woff":"font-awesome/fontawesome-webfont-e3870de89716b72cb61a4bba0e17c75783b361cdaba35ea96961c3070bd8ca18.woff","font-awesome/fontawesome-webfont.woff2":"font-awesome/fontawesome-webfont-aadc3580d2b64ff5a7e6f1425587db4e8b033efcbf8f5c332ca52a5ed580c87c.woff2","colorful-robots-sm.jpg":"colorful-robots-sm-ddf8bef86fcb7d5501079d413c586397a0e78482f775ed6b1b658f19b0fe5ee1.jpg"}} -------------------------------------------------------------------------------- /public/assets/chris_head-8ab4ab384675d5c657b933f169d226b9086490641c265aca7fcb13ffa5bbe85d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/chris_head-8ab4ab384675d5c657b933f169d226b9086490641c265aca7fcb13ffa5bbe85d.png -------------------------------------------------------------------------------- /public/assets/colorful-robots-fbd326709c16b50742a5ad6e289712bdd71aa1ac1888a006a954a4137af91860.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/colorful-robots-fbd326709c16b50742a5ad6e289712bdd71aa1ac1888a006a954a4137af91860.jpg -------------------------------------------------------------------------------- /public/assets/colorful-robots-sm-ddf8bef86fcb7d5501079d413c586397a0e78482f775ed6b1b658f19b0fe5ee1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/colorful-robots-sm-ddf8bef86fcb7d5501079d413c586397a0e78482f775ed6b1b658f19b0fe5ee1.jpg -------------------------------------------------------------------------------- /public/assets/creators_bg-8eb9572f519e8a6d681685f2e0428c6217bcaea9f006b7ac7093fb17f819d3eb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/creators_bg-8eb9572f519e8a6d681685f2e0428c6217bcaea9f006b7ac7093fb17f819d3eb.png -------------------------------------------------------------------------------- /public/assets/font-awesome/fontawesome-webfont-9e540a087924a6e64790149d735cac022640e4fa6bff6bd65f5e9f41529bf0b3.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/font-awesome/fontawesome-webfont-9e540a087924a6e64790149d735cac022640e4fa6bff6bd65f5e9f41529bf0b3.ttf -------------------------------------------------------------------------------- /public/assets/font-awesome/fontawesome-webfont-aadc3580d2b64ff5a7e6f1425587db4e8b033efcbf8f5c332ca52a5ed580c87c.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/font-awesome/fontawesome-webfont-aadc3580d2b64ff5a7e6f1425587db4e8b033efcbf8f5c332ca52a5ed580c87c.woff2 -------------------------------------------------------------------------------- /public/assets/font-awesome/fontawesome-webfont-cbb644d0ee730ea57dd5fbae35ef5ba4a41d57a254a6b1215de5c9ff8a321c2d.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/font-awesome/fontawesome-webfont-cbb644d0ee730ea57dd5fbae35ef5ba4a41d57a254a6b1215de5c9ff8a321c2d.eot -------------------------------------------------------------------------------- /public/assets/font-awesome/fontawesome-webfont-e3870de89716b72cb61a4bba0e17c75783b361cdaba35ea96961c3070bd8ca18.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/font-awesome/fontawesome-webfont-e3870de89716b72cb61a4bba0e17c75783b361cdaba35ea96961c3070bd8ca18.woff -------------------------------------------------------------------------------- /public/assets/hash_lg-c589634864b6ed7484a1bc648dc23b22d9749755b128634dd1636941c97bc040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/hash_lg-c589634864b6ed7484a1bc648dc23b22d9749755b128634dd1636941c97bc040.png -------------------------------------------------------------------------------- /public/assets/hashrobot-0e9b58c6120bcd4fa59e1388eced561309b9ab5488d9f556593bf271d4db970c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/hashrobot-0e9b58c6120bcd4fa59e1388eced561309b9ab5488d9f556593bf271d4db970c.png -------------------------------------------------------------------------------- /public/assets/hashrobot_sm-ea4ce03feea39c6cffc1e4e5c8d706381381b1696096439f899bbbfa6be7638c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/hashrobot_sm-ea4ce03feea39c6cffc1e4e5c8d706381381b1696096439f899bbbfa6be7638c.png -------------------------------------------------------------------------------- /public/assets/hashrobot_xs-8a69c3eb3ea4ba1a2c306c1bc5c086a00b489678e36ceed8cafe931c8572588f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/hashrobot_xs-8a69c3eb3ea4ba1a2c306c1bc5c086a00b489678e36ceed8cafe931c8572588f.png -------------------------------------------------------------------------------- /public/assets/jeff_head-8fb554e986e455610ded735230de57fc250ecb031e7c15271e8cd13222789e2a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/jeff_head-8fb554e986e455610ded735230de57fc250ecb031e7c15271e8cd13222789e2a.png -------------------------------------------------------------------------------- /public/assets/material-design-icons/LICENSE-04051e0a14494a4997cedd4e371ccc9e9262fcd278c9a96129c36b4277c4129d.txt: -------------------------------------------------------------------------------- 1 | https://github.com/google/material-design-icons/blob/master/LICENSE 2 | https://github.com/FezVrasta/bootstrap-material-design/blob/master/fonts/LICENSE.txt 3 | 4 | Attribution-ShareAlike 4.0 International 5 | 6 | ======================================================================= 7 | 8 | Creative Commons Corporation ("Creative Commons") is not a law firm and 9 | does not provide legal services or legal advice. Distribution of 10 | Creative Commons public licenses does not create a lawyer-client or 11 | other relationship. Creative Commons makes its licenses and related 12 | information available on an "as-is" basis. Creative Commons gives no 13 | warranties regarding its licenses, any material licensed under their 14 | terms and conditions, or any related information. Creative Commons 15 | disclaims all liability for damages resulting from their use to the 16 | fullest extent possible. 17 | 18 | Using Creative Commons Public Licenses 19 | 20 | Creative Commons public licenses provide a standard set of terms and 21 | conditions that creators and other rights holders may use to share 22 | original works of authorship and other material subject to copyright 23 | and certain other rights specified in the public license below. The 24 | following considerations are for informational purposes only, are not 25 | exhaustive, and do not form part of our licenses. 26 | 27 | Considerations for licensors: Our public licenses are 28 | intended for use by those authorized to give the public 29 | permission to use material in ways otherwise restricted by 30 | copyright and certain other rights. Our licenses are 31 | irrevocable. Licensors should read and understand the terms 32 | and conditions of the license they choose before applying it. 33 | Licensors should also secure all rights necessary before 34 | applying our licenses so that the public can reuse the 35 | material as expected. Licensors should clearly mark any 36 | material not subject to the license. This includes other CC- 37 | licensed material, or material used under an exception or 38 | limitation to copyright. More considerations for licensors: 39 | wiki.creativecommons.org/Considerations_for_licensors 40 | 41 | Considerations for the public: By using one of our public 42 | licenses, a licensor grants the public permission to use the 43 | licensed material under specified terms and conditions. If 44 | the licensor's permission is not necessary for any reason--for 45 | example, because of any applicable exception or limitation to 46 | copyright--then that use is not regulated by the license. Our 47 | licenses grant only permissions under copyright and certain 48 | other rights that a licensor has authority to grant. Use of 49 | the licensed material may still be restricted for other 50 | reasons, including because others have copyright or other 51 | rights in the material. A licensor may make special requests, 52 | such as asking that all changes be marked or described. 53 | Although not required by our licenses, you are encouraged to 54 | respect those requests where reasonable. More_considerations 55 | for the public: 56 | wiki.creativecommons.org/Considerations_for_licensees 57 | 58 | ======================================================================= 59 | 60 | Creative Commons Attribution-ShareAlike 4.0 International Public 61 | License 62 | 63 | By exercising the Licensed Rights (defined below), You accept and agree 64 | to be bound by the terms and conditions of this Creative Commons 65 | Attribution-ShareAlike 4.0 International Public License ("Public 66 | License"). To the extent this Public License may be interpreted as a 67 | contract, You are granted the Licensed Rights in consideration of Your 68 | acceptance of these terms and conditions, and the Licensor grants You 69 | such rights in consideration of benefits the Licensor receives from 70 | making the Licensed Material available under these terms and 71 | conditions. 72 | 73 | 74 | Section 1 -- Definitions. 75 | 76 | a. Adapted Material means material subject to Copyright and Similar 77 | Rights that is derived from or based upon the Licensed Material 78 | and in which the Licensed Material is translated, altered, 79 | arranged, transformed, or otherwise modified in a manner requiring 80 | permission under the Copyright and Similar Rights held by the 81 | Licensor. For purposes of this Public License, where the Licensed 82 | Material is a musical work, performance, or sound recording, 83 | Adapted Material is always produced where the Licensed Material is 84 | synched in timed relation with a moving image. 85 | 86 | b. Adapter's License means the license You apply to Your Copyright 87 | and Similar Rights in Your contributions to Adapted Material in 88 | accordance with the terms and conditions of this Public License. 89 | 90 | c. BY-SA Compatible License means a license listed at 91 | creativecommons.org/compatiblelicenses, approved by Creative 92 | Commons as essentially the equivalent of this Public License. 93 | 94 | d. Copyright and Similar Rights means copyright and/or similar rights 95 | closely related to copyright including, without limitation, 96 | performance, broadcast, sound recording, and Sui Generis Database 97 | Rights, without regard to how the rights are labeled or 98 | categorized. For purposes of this Public License, the rights 99 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 100 | Rights. 101 | 102 | e. Effective Technological Measures means those measures that, in the 103 | absence of proper authority, may not be circumvented under laws 104 | fulfilling obligations under Article 11 of the WIPO Copyright 105 | Treaty adopted on December 20, 1996, and/or similar international 106 | agreements. 107 | 108 | f. Exceptions and Limitations means fair use, fair dealing, and/or 109 | any other exception or limitation to Copyright and Similar Rights 110 | that applies to Your use of the Licensed Material. 111 | 112 | g. License Elements means the license attributes listed in the name 113 | of a Creative Commons Public License. The License Elements of this 114 | Public License are Attribution and ShareAlike. 115 | 116 | h. Licensed Material means the artistic or literary work, database, 117 | or other material to which the Licensor applied this Public 118 | License. 119 | 120 | i. Licensed Rights means the rights granted to You subject to the 121 | terms and conditions of this Public License, which are limited to 122 | all Copyright and Similar Rights that apply to Your use of the 123 | Licensed Material and that the Licensor has authority to license. 124 | 125 | j. Licensor means the individual(s) or entity(ies) granting rights 126 | under this Public License. 127 | 128 | k. Share means to provide material to the public by any means or 129 | process that requires permission under the Licensed Rights, such 130 | as reproduction, public display, public performance, distribution, 131 | dissemination, communication, or importation, and to make material 132 | available to the public including in ways that members of the 133 | public may access the material from a place and at a time 134 | individually chosen by them. 135 | 136 | l. Sui Generis Database Rights means rights other than copyright 137 | resulting from Directive 96/9/EC of the European Parliament and of 138 | the Council of 11 March 1996 on the legal protection of databases, 139 | as amended and/or succeeded, as well as other essentially 140 | equivalent rights anywhere in the world. 141 | 142 | m. You means the individual or entity exercising the Licensed Rights 143 | under this Public License. Your has a corresponding meaning. 144 | 145 | 146 | Section 2 -- Scope. 147 | 148 | a. License grant. 149 | 150 | 1. Subject to the terms and conditions of this Public License, 151 | the Licensor hereby grants You a worldwide, royalty-free, 152 | non-sublicensable, non-exclusive, irrevocable license to 153 | exercise the Licensed Rights in the Licensed Material to: 154 | 155 | a. reproduce and Share the Licensed Material, in whole or 156 | in part; and 157 | 158 | b. produce, reproduce, and Share Adapted Material. 159 | 160 | 2. Exceptions and Limitations. For the avoidance of doubt, where 161 | Exceptions and Limitations apply to Your use, this Public 162 | License does not apply, and You do not need to comply with 163 | its terms and conditions. 164 | 165 | 3. Term. The term of this Public License is specified in Section 166 | 6(a). 167 | 168 | 4. Media and formats; technical modifications allowed. The 169 | Licensor authorizes You to exercise the Licensed Rights in 170 | all media and formats whether now known or hereafter created, 171 | and to make technical modifications necessary to do so. The 172 | Licensor waives and/or agrees not to assert any right or 173 | authority to forbid You from making technical modifications 174 | necessary to exercise the Licensed Rights, including 175 | technical modifications necessary to circumvent Effective 176 | Technological Measures. For purposes of this Public License, 177 | simply making modifications authorized by this Section 2(a) 178 | (4) never produces Adapted Material. 179 | 180 | 5. Downstream recipients. 181 | 182 | a. Offer from the Licensor -- Licensed Material. Every 183 | recipient of the Licensed Material automatically 184 | receives an offer from the Licensor to exercise the 185 | Licensed Rights under the terms and conditions of this 186 | Public License. 187 | 188 | b. Additional offer from the Licensor -- Adapted Material. 189 | Every recipient of Adapted Material from You 190 | automatically receives an offer from the Licensor to 191 | exercise the Licensed Rights in the Adapted Material 192 | under the conditions of the Adapter's License You apply. 193 | 194 | c. No downstream restrictions. You may not offer or impose 195 | any additional or different terms or conditions on, or 196 | apply any Effective Technological Measures to, the 197 | Licensed Material if doing so restricts exercise of the 198 | Licensed Rights by any recipient of the Licensed 199 | Material. 200 | 201 | 6. No endorsement. Nothing in this Public License constitutes or 202 | may be construed as permission to assert or imply that You 203 | are, or that Your use of the Licensed Material is, connected 204 | with, or sponsored, endorsed, or granted official status by, 205 | the Licensor or others designated to receive attribution as 206 | provided in Section 3(a)(1)(A)(i). 207 | 208 | b. Other rights. 209 | 210 | 1. Moral rights, such as the right of integrity, are not 211 | licensed under this Public License, nor are publicity, 212 | privacy, and/or other similar personality rights; however, to 213 | the extent possible, the Licensor waives and/or agrees not to 214 | assert any such rights held by the Licensor to the limited 215 | extent necessary to allow You to exercise the Licensed 216 | Rights, but not otherwise. 217 | 218 | 2. Patent and trademark rights are not licensed under this 219 | Public License. 220 | 221 | 3. To the extent possible, the Licensor waives any right to 222 | collect royalties from You for the exercise of the Licensed 223 | Rights, whether directly or through a collecting society 224 | under any voluntary or waivable statutory or compulsory 225 | licensing scheme. In all other cases the Licensor expressly 226 | reserves any right to collect such royalties. 227 | 228 | 229 | Section 3 -- License Conditions. 230 | 231 | Your exercise of the Licensed Rights is expressly made subject to the 232 | following conditions. 233 | 234 | a. Attribution. 235 | 236 | 1. If You Share the Licensed Material (including in modified 237 | form), You must: 238 | 239 | a. retain the following if it is supplied by the Licensor 240 | with the Licensed Material: 241 | 242 | i. identification of the creator(s) of the Licensed 243 | Material and any others designated to receive 244 | attribution, in any reasonable manner requested by 245 | the Licensor (including by pseudonym if 246 | designated); 247 | 248 | ii. a copyright notice; 249 | 250 | iii. a notice that refers to this Public License; 251 | 252 | iv. a notice that refers to the disclaimer of 253 | warranties; 254 | 255 | v. a URI or hyperlink to the Licensed Material to the 256 | extent reasonably practicable; 257 | 258 | b. indicate if You modified the Licensed Material and 259 | retain an indication of any previous modifications; and 260 | 261 | c. indicate the Licensed Material is licensed under this 262 | Public License, and include the text of, or the URI or 263 | hyperlink to, this Public License. 264 | 265 | 2. You may satisfy the conditions in Section 3(a)(1) in any 266 | reasonable manner based on the medium, means, and context in 267 | which You Share the Licensed Material. For example, it may be 268 | reasonable to satisfy the conditions by providing a URI or 269 | hyperlink to a resource that includes the required 270 | information. 271 | 272 | 3. If requested by the Licensor, You must remove any of the 273 | information required by Section 3(a)(1)(A) to the extent 274 | reasonably practicable. 275 | 276 | b. ShareAlike. 277 | 278 | In addition to the conditions in Section 3(a), if You Share 279 | Adapted Material You produce, the following conditions also apply. 280 | 281 | 1. The Adapter's License You apply must be a Creative Commons 282 | license with the same License Elements, this version or 283 | later, or a BY-SA Compatible License. 284 | 285 | 2. You must include the text of, or the URI or hyperlink to, the 286 | Adapter's License You apply. You may satisfy this condition 287 | in any reasonable manner based on the medium, means, and 288 | context in which You Share Adapted Material. 289 | 290 | 3. You may not offer or impose any additional or different terms 291 | or conditions on, or apply any Effective Technological 292 | Measures to, Adapted Material that restrict exercise of the 293 | rights granted under the Adapter's License You apply. 294 | 295 | 296 | Section 4 -- Sui Generis Database Rights. 297 | 298 | Where the Licensed Rights include Sui Generis Database Rights that 299 | apply to Your use of the Licensed Material: 300 | 301 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 302 | to extract, reuse, reproduce, and Share all or a substantial 303 | portion of the contents of the database; 304 | 305 | b. if You include all or a substantial portion of the database 306 | contents in a database in which You have Sui Generis Database 307 | Rights, then the database in which You have Sui Generis Database 308 | Rights (but not its individual contents) is Adapted Material, 309 | 310 | including for purposes of Section 3(b); and 311 | c. You must comply with the conditions in Section 3(a) if You Share 312 | all or a substantial portion of the contents of the database. 313 | 314 | For the avoidance of doubt, this Section 4 supplements and does not 315 | replace Your obligations under this Public License where the Licensed 316 | Rights include other Copyright and Similar Rights. 317 | 318 | 319 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 320 | 321 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 322 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 323 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 324 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 325 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 326 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 327 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 328 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 329 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 330 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 331 | 332 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 333 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 334 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 335 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 336 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 337 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 338 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 339 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 340 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 341 | 342 | c. The disclaimer of warranties and limitation of liability provided 343 | above shall be interpreted in a manner that, to the extent 344 | possible, most closely approximates an absolute disclaimer and 345 | waiver of all liability. 346 | 347 | 348 | Section 6 -- Term and Termination. 349 | 350 | a. This Public License applies for the term of the Copyright and 351 | Similar Rights licensed here. However, if You fail to comply with 352 | this Public License, then Your rights under this Public License 353 | terminate automatically. 354 | 355 | b. Where Your right to use the Licensed Material has terminated under 356 | Section 6(a), it reinstates: 357 | 358 | 1. automatically as of the date the violation is cured, provided 359 | it is cured within 30 days of Your discovery of the 360 | violation; or 361 | 362 | 2. upon express reinstatement by the Licensor. 363 | 364 | For the avoidance of doubt, this Section 6(b) does not affect any 365 | right the Licensor may have to seek remedies for Your violations 366 | of this Public License. 367 | 368 | c. For the avoidance of doubt, the Licensor may also offer the 369 | Licensed Material under separate terms or conditions or stop 370 | distributing the Licensed Material at any time; however, doing so 371 | will not terminate this Public License. 372 | 373 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 374 | License. 375 | 376 | 377 | Section 7 -- Other Terms and Conditions. 378 | 379 | a. The Licensor shall not be bound by any additional or different 380 | terms or conditions communicated by You unless expressly agreed. 381 | 382 | b. Any arrangements, understandings, or agreements regarding the 383 | Licensed Material not stated herein are separate from and 384 | independent of the terms and conditions of this Public License. 385 | 386 | 387 | Section 8 -- Interpretation. 388 | 389 | a. For the avoidance of doubt, this Public License does not, and 390 | shall not be interpreted to, reduce, limit, restrict, or impose 391 | conditions on any use of the Licensed Material that could lawfully 392 | be made without permission under this Public License. 393 | 394 | b. To the extent possible, if any provision of this Public License is 395 | deemed unenforceable, it shall be automatically reformed to the 396 | minimum extent necessary to make it enforceable. If the provision 397 | cannot be reformed, it shall be severed from this Public License 398 | without affecting the enforceability of the remaining terms and 399 | conditions. 400 | 401 | c. No term or condition of this Public License will be waived and no 402 | failure to comply consented to unless expressly agreed to by the 403 | Licensor. 404 | 405 | d. Nothing in this Public License constitutes or may be interpreted 406 | as a limitation upon, or waiver of, any privileges and immunities 407 | that apply to the Licensor or You, including from the legal 408 | processes of any jurisdiction or authority. 409 | 410 | 411 | ======================================================================= 412 | 413 | Creative Commons is not a party to its public licenses. 414 | Notwithstanding, Creative Commons may elect to apply one of its public 415 | licenses to material it publishes and in those instances will be 416 | considered the "Licensor." Except for the limited purpose of indicating 417 | that material is shared under a Creative Commons public license or as 418 | otherwise permitted by the Creative Commons policies published at 419 | creativecommons.org/policies, Creative Commons does not authorize the 420 | use of the trademark "Creative Commons" or any other trademark or logo 421 | of Creative Commons without its prior written consent including, 422 | without limitation, in connection with any unauthorized modifications 423 | to any of its public licenses or any other arrangements, 424 | understandings, or agreements concerning use of licensed material. For 425 | the avoidance of doubt, this paragraph does not form part of the public 426 | licenses. 427 | 428 | Creative Commons may be contacted at creativecommons.org. 429 | -------------------------------------------------------------------------------- /public/assets/material-design-icons/Material-Design-Icons-4efd86423405eefbcbe28d543fc5db242d747b47f8b201f6d8bfdd091ff3bbdd.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/material-design-icons/Material-Design-Icons-4efd86423405eefbcbe28d543fc5db242d747b47f8b201f6d8bfdd091ff3bbdd.woff2 -------------------------------------------------------------------------------- /public/assets/material-design-icons/Material-Design-Icons-5d97606a426dbb32cb0236483d32e8746b928ab979be7b809db9d3113e6e35df.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/material-design-icons/Material-Design-Icons-5d97606a426dbb32cb0236483d32e8746b928ab979be7b809db9d3113e6e35df.ttf -------------------------------------------------------------------------------- /public/assets/material-design-icons/Material-Design-Icons-7628d8cc2f0994b135a1419faa1db2949764b7b28070c39ef81fffecc5a041bb.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/material-design-icons/Material-Design-Icons-7628d8cc2f0994b135a1419faa1db2949764b7b28070c39ef81fffecc5a041bb.eot -------------------------------------------------------------------------------- /public/assets/material-design-icons/Material-Design-Icons-be00e19b662046cb8f2eb6eb86e4689edeefb0c003f6a215df9c22f0e15e16ad.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/material-design-icons/Material-Design-Icons-be00e19b662046cb8f2eb6eb86e4689edeefb0c003f6a215df9c22f0e15e16ad.woff -------------------------------------------------------------------------------- /public/assets/robot_chris-1cceedb844f08b2782e14556a5af42791d7bc7fdad776efc881d16d7cfa19465.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/robot_chris-1cceedb844f08b2782e14556a5af42791d7bc7fdad776efc881d16d7cfa19465.png -------------------------------------------------------------------------------- /public/assets/robot_jeff-6d64d1898aae49600a2f2af830d04befde74961af0def332d2a89bb44ce0d307.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/robot_jeff-6d64d1898aae49600a2f2af830d04befde74961af0def332d2a89bb44ce0d307.png -------------------------------------------------------------------------------- /public/assets/robot_new_black-7e516331319100124f552f8f7340e7cead891b161ed086ce9a7cdcae38085779.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/robot_new_black-7e516331319100124f552f8f7340e7cead891b161ed086ce9a7cdcae38085779.png -------------------------------------------------------------------------------- /public/assets/robot_ryan-25f8772ac61b126fa240b3ce4184174c5fac2c827e185c34b1f7d30096309b6e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/robot_ryan-25f8772ac61b126fa240b3ce4184174c5fac2c827e185c34b1f7d30096309b6e.png -------------------------------------------------------------------------------- /public/assets/robot_white-c15d8fa318251b6646affc53dd8574f936bf8f629e3edeb85edd2c50a139db22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/robot_white-c15d8fa318251b6646affc53dd8574f936bf8f629e3edeb85edd2c50a139db22.png -------------------------------------------------------------------------------- /public/assets/roboto/Roboto-Bold-594d74a49e307be7cc9e1ee5f1023684e6820cf11bcc968bee590391e1ad5a5a.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/roboto/Roboto-Bold-594d74a49e307be7cc9e1ee5f1023684e6820cf11bcc968bee590391e1ad5a5a.ttf -------------------------------------------------------------------------------- /public/assets/roboto/Roboto-Bold-8b84b2abc336ee61f48a28a697b6ace2333ea5f1868aa15d5aeb2c7beac6d716.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/roboto/Roboto-Bold-8b84b2abc336ee61f48a28a697b6ace2333ea5f1868aa15d5aeb2c7beac6d716.woff2 -------------------------------------------------------------------------------- /public/assets/roboto/Roboto-Bold-e7cbaf29c3812b80577cb845b5d359486242338f25620ba65260e265464fe359.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/roboto/Roboto-Bold-e7cbaf29c3812b80577cb845b5d359486242338f25620ba65260e265464fe359.woff -------------------------------------------------------------------------------- /public/assets/roboto/Roboto-Light-2cbb012f1d36c09d3f17100ef2cf8213cbd429d9e519dff536c12ed6f07a0d25.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/roboto/Roboto-Light-2cbb012f1d36c09d3f17100ef2cf8213cbd429d9e519dff536c12ed6f07a0d25.woff -------------------------------------------------------------------------------- /public/assets/roboto/Roboto-Light-94a0ac8d73bb60a9cbe27a4fa36669104f6ffa37c8ff2df29313a6c0d3b64a75.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/roboto/Roboto-Light-94a0ac8d73bb60a9cbe27a4fa36669104f6ffa37c8ff2df29313a6c0d3b64a75.woff2 -------------------------------------------------------------------------------- /public/assets/roboto/Roboto-Light-ee4352049603e5960550f55444ad720d8d4ce322c0dcba1afc77de78c430d0d5.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/roboto/Roboto-Light-ee4352049603e5960550f55444ad720d8d4ce322c0dcba1afc77de78c430d0d5.ttf -------------------------------------------------------------------------------- /public/assets/roboto/Roboto-Medium-1cd5c4b37938d932110ec043ce1cc766d18cacf7a4e7cffa6a539855d5bdc08d.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/roboto/Roboto-Medium-1cd5c4b37938d932110ec043ce1cc766d18cacf7a4e7cffa6a539855d5bdc08d.woff2 -------------------------------------------------------------------------------- /public/assets/roboto/Roboto-Medium-6e2ec5c5f89e4ce302bb93b46cb7cc336236501de17348e284878914c5e0e723.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/roboto/Roboto-Medium-6e2ec5c5f89e4ce302bb93b46cb7cc336236501de17348e284878914c5e0e723.ttf -------------------------------------------------------------------------------- /public/assets/roboto/Roboto-Medium-72841a4c4171b13ab1edf2c8f8046f0958f2ff608ce4e0d568dd5c6319f8a933.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/roboto/Roboto-Medium-72841a4c4171b13ab1edf2c8f8046f0958f2ff608ce4e0d568dd5c6319f8a933.woff -------------------------------------------------------------------------------- /public/assets/roboto/Roboto-Regular-2cd6b07b7855716761250290ce3cf447ccc98e793e484294d3fa8ccbb55b016a.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/roboto/Roboto-Regular-2cd6b07b7855716761250290ce3cf447ccc98e793e484294d3fa8ccbb55b016a.woff -------------------------------------------------------------------------------- /public/assets/roboto/Roboto-Regular-b5c9c23bd12593523a46d79dd0aee80e3226bbde4c9ac05fc30a95e2c1510de0.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/roboto/Roboto-Regular-b5c9c23bd12593523a46d79dd0aee80e3226bbde4c9ac05fc30a95e2c1510de0.woff2 -------------------------------------------------------------------------------- /public/assets/roboto/Roboto-Regular-bde8a188e37aa936b167aecc5e5a3da40262f6e51fd54c584f2cf2b6b99d96ca.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/roboto/Roboto-Regular-bde8a188e37aa936b167aecc5e5a3da40262f6e51fd54c584f2cf2b6b99d96ca.ttf -------------------------------------------------------------------------------- /public/assets/roboto/Roboto-Thin-ae65b047fa4032f18a40480a93d1aae6707a756e7b3bb5f060467cd1f59b1625.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/roboto/Roboto-Thin-ae65b047fa4032f18a40480a93d1aae6707a756e7b3bb5f060467cd1f59b1625.woff -------------------------------------------------------------------------------- /public/assets/roboto/Roboto-Thin-db1d464343bf795307bc90da83d65b93c841fb20f38662f92f1e5e2c5a1d2ec5.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/roboto/Roboto-Thin-db1d464343bf795307bc90da83d65b93c841fb20f38662f92f1e5e2c5a1d2ec5.ttf -------------------------------------------------------------------------------- /public/assets/roboto/Roboto-Thin-fbcf22e622baa9226f9f2dcd2ce4975c9babc01a52eaf9397557a97cdebd7e40.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/roboto/Roboto-Thin-fbcf22e622baa9226f9f2dcd2ce4975c9babc01a52eaf9397557a97cdebd7e40.woff2 -------------------------------------------------------------------------------- /public/assets/ryan_head-e072d72d37b50f2074078d9fcbe341b37d20156a08a9580d17f61c902299768a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/ryan_head-e072d72d37b50f2074078d9fcbe341b37d20156a08a9580d17f61c902299768a.png -------------------------------------------------------------------------------- /public/assets/sky-07e0ed834c8b26fe0a46590cf637d2398d96de4b78f25a152b5bbb9a67344c8d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/sky-07e0ed834c8b26fe0a46590cf637d2398d96de4b78f25a152b5bbb9a67344c8d.png -------------------------------------------------------------------------------- /public/assets/sky2-297bc89e9faf9e485174032a56874d613613c3d6e5d99c9c23b6170d61456b94.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/assets/sky2-297bc89e9faf9e485174032a56874d613613c3d6e5d99c9c23b6170d61456b94.jpg -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/public/favicon.ico -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file 2 | # 3 | # To ban all spiders from the entire site uncomment the next two lines: 4 | # User-agent: * 5 | # Disallow: / 6 | -------------------------------------------------------------------------------- /spec/controllers/labels_controller_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe LabelsController, :type => :controller do 4 | 5 | it 'should get the labels index view via controller action' do 6 | 7 | get :index 8 | 9 | expect(response).to have_http_status(:success) 10 | expect(response).to render_template(:index) 11 | end 12 | 13 | end 14 | 15 | RSpec.describe "Routes for labels", :type => :routing do 16 | it "routes /index to the labels controller" do 17 | expect(:get => "/labels/index"). 18 | to route_to(:controller => "labels", :action => "index") 19 | end 20 | end -------------------------------------------------------------------------------- /spec/controllers/pages_controller_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe PagesController, :type => :controller do 4 | 5 | it 'should get the welcome (index) page' do 6 | 7 | get :index 8 | 9 | expect(response).to have_http_status(:success) 10 | expect(response).to render_template(:index) 11 | end 12 | 13 | it 'should get the about page' do 14 | 15 | get :about 16 | 17 | expect(response).to have_http_status(:success) 18 | expect(response).to render_template(:about) 19 | end 20 | 21 | it 'should get the dashboard page' do 22 | 23 | get :dashboard 24 | 25 | expect(response).to have_http_status(:success) 26 | expect(response).to render_template(:dashboard) 27 | 28 | end 29 | 30 | end 31 | 32 | RSpec.describe "Routes for pages about", :type => :routing do 33 | it "routes /about to the pages controller" do 34 | expect(:get => "/pages/about"). 35 | to route_to(:controller => "pages", :action => "about") 36 | end 37 | end 38 | 39 | RSpec.describe "Routes for pages index", :type => :routing do 40 | it "routes /index to the pages controller" do 41 | expect(:get => "/pages/index"). 42 | to route_to(:controller => "pages", :action => "index") 43 | end 44 | end 45 | 46 | 47 | RSpec.describe "Routes for pages dashboard", :type => :routing do 48 | it "routes /dashboard to the pages controller" do 49 | expect(:get => "/pages/dashboard"). 50 | to route_to(:controller => "pages", :action => "dashboard") 51 | end 52 | end 53 | 54 | 55 | -------------------------------------------------------------------------------- /spec/controllers/tweets_controller_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe TweetsController, :type => :controller do 4 | 5 | end 6 | -------------------------------------------------------------------------------- /spec/controllers/users_controller_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe UsersController, :type => :controller do 4 | 5 | 6 | end 7 | -------------------------------------------------------------------------------- /spec/factories/labels.rb: -------------------------------------------------------------------------------- 1 | FactoryGirl.define do 2 | factory :label do 3 | tweet_id 1 4 | label "MyString" 5 | probability 1.5 6 | hashtag "" 7 | count 1 8 | end 9 | 10 | end 11 | -------------------------------------------------------------------------------- /spec/factories/tweets.rb: -------------------------------------------------------------------------------- 1 | FactoryGirl.define do 2 | factory :tweet do 3 | 4 | end 5 | 6 | end 7 | -------------------------------------------------------------------------------- /spec/factories/users.rb: -------------------------------------------------------------------------------- 1 | FactoryGirl.define do 2 | factory :user do 3 | 4 | end 5 | 6 | end 7 | -------------------------------------------------------------------------------- /spec/models/category_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe Category, :type => :model do 4 | 5 | describe "has_many relationship" do 6 | it { should have_many(:category_tags) } 7 | end 8 | 9 | describe "has_many through relationship" do 10 | it { should have_many(:tags).through(:category_tags) } 11 | end 12 | 13 | it "name cannot be number" do 14 | c = Category.new name: 7 15 | expect(c.name == 7).to be false 16 | end 17 | end -------------------------------------------------------------------------------- /spec/models/category_tag_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe CategoryTag, :type => :model do 4 | 5 | describe "belongs_to category relationship" do 6 | it { should belong_to(:category) } 7 | end 8 | 9 | describe "belongs_to tag relationship" do 10 | it { should belong_to(:tag) } 11 | end 12 | 13 | it "category_id cannot be a name" do 14 | c = CategoryTag.new category_id: "Home" 15 | expect(c.category_id == "Home").to be false 16 | end 17 | 18 | it "tag_id cannot be a name" do 19 | c = CategoryTag.new tag_id: "Home" 20 | expect(c.category_id == "Home").to be false 21 | end 22 | end -------------------------------------------------------------------------------- /spec/models/label_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe Label, :type => :model do 4 | 5 | it "tweet_id cannot be string" do 6 | l = Label.new tweet_id: "tweet" 7 | expect(l.tweet_id == "tweet").to be false 8 | end 9 | 10 | it "label cannot be integer" do 11 | l = Label.new label: 5 12 | expect(l.label == 5).to be false 13 | end 14 | 15 | it "probability is a float" do 16 | l = Label.new probability: 1.23 17 | expect(l.probability == 1.23).to be true 18 | end 19 | 20 | it "count is an integer" do 21 | l = Label.new count: 1 22 | expect(l.count == 1).to be true 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /spec/models/tag_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe Tag, :type => :model do 4 | 5 | describe "has_many category_tag relationship" do 6 | it { should have_many(:category_tags) } 7 | end 8 | 9 | describe "has_many categories through category_tag relationship" do 10 | it { should have_many(:categories).through(:category_tags)} 11 | end 12 | 13 | it "category_id cannot be a name" do 14 | t = Tag.new category_id: "Home" 15 | expect(t.category_id == "Home").to be false 16 | end 17 | 18 | it "name cannot be number" do 19 | t = Tag.new name: 7 20 | expect(t.name == 7).to be false 21 | end 22 | 23 | end -------------------------------------------------------------------------------- /spec/models/tweet_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe Tweet, :type => :model do 4 | 5 | it "content should be string" do 6 | t = Tweet.new content: "string" 7 | expect(t.content == "string").to be true 8 | end 9 | 10 | end -------------------------------------------------------------------------------- /spec/models/user_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe User, :type => :model do 4 | 5 | end 6 | -------------------------------------------------------------------------------- /spec/rails_helper.rb: -------------------------------------------------------------------------------- 1 | # This file is copied to spec/ when you run 'rails generate rspec:install' 2 | 3 | #place at the top of the file 4 | require 'simplecov' 5 | SimpleCov.start 'rails' 6 | 7 | # This file is copied to spec/ when you run 'rails generate rspec:install' 8 | ENV["RAILS_ENV"] ||= 'test' 9 | require 'spec_helper' 10 | require File.expand_path("../../config/environment", __FILE__) 11 | require 'rspec/rails' 12 | require 'shoulda/matchers' 13 | 14 | # Requires supporting ruby files with custom matchers and macros, etc, in 15 | # spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are 16 | # run as spec files by default. This means that files in spec/support that end 17 | # in _spec.rb will both be required and run as specs, causing the specs to be 18 | # run twice. It is recommended that you do not name files matching this glob to 19 | # end with _spec.rb. You can configure this pattern with the --pattern 20 | # option on the command line or in ~/.rspec, .rspec or `.rspec-local`. 21 | Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f } 22 | 23 | # Checks for pending migrations before tests are run. 24 | # If you are not using ActiveRecord, you can remove this line. 25 | ActiveRecord::Migration.maintain_test_schema! 26 | 27 | RSpec.configure do |config| 28 | # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures 29 | config.fixture_path = "#{::Rails.root}/spec/fixtures" 30 | 31 | # If you're not using ActiveRecord, or you'd prefer not to run each of your 32 | # examples within a transaction, remove the following line or assign false 33 | # instead of true. 34 | config.use_transactional_fixtures = true 35 | 36 | # RSpec Rails can automatically mix in different behaviours to your tests 37 | # based on their file location, for example enabling you to call `get` and 38 | # `post` in specs under `spec/controllers`. 39 | # 40 | # You can disable this behaviour by removing the line below, and instead 41 | # explicitly tag your specs with their type, e.g.: 42 | # 43 | # RSpec.describe UsersController, :type => :controller do 44 | # # ... 45 | # end 46 | # 47 | # The different available types are documented in the features, such as in 48 | # https://relishapp.com/rspec/rspec-rails/docs 49 | config.infer_spec_type_from_file_location! 50 | end 51 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | # This file was generated by the `rails generate rspec:install` command. Conventionally, all 2 | # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. 3 | # The generated `.rspec` file contains `--require spec_helper` which will cause this 4 | # file to always be loaded, without a need to explicitly require it in any files. 5 | # 6 | # Given that it is always loaded, you are encouraged to keep this file as 7 | # light-weight as possible. Requiring heavyweight dependencies from this file 8 | # will add to the boot time of your test suite on EVERY test run, even for an 9 | # individual file that may not need all of that loaded. Instead, make a 10 | # separate helper file that requires this one and then use it only in the specs 11 | # that actually need it. 12 | # 13 | # The `.rspec` file also contains a few flags that are not defaults but that 14 | # users commonly want. 15 | # 16 | # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration 17 | RSpec.configure do |config| 18 | # The settings below are suggested to provide a good initial experience 19 | # with RSpec, but feel free to customize to your heart's content. 20 | =begin 21 | # These two settings work together to allow you to limit a spec run 22 | # to individual examples or groups you care about by tagging them with 23 | # `:focus` metadata. When nothing is tagged with `:focus`, all examples 24 | # get run. 25 | config.filter_run :focus 26 | config.run_all_when_everything_filtered = true 27 | 28 | # Many RSpec users commonly either run the entire suite or an individual 29 | # file, and it's useful to allow more verbose output when running an 30 | # individual spec file. 31 | if config.files_to_run.one? 32 | # Use the documentation formatter for detailed output, 33 | # unless a formatter has already been configured 34 | # (e.g. via a command-line flag). 35 | config.default_formatter = 'doc' 36 | end 37 | 38 | # Print the 10 slowest examples and example groups at the 39 | # end of the spec run, to help surface which specs are running 40 | # particularly slow. 41 | config.profile_examples = 10 42 | 43 | # Run specs in random order to surface order dependencies. If you find an 44 | # order dependency and want to debug it, you can fix the order by providing 45 | # the seed, which is printed after each run. 46 | # --seed 1234 47 | config.order = :random 48 | 49 | # Seed global randomization in this process using the `--seed` CLI option. 50 | # Setting this allows you to use `--seed` to deterministically reproduce 51 | # test failures related to randomization by passing the same `--seed` value 52 | # as the one that triggered the failure. 53 | Kernel.srand config.seed 54 | 55 | # rspec-expectations config goes here. You can use an alternate 56 | # assertion/expectation library such as wrong or the stdlib/minitest 57 | # assertions if you prefer. 58 | config.expect_with :rspec do |expectations| 59 | # Enable only the newer, non-monkey-patching expect syntax. 60 | # For more details, see: 61 | # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax 62 | expectations.syntax = :expect 63 | end 64 | 65 | # rspec-mocks config goes here. You can use an alternate test double 66 | # library (such as bogus or mocha) by changing the `mock_with` option here. 67 | config.mock_with :rspec do |mocks| 68 | # Enable only the newer, non-monkey-patching expect syntax. 69 | # For more details, see: 70 | # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ 71 | mocks.syntax = :expect 72 | 73 | # Prevents you from mocking or stubbing a method that does not exist on 74 | # a real object. This is generally recommended. 75 | mocks.verify_partial_doubles = true 76 | end 77 | =end 78 | end 79 | -------------------------------------------------------------------------------- /spec/views/errors/file_not_found.html.erb_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe "errors/file_not_found.html.erb", :type => :view do 4 | pending "add some examples to (or delete) #{__FILE__}" 5 | end 6 | -------------------------------------------------------------------------------- /spec/views/errors/internal_server_error.html.erb_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe "errors/internal_server_error.html.erb", :type => :view do 4 | pending "add some examples to (or delete) #{__FILE__}" 5 | end 6 | -------------------------------------------------------------------------------- /spec/views/errors/unprocessable.html.erb_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe "errors/unprocessable.html.erb", :type => :view do 4 | pending "add some examples to (or delete) #{__FILE__}" 5 | end 6 | -------------------------------------------------------------------------------- /vendor/assets/javascripts/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/vendor/assets/javascripts/.keep -------------------------------------------------------------------------------- /vendor/assets/stylesheets/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rysmith/hashrobot/e841f01d004ed99baaca86179a1f1953f3294a51/vendor/assets/stylesheets/.keep --------------------------------------------------------------------------------