├── .gitattributes ├── Application ├── .gitignore ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── README.rdoc ├── Rakefile ├── app │ ├── assets │ │ ├── images │ │ │ ├── .keep │ │ │ ├── a.gif │ │ │ ├── b1.png │ │ │ ├── b2.png │ │ │ ├── b3.png │ │ │ ├── b4.png │ │ │ ├── b5.png │ │ │ ├── b7.png │ │ │ └── loader.gif │ │ ├── javascripts │ │ │ ├── app.js │ │ │ ├── app2.js │ │ │ ├── application.js │ │ │ ├── jquery-1.10.2.min.js │ │ │ ├── pages.coffee │ │ │ ├── scraper.js │ │ │ └── scraper2.js │ │ └── stylesheets │ │ │ ├── application.css │ │ │ ├── foundation.css │ │ │ ├── foundation.min.css │ │ │ ├── pages.scss │ │ │ ├── style.css │ │ │ └── styles.css │ ├── controllers │ │ ├── application_controller.rb │ │ ├── believes_controller.rb │ │ ├── compares_controller.rb │ │ ├── concerns │ │ │ └── .keep │ │ ├── contributions_controller.rb │ │ ├── funfacts_controller.rb │ │ └── pages_controller.rb │ ├── helpers │ │ ├── application_helper.rb │ │ └── pages_helper.rb │ ├── mailers │ │ └── .keep │ ├── models │ │ ├── .keep │ │ └── concerns │ │ │ └── .keep │ └── views │ │ ├── believes │ │ └── home.html.erb │ │ ├── compares │ │ ├── home_v1_2.html.erb │ │ └── org.html.erb │ │ ├── contributions │ │ └── home.html.erb │ │ ├── funfacts │ │ ├── new_issues.html.erb │ │ ├── new_users.html.erb │ │ └── oldest_issues.html.erb │ │ ├── layouts │ │ ├── _battle.html.erb │ │ ├── _head.html.erb │ │ ├── _org.html.erb │ │ └── application.html.erb │ │ └── pages │ │ └── home.html.erb ├── bin │ ├── bundle │ ├── rails │ ├── rake │ └── setup ├── 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 │ │ ├── session_store.rb │ │ └── wrap_parameters.rb │ ├── locales │ │ └── en.yml │ ├── routes.rb │ └── secrets.yml ├── db │ └── seeds.rb ├── lib │ ├── assets │ │ └── .keep │ └── tasks │ │ └── .keep ├── log │ └── .keep ├── public │ ├── 404.html │ ├── 422.html │ ├── 500.html │ ├── favicon.ico │ └── robots.txt ├── test │ ├── controllers │ │ ├── .keep │ │ └── pages_controller_test.rb │ ├── fixtures │ │ └── .keep │ ├── helpers │ │ └── .keep │ ├── integration │ │ └── .keep │ ├── mailers │ │ └── .keep │ ├── models │ │ └── .keep │ └── test_helper.rb └── vendor │ └── assets │ ├── javascripts │ └── .keep │ └── stylesheets │ └── .keep ├── LICENSE ├── Preview ├── adichat.jpg ├── adichat.svg ├── github_compare.gif ├── preview_1.2.0.gif ├── repository-hunter.gif └── repository_hunter_1.3.gif └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | *.html linguist-language=Ruby 2 | *.erb linguist-language=Ruby -------------------------------------------------------------------------------- /Application/.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 the default SQLite database. 11 | /db/*.sqlite3 12 | /db/*.sqlite3-journal 13 | 14 | # Ignore all logfiles and tempfiles. 15 | /config/secrets.yml 16 | /log/* 17 | !/log/.keep 18 | /tmp 19 | -------------------------------------------------------------------------------- /Application/Gemfile: -------------------------------------------------------------------------------- 1 | source 'http://rubygems.org' 2 | 3 | 4 | # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' 5 | gem 'rails', '4.2.4' 6 | # Use sqlite3 as the database for Active Record 7 | group :development, :test do 8 | gem 'sqlite3' 9 | end 10 | group :production do 11 | gem 'pg', '~> 0.19' 12 | end 13 | # Use SCSS for stylesheets 14 | gem 'sass-rails', '~> 5.0' 15 | # Use Uglifier as compressor for JavaScript assets 16 | gem 'uglifier', '>= 1.3.0' 17 | # Use CoffeeScript for .coffee assets and views 18 | gem 'coffee-rails', '~> 4.1.0' 19 | # See https://github.com/rails/execjs#readme for more supported runtimes 20 | # gem 'therubyracer', platforms: :ruby 21 | #Contribution graph feature 22 | gem 'githubchart', '1.0.1' 23 | # Use jquery as the JavaScript library 24 | gem 'jquery-rails' 25 | # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks 26 | gem 'turbolinks' 27 | # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder 28 | gem 'jbuilder', '~> 2.0' 29 | # bundle exec rake doc:rails generates the API under doc/api. 30 | gem 'sdoc', '~> 0.4.0', group: :doc 31 | 32 | # Use ActiveModel has_secure_password 33 | # gem 'bcrypt', '~> 3.1.7' 34 | 35 | # Use Unicorn as the app server 36 | # gem 'unicorn' 37 | 38 | # Use Capistrano for deployment 39 | # gem 'capistrano-rails', group: :development 40 | 41 | group :development, :test do 42 | # Call 'byebug' anywhere in the code to stop execution and get a debugger console 43 | gem 'byebug' 44 | end 45 | 46 | group :development do 47 | # Access an IRB console on exception pages or by using <%= console %> in views 48 | gem 'web-console', '~> 2.0' 49 | end -------------------------------------------------------------------------------- /Application/Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | actionmailer (4.2.4) 5 | actionpack (= 4.2.4) 6 | actionview (= 4.2.4) 7 | activejob (= 4.2.4) 8 | mail (~> 2.5, >= 2.5.4) 9 | rails-dom-testing (~> 1.0, >= 1.0.5) 10 | actionpack (4.2.4) 11 | actionview (= 4.2.4) 12 | activesupport (= 4.2.4) 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.2) 17 | actionview (4.2.4) 18 | activesupport (= 4.2.4) 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.2) 23 | activejob (4.2.4) 24 | activesupport (= 4.2.4) 25 | globalid (>= 0.3.0) 26 | activemodel (4.2.4) 27 | activesupport (= 4.2.4) 28 | builder (~> 3.1) 29 | activerecord (4.2.4) 30 | activemodel (= 4.2.4) 31 | activesupport (= 4.2.4) 32 | arel (~> 6.0) 33 | activesupport (4.2.4) 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 | arel (6.0.3) 40 | binding_of_caller (0.7.2) 41 | debug_inspector (>= 0.0.1) 42 | builder (3.2.2) 43 | byebug (8.2.1) 44 | coffee-rails (4.1.0) 45 | coffee-script (>= 2.2.0) 46 | railties (>= 4.0.0, < 5.0) 47 | coffee-script (2.4.1) 48 | coffee-script-source 49 | execjs 50 | coffee-script-source (1.10.0) 51 | concurrent-ruby (1.0.0) 52 | debug_inspector (0.0.2) 53 | erubis (2.7.0) 54 | execjs (2.6.0) 55 | globalid (0.3.6) 56 | activesupport (>= 4.1.0) 57 | i18n (0.7.0) 58 | jbuilder (2.3.2) 59 | activesupport (>= 3.0.0, < 5) 60 | multi_json (~> 1.2) 61 | jquery-rails (4.0.5) 62 | rails-dom-testing (~> 1.0) 63 | railties (>= 4.2.0) 64 | thor (>= 0.14, < 2.0) 65 | json (1.8.3) 66 | loofah (2.0.3) 67 | nokogiri (>= 1.5.9) 68 | mail (2.6.3) 69 | mime-types (>= 1.16, < 3) 70 | mime-types (2.99) 71 | mini_portile2 (2.0.0) 72 | minitest (5.8.3) 73 | multi_json (1.11.2) 74 | nokogiri (1.6.7-x86-mingw32) 75 | mini_portile2 (~> 2.0.0.rc2) 76 | pg (0.18.4-x86-mingw32) 77 | rack (1.6.4) 78 | rack-test (0.6.3) 79 | rack (>= 1.0) 80 | rails (4.2.4) 81 | actionmailer (= 4.2.4) 82 | actionpack (= 4.2.4) 83 | actionview (= 4.2.4) 84 | activejob (= 4.2.4) 85 | activemodel (= 4.2.4) 86 | activerecord (= 4.2.4) 87 | activesupport (= 4.2.4) 88 | bundler (>= 1.3.0, < 2.0) 89 | railties (= 4.2.4) 90 | sprockets-rails 91 | rails-deprecated_sanitizer (1.0.3) 92 | activesupport (>= 4.2.0.alpha) 93 | rails-dom-testing (1.0.7) 94 | activesupport (>= 4.2.0.beta, < 5.0) 95 | nokogiri (~> 1.6.0) 96 | rails-deprecated_sanitizer (>= 1.0.1) 97 | rails-html-sanitizer (1.0.2) 98 | loofah (~> 2.0) 99 | railties (4.2.4) 100 | actionpack (= 4.2.4) 101 | activesupport (= 4.2.4) 102 | rake (>= 0.8.7) 103 | thor (>= 0.18.1, < 2.0) 104 | rake (10.4.2) 105 | rdoc (4.2.0) 106 | json (~> 1.4) 107 | sass (3.4.20) 108 | sass-rails (5.0.4) 109 | railties (>= 4.0.0, < 5.0) 110 | sass (~> 3.1) 111 | sprockets (>= 2.8, < 4.0) 112 | sprockets-rails (>= 2.0, < 4.0) 113 | tilt (>= 1.1, < 3) 114 | sdoc (0.4.1) 115 | json (~> 1.7, >= 1.7.7) 116 | rdoc (~> 4.0) 117 | sprockets (3.5.2) 118 | concurrent-ruby (~> 1.0) 119 | rack (> 1, < 3) 120 | sprockets-rails (2.3.3) 121 | actionpack (>= 3.0) 122 | activesupport (>= 3.0) 123 | sprockets (>= 2.8, < 4.0) 124 | sqlite3 (1.3.11-x86-mingw32) 125 | thor (0.19.1) 126 | thread_safe (0.3.5) 127 | tilt (2.0.1) 128 | turbolinks (2.5.3) 129 | coffee-rails 130 | tzinfo (1.2.2) 131 | thread_safe (~> 0.1) 132 | tzinfo-data (1.2015.7) 133 | tzinfo (>= 1.0.0) 134 | uglifier (2.7.2) 135 | execjs (>= 0.3.0) 136 | json (>= 1.8.0) 137 | web-console (2.2.1) 138 | activemodel (>= 4.0) 139 | binding_of_caller (>= 0.7.2) 140 | railties (>= 4.0) 141 | sprockets-rails (>= 2.0, < 4.0) 142 | 143 | PLATFORMS 144 | x86-mingw32 145 | 146 | DEPENDENCIES 147 | byebug 148 | coffee-rails (~> 4.1.0) 149 | jbuilder (~> 2.0) 150 | jquery-rails 151 | pg 152 | rails (= 4.2.4) 153 | sass-rails (~> 5.0) 154 | sdoc (~> 0.4.0) 155 | sqlite3 156 | turbolinks 157 | tzinfo-data 158 | uglifier (>= 1.3.0) 159 | web-console (~> 2.0) 160 | -------------------------------------------------------------------------------- /Application/LICENSE: -------------------------------------------------------------------------------- 1 | CC0 1.0 Universal 2 | 3 | Statement of Purpose 4 | 5 | The laws of most jurisdictions throughout the world automatically confer 6 | exclusive Copyright and Related Rights (defined below) upon the creator and 7 | subsequent owner(s) (each and all, an "owner") of an original work of 8 | authorship and/or a database (each, a "Work"). 9 | 10 | Certain owners wish to permanently relinquish those rights to a Work for the 11 | purpose of contributing to a commons of creative, cultural and scientific 12 | works ("Commons") that the public can reliably and without fear of later 13 | claims of infringement build upon, modify, incorporate in other works, reuse 14 | and redistribute as freely as possible in any form whatsoever and for any 15 | purposes, including without limitation commercial purposes. These owners may 16 | contribute to the Commons to promote the ideal of a free culture and the 17 | further production of creative, cultural and scientific works, or to gain 18 | reputation or greater distribution for their Work in part through the use and 19 | efforts of others. 20 | 21 | For these and/or other purposes and motivations, and without any expectation 22 | of additional consideration or compensation, the person associating CC0 with a 23 | Work (the "Affirmer"), to the extent that he or she is an owner of Copyright 24 | and Related Rights in the Work, voluntarily elects to apply CC0 to the Work 25 | and publicly distribute the Work under its terms, with knowledge of his or her 26 | Copyright and Related Rights in the Work and the meaning and intended legal 27 | effect of CC0 on those rights. 28 | 29 | 1. Copyright and Related Rights. A Work made available under CC0 may be 30 | protected by copyright and related or neighboring rights ("Copyright and 31 | Related Rights"). Copyright and Related Rights include, but are not limited 32 | to, the following: 33 | 34 | i. the right to reproduce, adapt, distribute, perform, display, communicate, 35 | and translate a Work; 36 | 37 | ii. moral rights retained by the original author(s) and/or performer(s); 38 | 39 | iii. publicity and privacy rights pertaining to a person's image or likeness 40 | depicted in a Work; 41 | 42 | iv. rights protecting against unfair competition in regards to a Work, 43 | subject to the limitations in paragraph 4(a), below; 44 | 45 | v. rights protecting the extraction, dissemination, use and reuse of data in 46 | a Work; 47 | 48 | vi. database rights (such as those arising under Directive 96/9/EC of the 49 | European Parliament and of the Council of 11 March 1996 on the legal 50 | protection of databases, and under any national implementation thereof, 51 | including any amended or successor version of such directive); and 52 | 53 | vii. other similar, equivalent or corresponding rights throughout the world 54 | based on applicable law or treaty, and any national implementations thereof. 55 | 56 | 2. Waiver. To the greatest extent permitted by, but not in contravention of, 57 | applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and 58 | unconditionally waives, abandons, and surrenders all of Affirmer's Copyright 59 | and Related Rights and associated claims and causes of action, whether now 60 | known or unknown (including existing as well as future claims and causes of 61 | action), in the Work (i) in all territories worldwide, (ii) for the maximum 62 | duration provided by applicable law or treaty (including future time 63 | extensions), (iii) in any current or future medium and for any number of 64 | copies, and (iv) for any purpose whatsoever, including without limitation 65 | commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes 66 | the Waiver for the benefit of each member of the public at large and to the 67 | detriment of Affirmer's heirs and successors, fully intending that such Waiver 68 | shall not be subject to revocation, rescission, cancellation, termination, or 69 | any other legal or equitable action to disrupt the quiet enjoyment of the Work 70 | by the public as contemplated by Affirmer's express Statement of Purpose. 71 | 72 | 3. Public License Fallback. Should any part of the Waiver for any reason be 73 | judged legally invalid or ineffective under applicable law, then the Waiver 74 | shall be preserved to the maximum extent permitted taking into account 75 | Affirmer's express Statement of Purpose. In addition, to the extent the Waiver 76 | is so judged Affirmer hereby grants to each affected person a royalty-free, 77 | non transferable, non sublicensable, non exclusive, irrevocable and 78 | unconditional license to exercise Affirmer's Copyright and Related Rights in 79 | the Work (i) in all territories worldwide, (ii) for the maximum duration 80 | provided by applicable law or treaty (including future time extensions), (iii) 81 | in any current or future medium and for any number of copies, and (iv) for any 82 | purpose whatsoever, including without limitation commercial, advertising or 83 | promotional purposes (the "License"). The License shall be deemed effective as 84 | of the date CC0 was applied by Affirmer to the Work. Should any part of the 85 | License for any reason be judged legally invalid or ineffective under 86 | applicable law, such partial invalidity or ineffectiveness shall not 87 | invalidate the remainder of the License, and in such case Affirmer hereby 88 | affirms that he or she will not (i) exercise any of his or her remaining 89 | Copyright and Related Rights in the Work or (ii) assert any associated claims 90 | and causes of action with respect to the Work, in either case contrary to 91 | Affirmer's express Statement of Purpose. 92 | 93 | 4. Limitations and Disclaimers. 94 | 95 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 96 | surrendered, licensed or otherwise affected by this document. 97 | 98 | b. Affirmer offers the Work as-is and makes no representations or warranties 99 | of any kind concerning the Work, express, implied, statutory or otherwise, 100 | including without limitation warranties of title, merchantability, fitness 101 | for a particular purpose, non infringement, or the absence of latent or 102 | other defects, accuracy, or the present or absence of errors, whether or not 103 | discoverable, all to the greatest extent permissible under applicable law. 104 | 105 | c. Affirmer disclaims responsibility for clearing rights of other persons 106 | that may apply to the Work or any use thereof, including without limitation 107 | any person's Copyright and Related Rights in the Work. Further, Affirmer 108 | disclaims responsibility for obtaining any necessary consents, permissions 109 | or other rights required for any use of the Work. 110 | 111 | d. Affirmer understands and acknowledges that Creative Commons is not a 112 | party to this document and has no duty or obligation with respect to this 113 | CC0 or use of the Work. 114 | 115 | For more information, please see 116 | 117 | 118 | -------------------------------------------------------------------------------- /Application/README.md: -------------------------------------------------------------------------------- 1 | # Repository-Hunter 2 | This is an application that is build upon the GitHub API. It is used to gain public information regarding a particular github account.
3 | The user has to enter the username of a GitHub account and this application will present all the available information. One will also be able to navigate to the user profile by clicking on the username and can also go to a particular repository of the user by clicking on the repository name.
4 | This application comes in handy when the user is concerned about the actual information and particular repositories.
5 | This is a preview of the application :
6 | ![alt text](Preview/1.png " The view of the paint application")
7 | -------------------------------------------------------------------------------- /Application/README.rdoc: -------------------------------------------------------------------------------- 1 | == README 2 | 3 | This README would normally document whatever steps are necessary to get the 4 | application up and running. 5 | 6 | Things you may want to cover: 7 | 8 | * Ruby version 9 | 10 | * System dependencies 11 | 12 | * Configuration 13 | 14 | * Database creation 15 | 16 | * Database initialization 17 | 18 | * How to run the test suite 19 | 20 | * Services (job queues, cache servers, search engines, etc.) 21 | 22 | * Deployment instructions 23 | 24 | * ... 25 | 26 | 27 | Please feel free to use a different markup language if you do not plan to run 28 | rake doc:app. 29 | -------------------------------------------------------------------------------- /Application/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 | -------------------------------------------------------------------------------- /Application/app/assets/images/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/app/assets/images/.keep -------------------------------------------------------------------------------- /Application/app/assets/images/a.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/app/assets/images/a.gif -------------------------------------------------------------------------------- /Application/app/assets/images/b1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/app/assets/images/b1.png -------------------------------------------------------------------------------- /Application/app/assets/images/b2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/app/assets/images/b2.png -------------------------------------------------------------------------------- /Application/app/assets/images/b3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/app/assets/images/b3.png -------------------------------------------------------------------------------- /Application/app/assets/images/b4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/app/assets/images/b4.png -------------------------------------------------------------------------------- /Application/app/assets/images/b5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/app/assets/images/b5.png -------------------------------------------------------------------------------- /Application/app/assets/images/b7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/app/assets/images/b7.png -------------------------------------------------------------------------------- /Application/app/assets/images/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/app/assets/images/loader.gif -------------------------------------------------------------------------------- /Application/app/assets/javascripts/app.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | var stats = ['age', 'stars', 'forks', 'repositories', 'gists', 'followers'], 4 | users = []; 5 | 6 | $(document).ready(function() { 7 | 8 | $('#submit').click(visualize); 9 | 10 | }); 11 | 12 | function visualize(e) { 13 | 14 | var scraper = new Scraper(); 15 | var $this = $(this); 16 | var $graphsContainer = $('.graphs-container'); 17 | var form = document.forms[0], 18 | promises = [], 19 | valid = true; 20 | 21 | var fail = false; 22 | var storage = typeof(Storage)!=="undefined"; 23 | 24 | users.push($(form['user_1']).val()); 25 | users.push($(form['user_2']).val()); 26 | 27 | for(var i = 0; i < users.length; i++) 28 | { 29 | if(users[i] == "") 30 | { 31 | $(form['user_' + (i + 1)]).css('border', '5px solid rgb(186, 0,0)'); 32 | valid = false; 33 | $('#submit').text('INVALID'); 34 | } 35 | else 36 | { 37 | promises.push($.Deferred(function(def) { 38 | var key = i + 1; 39 | $.ajax({ 40 | url: GITHUB + 'users/' + users[i] 41 | + IDENTITY + '&callback=?', 42 | success: function(data) { 43 | if (data.data && data.data.message == "Not Found") { 44 | $(form['user_' + key]).css('border', '5px solid rgb(186, 0,0)'); 45 | fail = true; 46 | } else { 47 | // #6 - Use the login for all future requests 48 | users[key-1] = data.data.login; 49 | } 50 | def.resolve(); 51 | }, 52 | dataType: 'jsonp' 53 | }); 54 | })); 55 | } 56 | } 57 | 58 | if(!valid) { 59 | users = []; 60 | return false; 61 | } 62 | 63 | $.when.apply(null, promises).done(function () { 64 | if(fail) { 65 | users = []; 66 | $('#submit').text('INVALID'); 67 | return false; 68 | } else { 69 | $('input').css('border', 'none'); 70 | promises = []; 71 | $('#submit').unbind('click'); 72 | $('.user2 input, .user1 input').unbind('keypress'); 73 | $this.css('cursor', 'default'); 74 | 75 | var $fight = $('#submit'), 76 | count = 0; 77 | $fight.html("Processing...
(this can take some time)
"); 78 | 79 | for(var i = 0; i < users.length; i++) { 80 | promises.push( 81 | $.Deferred( 82 | function(def) { 83 | scraper.getUserData(users[i], $('.processing-container'), def); 84 | } 85 | ) 86 | ); 87 | }; 88 | 89 | $.when.apply(null, promises).done(function(u1, u2) { 90 | setupGraphs(u1, u2, users); 91 | }); 92 | 93 | } 94 | }); 95 | 96 | } 97 | 98 | function setupGraphs(u1, u2, users) { 99 | var saver = {}, 100 | totals = { 101 | u1: 0, 102 | u2: 0 103 | }, 104 | $form = $(document.forms[0]), 105 | graphs = []; 106 | 107 | stats.forEach(function (s) { 108 | var g = setupGraph(u1, u2, s, saver, totals); 109 | graphs.push(g.hide()); 110 | }); 111 | 112 | setupWinner(u1, u2); 113 | displayGraphs($form, graphs, users); 114 | } 115 | 116 | function setupGraph(u1, u2, name, saver, totals) { 117 | var graph = graphTemplate.clone(); 118 | var r = dataFormatter(u1, u2, name, totals); 119 | saver[name] = r; 120 | r = normalize(r, name); 121 | graph.find('.label').text(formattedNames[name]); 122 | graph.find('.graph_1 h3').text(r.user1.actual); 123 | graph.find('.graph_2 h3').text(r.user2.actual); 124 | graph.find('.graph_1').css('width', r.user1.percent + '%'); 125 | graph.find('.graph_2').css('width', r.user2.percent + '%'); 126 | return graph; 127 | } 128 | 129 | function displayGraphs(form, graphs, users) { 130 | 131 | $(form).slideUp(0); 132 | 133 | var $graphsContainer = $('.graphs-container') 134 | $graphsContainer.show(); 135 | countUp($('.result_1 h2')); 136 | countUp($('.result_2 h2')); 137 | $('.winner-container').slideDown(0, function() { 138 | graphs.forEach(function(g) { 139 | $graphsContainer.append(g); 140 | g.slideDown(0); 141 | }); 142 | 143 | }); 144 | } 145 | 146 | function countUp(el) { 147 | var id = setInterval(numberCounter, 50); 148 | var time = 0; 149 | var number = parseFloat(el.data('total')); 150 | function numberCounter() { 151 | position = time / 1500; 152 | if (time == 1500) { 153 | clearInterval(id); 154 | } 155 | el.text((position * number).toFixed(2)); 156 | time += 50; 157 | } 158 | } 159 | 160 | function setupWinner(u1, u2) { 161 | var u1Score = finalScore(u1), 162 | u2Score = finalScore(u2); 163 | $('.result_1 h3').html(""+users[0]+""); 164 | $('.result_2 h3').html(""+users[1]+""); 165 | $('.result_1 h2').text(0); 166 | $('.result_2 h2').text(0); 167 | $('.result_1 h2').data('total', u1Score); 168 | $('.result_2 h2').data('total', u2Score); 169 | var twitter; 170 | if(parseFloat(u1Score) > parseFloat(u2Score)) { 171 | $('.result_2 h3, .result_2 h2').addClass('loser'); 172 | $('.result_1 h3, .result_1 h2').addClass('winner'); 173 | } else { 174 | $('.result_1 h3, .result_1 h2').addClass('loser'); 175 | $('.result_2 h3, .result_2 h2').addClass('winner'); 176 | } 177 | if(typeof twttr !== 'undefined') { 178 | $('.retry-container').prepend(twitter); 179 | twttr.widgets.load(); 180 | } 181 | } 182 | 183 | var graphTemplate = $("
\ 184 |
\ 185 |

Commits

\ 186 |
\ 187 |
\ 188 |

63

\ 189 |

20

\ 190 |
\ 191 |
"); 192 | 193 | var formattedNames = { 194 | 'age': '👵 Age 👴', 195 | 'forks': '🍴 Forks 🍴', 196 | 'stars': '🌟 Stars 🌟', 197 | 'repositories': '🔖 Repositories 🔖', 198 | 'gists': '📎 Gists 📎', 199 | 'watchers': 'watchers', 200 | 'followers': '🎈 Followers 🎈' 201 | } 202 | 203 | function normalize(r, name) { 204 | if(r.user1.percent < 10) { 205 | r.user1.percent = 15; 206 | r.user2.percent = 84; 207 | } else if (r.user2.percent < 10) { 208 | r.user2.percent = 15; 209 | r.user1.percent = 84; 210 | } else if (r.user2.percent + r.user1.percent === 100) { 211 | r.user1.percent -= 1; 212 | } 213 | if(name == 'commits' || name == 'stars' || name == 'forks') { 214 | if(r.user1.actual == 0) r.user1.actual = '~0'; 215 | if(r.user2.actual == 0) r.user2.actual = '~0'; 216 | } 217 | if(name === 'gists') { 218 | if(r.user1.actual > 100) r.user1.actual = '100+'; 219 | if(r.user2.actual > 100) r.user2.actual = '100+'; 220 | } 221 | return r; 222 | } 223 | 224 | function dataFormatter(user1, user2, stat) { 225 | if(stat == 'age') { 226 | var init_date_1 = Date.parse(user1.age), 227 | init_date_2 = Date.parse(user2.age), 228 | today = Date.parse(new Date()); 229 | var diff1 = Math.floor(((today - init_date_1) / 86400000)), 230 | diff2 = Math.floor(((today - init_date_2) / 86400000)); 231 | var dp1 = Math.floor(diff1 / (diff1 + diff2) * 100), 232 | dp2 = Math.floor(diff2 / (diff1 + diff2) * 100); 233 | 234 | return { 235 | user1: { 236 | "actual" : diff1, 237 | "percent" : dp1 238 | }, 239 | user2: { 240 | "actual" : diff2, 241 | "percent": dp2 242 | } 243 | } 244 | } else if (stat == 'forks' || stat == 'stars') { 245 | if(user1.repositories !== 0) { 246 | var ratio1 = Math.round((user1[stat] / user1.repositories * 10)) / 10; 247 | } else { 248 | var ratio1 = 0; 249 | } 250 | if(user2.repositories !== 0) { 251 | var ratio2 = Math.round((user2[stat] / user2.repositories * 10)) / 10; 252 | } else { 253 | var ratio2 = 0; 254 | } 255 | 256 | if(ratio1 + ratio2 == 0) { 257 | var dp1 = 50, 258 | dp2 = 50; 259 | } else { 260 | var dp1 = Math.floor((ratio1 / (ratio1 + ratio2)) * 100), 261 | dp2 = Math.floor((ratio2 / (ratio1 + ratio2)) * 100); 262 | } 263 | 264 | return { 265 | user1: { 266 | "actual" : user1[stat], 267 | "percent" : dp1 268 | }, 269 | user2: { 270 | "actual" : user2[stat], 271 | "percent": dp2 272 | } 273 | }; 274 | } else if (stat == 'commits') { 275 | var init_date_1 = Date.parse(user1.age), 276 | init_date_2 = Date.parse(user2.age), 277 | today = Date.parse(new Date()); 278 | var diff1 = Math.floor(((today - init_date_1) / 86400000)), 279 | diff2 = Math.floor(((today - init_date_2) / 86400000)); 280 | if (diff1 !== 0 && user1.commits !== 0) { 281 | var ratio1 = Math.floor((user1.commits / diff1 * 10)) / 10; 282 | } else { 283 | var ratio1 = 0; 284 | } 285 | 286 | if (diff2 !== 0 && user2.commits !== 0) { 287 | var ratio2 = Math.floor((user2.commits / diff2 * 10)) / 10; 288 | } else { 289 | var ratio2 = 0; 290 | } 291 | 292 | if (ratio1 + ratio2 === 0) { 293 | var dp1 = 50, 294 | dp2 = 50; 295 | } else { 296 | var dp1 = Math.floor((ratio1 / (ratio1 + ratio2)) * 100), 297 | dp2 = Math.floor((ratio2 / (ratio1 + ratio2)) * 100); 298 | } 299 | 300 | return { 301 | user1: { 302 | "actual" : ratio1, 303 | "percent" : dp1 304 | }, 305 | user2: { 306 | "actual" : ratio2, 307 | "percent": dp2 308 | } 309 | }; 310 | } else if (stat === 'gists' || stat === 'repositories' || stat === 'followers' || stat == 'watchers') { 311 | var total = (user1[stat] + user2[stat]); 312 | if (total === 0) { 313 | var dp1 = 50, 314 | dp2 = 50; 315 | } else { 316 | var dp1 = Math.floor(user1[stat] / total * 100); 317 | var dp2 = Math.floor(user2[stat] / total * 100); 318 | } 319 | 320 | return { 321 | user1: { 322 | 'actual': user1[stat], 323 | 'percent': dp1 324 | }, 325 | user2: { 326 | 'actual': user2[stat], 327 | 'percent': dp2 328 | } 329 | } 330 | } 331 | } 332 | 333 | function finalScore(user) { 334 | 335 | var time = user.age, 336 | repos = user.repositories, 337 | commits = user.commits, 338 | forks = user.forks, 339 | stars = user.stars, 340 | followers = user.followers, 341 | watchers = user.watchers, 342 | gists = user.gists; 343 | 344 | // all times in seconds 345 | var github_founding_time = 1206835200 346 | user_init_time = (Date.parse(time) / 1000), 347 | now_time = (Date.parse(new Date()) / 1000), 348 | diff_time = now_time - user_init_time; 349 | 350 | /* 351 | * Perfect scores are in () 352 | */ 353 | 354 | var raw_score_followers = Math.sqrt(followers / repos) ; 355 | 356 | if (raw_score_followers > 5) 357 | raw_score_followers = 5; 358 | 359 | if (now_time - github_founding_time != 0) 360 | var raw_score_age = (now_time - user_init_time) / (now_time - github_founding_time); 361 | else 362 | var raw_score_age = 0; 363 | 364 | var raw_score_repo = 0; 365 | if(repos > 100) 366 | raw_score_repo = 1; 367 | else 368 | raw_score_repo = (repos/100); 369 | 370 | 371 | if (repos > 0) 372 | { 373 | var raw_score_fpr = Math.sqrt(forks / repos) / 15; 374 | if(raw_score_fpr > 1) 375 | raw_score_fpr = 1; 376 | } else { 377 | var raw_score_fpr = 0; 378 | } 379 | 380 | if (repos > 0) { 381 | var raw_score_spr = Math.sqrt(stars / repos) / 31; 382 | if(raw_score_spr > 1) { 383 | raw_score_spr = 1; 384 | } 385 | } else { 386 | var raw_score_spr = 0; 387 | } 388 | 389 | // add weights 390 | var final_score = ((raw_score_age * 0.1) + (raw_score_repo * 0.1) + (raw_score_fpr * 0.5) + (raw_score_spr * 0.7) + raw_score_followers * 0.1) * 100; 391 | 392 | return final_score.toFixed(2); 393 | } -------------------------------------------------------------------------------- /Application/app/assets/javascripts/app2.js: -------------------------------------------------------------------------------- 1 | 2 | //4e7359d229f0b2ccf10bbdfa1cc78565c4844b9e 3 | 4 | var stats = ['age', 'stars', 'forks', 'commits', 'repositories', 'gists', 'followers'], 5 | users = []; 6 | cou = 0; 7 | 8 | score_org = []; 9 | 10 | $(document).ready(function() { 11 | 12 | $('#submit').click(fillusers); 13 | 14 | }); 15 | 16 | function fillusers() { 17 | var form = document.forms[0]; 18 | var link = 'https://api.github.com/orgs/'+$(form['organization']).val()+'/public_members?per_page=100&page='; 19 | 20 | var count = 1; 21 | var check_data = ''; 22 | var promises1 = []; 23 | var ccff = 0; 24 | 25 | do 26 | { 27 | console.log(count); 28 | 29 | $.getJSON(link+count, function(json){ 30 | users_follow = json; 31 | check_data = json; 32 | outputPageContent1(); 33 | }); 34 | count++; 35 | }while(count < 5); 36 | 37 | function outputPageContent1() { 38 | 39 | console.log("pp"); 40 | 41 | if(users_follow.length == 0) { if(ccff == 0){ ccff=1; users.push("eviladichat");} else { ccff=1; }} 42 | else { 43 | $.each(users_follow, function(index) { 44 | users.push(users_follow[index].login); 45 | console.log(users.length); 46 | }); 47 | } 48 | } 49 | 50 | console.log(users); 51 | 52 | 53 | function checkIfFinished(){ 54 | return($.inArray("eviladichat", users)>-1); 55 | } 56 | 57 | var timeout = setInterval(function() 58 | { if(checkIfFinished()) 59 | { 60 | clearInterval(timeout); 61 | isFinished = true; 62 | console.log("meow"); 63 | var index = $.inArray("eviladichat", users); 64 | if (index > -1) { 65 | users.splice(index, 1); 66 | } 67 | visualize(); 68 | } }, 100); 69 | 70 | 71 | } 72 | 73 | function visualize() { 74 | 75 | var scraper = new Scraper(); 76 | var $this = $(this); 77 | var $graphsContainer = $('.graphs-container'); 78 | var form = document.forms[0], 79 | promises = [], 80 | valid = true; 81 | 82 | var fail = false; 83 | var storage = typeof(Storage)!=="undefined"; 84 | 85 | 86 | 87 | for(var i = 0; i < users.length; i++) 88 | { 89 | if(users[i] == "") 90 | { 91 | $(form['user_' + (i + 1)]).css('border', '5px solid rgb(186, 0,0)'); 92 | valid = false; 93 | $('#submit').text('INVALID'); 94 | } 95 | else 96 | { 97 | promises.push($.Deferred(function(def) { 98 | var key = i + 1; 99 | $.ajax({ 100 | url: GITHUB + 'users/' + users[i] 101 | + IDENTITY + '&callback=?', 102 | success: function(data) { 103 | if (data.data && data.data.message == "Not Found") { 104 | $(form['user_' + key]).css('border', '5px solid rgb(186, 0,0)'); 105 | fail = true; 106 | } else { 107 | // #6 - Use the login for all future requests 108 | users[key-1] = data.data.login; 109 | } 110 | def.resolve(); 111 | }, 112 | dataType: 'jsonp' 113 | }); 114 | })); 115 | } 116 | } 117 | 118 | if(!valid) { 119 | users = []; 120 | return false; 121 | } 122 | 123 | $.when.apply(null, promises).done(function () { 124 | if(fail) { 125 | users = []; 126 | $('#submit').text('INVALID'); 127 | return false; 128 | } else { 129 | $('input').css('border', 'none'); 130 | promises = []; 131 | $('#submit').unbind('click'); 132 | $('.user2 input, .user1 input').unbind('keypress'); 133 | $this.css('cursor', 'default'); 134 | 135 | var $fight = $('#submit'), 136 | count = 0; 137 | $fight.html("Comparing people just for you
(this can take some time)
"); 138 | 139 | for(var i = 0; i < users.length; i++) { 140 | promises.push( 141 | $.Deferred( 142 | function(def) { 143 | scraper.getUserData(users[i], $('.processing-container'), def); 144 | } 145 | ) 146 | ); 147 | }; 148 | 149 | cou = 0; 150 | 151 | /* 152 | for(var i=0; i').text(row[j]); 220 | date2 = document.createTextNode(row[j]); 221 | if(j==0) 222 | date2 = document.createTextNode(row[j]); 223 | th2.appendChild(date2); 224 | y2.appendChild(th2); 225 | 226 | } 227 | } 228 | 229 | document.body.appendChild(document.createElement('br')); 230 | document.body.appendChild(document.createElement('br')); 231 | } 232 | 233 | } 234 | 235 | }).done(i++); 236 | 237 | } 238 | } 239 | }); 240 | 241 | } 242 | 243 | function setupGraphs(u1, u2, promises, users) { 244 | var saver = {}, 245 | totals = { 246 | u1: 0, 247 | u2: 0 248 | }, 249 | $form = $(document.forms[0]), 250 | graphs = []; 251 | 252 | stats.forEach(function (s) { 253 | var g = setupGraph(u1, u2, s, saver, totals); 254 | graphs.push(g.hide()); 255 | }); 256 | 257 | setupWinner(u1, u2); 258 | displayGraphs($form, graphs, users); 259 | 260 | } 261 | 262 | function setupGraph(u1, u2, name, saver, totals) { 263 | var graph = graphTemplate.clone(); 264 | var r = dataFormatter(u1, u2, name, totals); 265 | saver[name] = r; 266 | r = normalize(r, name); 267 | graph.find('.label').text(formattedNames[name]); 268 | graph.find('.graph_1 h3').text(r.user1.actual); 269 | graph.find('.graph_2 h3').text(r.user2.actual); 270 | graph.find('.graph_1').css('width', r.user1.percent + '%'); 271 | graph.find('.graph_2').css('width', r.user2.percent + '%'); 272 | return graph; 273 | } 274 | 275 | function displayGraphs(form, graphs, users) { 276 | 277 | $(form).slideUp(500); 278 | 279 | var $graphsContainer = $('.graphs-container') 280 | $graphsContainer.show(); 281 | countUp($('.result_1 h2')); 282 | countUp($('.result_2 h2')); 283 | $('.winner-container').slideDown(2000, function() { 284 | graphs.forEach(function(g) { 285 | $graphsContainer.append(g); 286 | g.slideDown(1000); 287 | }); 288 | 289 | }); 290 | } 291 | 292 | function countUp(el) { 293 | var id = setInterval(numberCounter, 50); 294 | var time = 0; 295 | var number = parseFloat(el.data('total')); 296 | function numberCounter() { 297 | position = time / 1500; 298 | if (time == 1500) { 299 | clearInterval(id); 300 | } 301 | el.text((position * number).toFixed(2)); 302 | time += 50; 303 | } 304 | } 305 | 306 | function setupWinner(u1, u2) { 307 | var u1Score = finalScore(u1), 308 | u2Score = finalScore(u2); 309 | $('.result_1 h3').html(""+users[0]+""); 310 | $('.result_2 h3').html(""+users[1]+""); 311 | $('.result_1 h2').text(0); 312 | $('.result_2 h2').text(0); 313 | $('.result_1 h2').data('total', u1Score); 314 | $('.result_2 h2').data('total', u2Score); 315 | var twitter; 316 | if(parseFloat(u1Score) > parseFloat(u2Score)) { 317 | $('.result_2 h3, .result_2 h2').addClass('loser'); 318 | $('.result_1 h3, .result_1 h2').addClass('winner'); 319 | twitter = twitterTemplate(users[0], users[1], u1Score, u2Score); 320 | } else { 321 | $('.result_1 h3, .result_1 h2').addClass('loser'); 322 | $('.result_2 h3, .result_2 h2').addClass('winner'); 323 | twitter = twitterTemplate(users[1], users[0], u2Score, u1Score); 324 | } 325 | if(typeof twttr !== 'undefined') { 326 | $('.retry-container').prepend(twitter); 327 | twttr.widgets.load(); 328 | } 329 | } 330 | 331 | var graphTemplate = $("
\ 332 |
\ 333 |

Commits

\ 334 |
\ 335 |
\ 336 |

63

\ 337 |

20

\ 338 |
\ 339 |
"); 340 | 341 | function twitterTemplate(w, l, wScore, lScore) { 342 | return $(""); 349 | } 350 | 351 | 352 | var formattedNames = { 353 | 'age': 'Age (days)', 354 | 'forks': 'Forks/repo', 355 | 'stars': 'Stars/repo', 356 | 'commits': 'Commits/day', 357 | 'repositories': 'Repos', 358 | 'gists': 'Gists', 359 | 'followers': 'Followers' 360 | } 361 | 362 | function normalize(r, name) { 363 | if(r.user1.percent < 10) { 364 | r.user1.percent = 15; 365 | r.user2.percent = 84; 366 | } else if (r.user2.percent < 10) { 367 | r.user2.percent = 15; 368 | r.user1.percent = 84; 369 | } else if (r.user2.percent + r.user1.percent === 100) { 370 | r.user1.percent -= 1; 371 | } 372 | if(name == 'commits' || name == 'stars' || name == 'forks') { 373 | if(r.user1.actual == 0) r.user1.actual = '~0'; 374 | if(r.user2.actual == 0) r.user2.actual = '~0'; 375 | } 376 | if(name === 'gists') { 377 | if(r.user1.actual > 100) r.user1.actual = '100+'; 378 | if(r.user2.actual > 100) r.user2.actual = '100+'; 379 | } 380 | return r; 381 | } 382 | 383 | function dataFormatter(user1, user2, stat) { 384 | if(stat == 'age') { 385 | var init_date_1 = Date.parse(user1.age), 386 | init_date_2 = Date.parse(user2.age), 387 | today = Date.parse(new Date()); 388 | var diff1 = Math.floor(((today - init_date_1) / 86400000)), 389 | diff2 = Math.floor(((today - init_date_2) / 86400000)); 390 | var dp1 = Math.floor(diff1 / (diff1 + diff2) * 100), 391 | dp2 = Math.floor(diff2 / (diff1 + diff2) * 100); 392 | 393 | return { 394 | user1: { 395 | "actual" : diff1, 396 | "percent" : dp1 397 | }, 398 | user2: { 399 | "actual" : diff2, 400 | "percent": dp2 401 | } 402 | } 403 | } else if (stat == 'forks' || stat == 'stars') { 404 | if(user1.repositories !== 0) { 405 | var ratio1 = Math.round((user1[stat] / user1.repositories * 10)) / 10; 406 | } else { 407 | var ratio1 = 0; 408 | } 409 | if(user2.repositories !== 0) { 410 | var ratio2 = Math.round((user2[stat] / user2.repositories * 10)) / 10; 411 | } else { 412 | var ratio2 = 0; 413 | } 414 | 415 | if(ratio1 + ratio2 == 0) { 416 | var dp1 = 50, 417 | dp2 = 50; 418 | } else { 419 | var dp1 = Math.floor((ratio1 / (ratio1 + ratio2)) * 100), 420 | dp2 = Math.floor((ratio2 / (ratio1 + ratio2)) * 100); 421 | } 422 | 423 | return { 424 | user1: { 425 | "actual" : ratio1, 426 | "percent" : dp1 427 | }, 428 | user2: { 429 | "actual" : ratio2, 430 | "percent": dp2 431 | } 432 | }; 433 | } else if (stat == 'commits') { 434 | var init_date_1 = Date.parse(user1.age), 435 | init_date_2 = Date.parse(user2.age), 436 | today = Date.parse(new Date()); 437 | var diff1 = Math.floor(((today - init_date_1) / 86400000)), 438 | diff2 = Math.floor(((today - init_date_2) / 86400000)); 439 | if (diff1 !== 0 && user1.commits !== 0) { 440 | var ratio1 = Math.floor((user1.commits / diff1 * 10)) / 10; 441 | } else { 442 | var ratio1 = 0; 443 | } 444 | 445 | if (diff2 !== 0 && user2.commits !== 0) { 446 | var ratio2 = Math.floor((user2.commits / diff2 * 10)) / 10; 447 | } else { 448 | var ratio2 = 0; 449 | } 450 | 451 | if (ratio1 + ratio2 === 0) { 452 | var dp1 = 50, 453 | dp2 = 50; 454 | } else { 455 | var dp1 = Math.floor((ratio1 / (ratio1 + ratio2)) * 100), 456 | dp2 = Math.floor((ratio2 / (ratio1 + ratio2)) * 100); 457 | } 458 | 459 | return { 460 | user1: { 461 | "actual" : ratio1, 462 | "percent" : dp1 463 | }, 464 | user2: { 465 | "actual" : ratio2, 466 | "percent": dp2 467 | } 468 | }; 469 | } else if (stat === 'gists' || stat === 'repositories' || stat === 'followers') { 470 | var total = (user1[stat] + user2[stat]); 471 | if (total === 0) { 472 | var dp1 = 50, 473 | dp2 = 50; 474 | } else { 475 | var dp1 = Math.floor(user1[stat] / total * 100); 476 | var dp2 = Math.floor(user2[stat] / total * 100); 477 | } 478 | 479 | return { 480 | user1: { 481 | 'actual': user1[stat], 482 | 'percent': dp1 483 | }, 484 | user2: { 485 | 'actual': user2[stat], 486 | 'percent': dp2 487 | } 488 | } 489 | } 490 | } 491 | 492 | function finalScore(user) { 493 | return 1; 494 | } 495 | 496 | function finalScore1(user) { 497 | 498 | ++ cou; 499 | 500 | var time = user.age, 501 | repos = user.repositories, 502 | commits = user.commits, 503 | forks = user.forks, 504 | stars = user.stars, 505 | followers = user.followers, 506 | watchers = user.watchers, 507 | gists = user.gists; 508 | 509 | // all times in seconds 510 | var github_founding_time = 1206835200 511 | user_init_time = (Date.parse(time) / 1000), 512 | now_time = (Date.parse(new Date()) / 1000), 513 | diff_time = now_time - user_init_time; 514 | 515 | /* 516 | * Perfect scores are in () 517 | */ 518 | 519 | var raw_score_followers = Math.sqrt(followers / repos) ; 520 | 521 | if (raw_score_followers > 5) 522 | raw_score_followers = 5; 523 | 524 | if (now_time - github_founding_time != 0) 525 | var raw_score_age = (now_time - user_init_time) / (now_time - github_founding_time); 526 | else 527 | var raw_score_age = 0; 528 | 529 | var raw_score_repo = 0; 530 | if(repos > 100) 531 | raw_score_repo = 1; 532 | else 533 | raw_score_repo = (repos/100); 534 | 535 | 536 | if (repos > 0) 537 | { 538 | var raw_score_fpr = Math.sqrt(forks / repos) / 15; 539 | if(raw_score_fpr > 1) 540 | raw_score_fpr = 1; 541 | } else { 542 | var raw_score_fpr = 0; 543 | } 544 | 545 | if (repos > 0) { 546 | var raw_score_spr = Math.sqrt(stars / repos) / 31; 547 | if(raw_score_spr > 1) { 548 | raw_score_spr = 1; 549 | } 550 | } else { 551 | var raw_score_spr = 0; 552 | } 553 | 554 | var final_score = ((raw_score_age * 0.1) + (raw_score_repo * 0.1) + (raw_score_fpr * 0.5) + (raw_score_spr * 0.7) + raw_score_followers * 0.1) * 100; 555 | 556 | return final_score.toFixed(2); 557 | } -------------------------------------------------------------------------------- /Application/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 turbolinks 16 | //= require_tree . 17 | -------------------------------------------------------------------------------- /Application/app/assets/javascripts/pages.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 | -------------------------------------------------------------------------------- /Application/app/assets/javascripts/scraper.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | IDENTITY = '' 4 | GITHUB = 'https://api.github.com/'; 5 | 6 | var Scraper = function() { 7 | this.getUserData = function(USER, $el, user_def) { 8 | 9 | var forks = 0, 10 | stars = 0, 11 | subscribers = 0, 12 | createdAt, 13 | userData, 14 | followers = 0, 15 | commits = 0, 16 | watchers = 0, 17 | repos = 0, 18 | orgs = 0, 19 | gists = 0, 20 | elChild = $el.find('.columns'); 21 | 22 | var promises = []; 23 | var defer = $.Deferred(); 24 | promises.push(); 25 | 26 | promises.push($.get(GITHUB + 'users/' + USER + IDENTITY, function(data) { 27 | data = data.data; 28 | followers = data.followers; 29 | createdAt = data.created_at; 30 | repos = data.public_repos; 31 | gists = data.public_gists; 32 | userData = data; 33 | }, 'jsonp')); 34 | 35 | var promise_count = 0; 36 | 37 | $el.show(); 38 | 39 | promises.push($.Deferred( 40 | function(def) { 41 | getRepoData(GITHUB + 'users/' + USER + '/repos' + IDENTITY + '&per_page=100', def); 42 | } 43 | )); 44 | 45 | function getRepoData(url, def) { 46 | $.get( 47 | url, 48 | function(resp, status, obj) { 49 | data = resp.data; 50 | for(var i = 0; i < data.length; i++) { 51 | var e = data[i]; 52 | if(e.size > 0) { 53 | 54 | if(e.forks_count) forks += e.forks_count; 55 | 56 | if (e.stargazers_count) stars += e.stargazers_count; 57 | 58 | if (e.watchers) watchers += e.watchers_count; 59 | 60 | elChild.append('
' 61 | + e.name + '
'); 62 | } 63 | } 64 | 65 | var next= hasNext(resp.meta.Link); 66 | 67 | if(next.hasNext) { 68 | getRepoData(next.nextLink, def); 69 | } else { 70 | def.resolve(); 71 | $.when.apply(null, promises).done(function(args1, args2) { 72 | user_def.resolve({ 73 | age: createdAt, 74 | followers: followers, 75 | forks: forks, 76 | stars: stars, 77 | commits: commits, 78 | watchers: watchers, 79 | repositories: repos, 80 | organiations: orgs, 81 | gists: gists 82 | }); 83 | }); 84 | } 85 | }, 86 | 'jsonp'); 87 | } 88 | 89 | function hasLast(linkHeader) { 90 | var last = false; 91 | var lastNumber; 92 | linkHeader.split(',').forEach(function(e) { 93 | var linkParts = e.split(';'); 94 | var verb = linkParts[1].match(/rel=\"(.*)\"/)[1]; 95 | if(verb == 'last') { 96 | last = true; 97 | lastNumber = parseInt(linkParts[0].match(/page=(.*)&/)[1]); 98 | lastLink = linkParts[0].match(/\<(.*)\>/)[1]; 99 | } 100 | }); 101 | return { 102 | hasLast: last, 103 | lastNumber: lastNumber, 104 | lastLink: lastLink 105 | } 106 | } 107 | 108 | function hasNext(linkHeader) { 109 | var next = false; 110 | var nextLink; 111 | if(linkHeader) { 112 | linkHeader.forEach(function(e) { 113 | var verb = e[1].rel; 114 | if(verb == 'next') { 115 | next = true; 116 | nextLink = e[0]; 117 | } 118 | }); 119 | } 120 | return { 121 | hasNext: next, 122 | nextLink: nextLink 123 | } 124 | } 125 | } 126 | } -------------------------------------------------------------------------------- /Application/app/assets/javascripts/scraper2.js: -------------------------------------------------------------------------------- 1 | //743dfd4fd1fe002349b0b9569f03b072eb4f7f62 2 | 3 | IDENTITY = '' 4 | GITHUB = 'https://api.github.com/'; 5 | 6 | var Scraper = function() { 7 | this.getUserData = function(USER, $el, user_def) { 8 | 9 | var forks = 0, 10 | stars = 0, 11 | subscribers = 0, 12 | createdAt, 13 | userData, 14 | followers = 0, 15 | commits = 0, 16 | watchers = 0, 17 | repos = 0, 18 | orgs = 0, 19 | gists = 0, 20 | elChild = $el.find('.columns'); 21 | 22 | var promises = []; 23 | var defer = $.Deferred(); 24 | promises.push(); 25 | 26 | promises.push($.get(GITHUB + 'users/' + USER + IDENTITY, function(data) { 27 | data = data.data; 28 | followers = data.followers; 29 | createdAt = data.created_at; 30 | repos = data.public_repos; 31 | gists = data.public_gists; 32 | userData = data; 33 | }, 'jsonp')); 34 | 35 | var promise_count = 0; 36 | 37 | $el.show(); 38 | 39 | promises.push($.Deferred( 40 | function(def) { 41 | getRepoData(GITHUB + 'users/' + USER + '/repos' + IDENTITY + '&per_page=100', def); 42 | } 43 | )); 44 | 45 | function getRepoData(url, def) { 46 | $.get( 47 | url, 48 | function(resp, status, obj) { 49 | data = resp.data; 50 | for(var i = 0; i < data.length; i++) { 51 | var e = data[i]; 52 | if(e.size > 0) { 53 | 54 | if(e.forks_count) forks += e.forks_count; 55 | 56 | if (e.stargazers_count) stars += e.stargazers_count; 57 | 58 | if (e.watchers) watchers += e.watchers_count; 59 | 60 | elChild.append('
' 61 | + e.name + '
'); 62 | } 63 | } 64 | 65 | var next= hasNext(resp.meta.Link); 66 | 67 | if(next.hasNext) { 68 | getRepoData(next.nextLink, def); 69 | } else { 70 | def.resolve(); 71 | $.when.apply(null, promises).done(function(args1, args2) { 72 | user_def.resolve({ 73 | age: createdAt, 74 | followers: followers, 75 | forks: forks, 76 | stars: stars, 77 | commits: commits, 78 | watchers: watchers, 79 | repositories: repos, 80 | organiations: orgs, 81 | gists: gists 82 | }); 83 | }); 84 | } 85 | }, 86 | 'jsonp'); 87 | } 88 | 89 | function hasLast(linkHeader) { 90 | var last = false; 91 | var lastNumber; 92 | linkHeader.split(',').forEach(function(e) { 93 | var linkParts = e.split(';'); 94 | var verb = linkParts[1].match(/rel=\"(.*)\"/)[1]; 95 | if(verb == 'last') { 96 | last = true; 97 | lastNumber = parseInt(linkParts[0].match(/page=(.*)&/)[1]); 98 | lastLink = linkParts[0].match(/\<(.*)\>/)[1]; 99 | } 100 | }); 101 | return { 102 | hasLast: last, 103 | lastNumber: lastNumber, 104 | lastLink: lastLink 105 | } 106 | } 107 | 108 | function hasNext(linkHeader) { 109 | var next = false; 110 | var nextLink; 111 | if(linkHeader) { 112 | linkHeader.forEach(function(e) { 113 | var verb = e[1].rel; 114 | if(verb == 'next') { 115 | next = true; 116 | nextLink = e[0]; 117 | } 118 | }); 119 | } 120 | return { 121 | hasNext: next, 122 | nextLink: nextLink 123 | } 124 | } 125 | } 126 | } -------------------------------------------------------------------------------- /Application/app/assets/stylesheets/application.css: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /Application/app/assets/stylesheets/foundation.css: -------------------------------------------------------------------------------- 1 | /* Requires: normalize.css */ 2 | /* Global Reset & Standards ---------------------- */ 3 | * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } 4 | 5 | html { font-size: 62.5%; } 6 | 7 | body { background: white; font-weight: normal; font-style: normal; line-height: 1; color: #222222; position: relative; -webkit-font-smoothing: antialiased; } 8 | 9 | /* Links ---------------------- */ 10 | a { color: #2ba6cb; text-decoration: none; line-height: inherit; } 11 | 12 | a:hover { color: #2795b6; } 13 | 14 | a:focus { color: #2ba6cb; outline: none; } 15 | 16 | p a, p a:visited { line-height: inherit; } 17 | 18 | /* Misc ---------------------- */ 19 | .left { float: left; } 20 | 21 | .right { float: right; } 22 | 23 | .text-left { text-align: left; } 24 | 25 | .text-right { text-align: right; } 26 | 27 | .text-center { text-align: center; } 28 | 29 | .hide { display: none !important; } 30 | 31 | .highlight { background: #ffff99; } 32 | 33 | #googlemap img, object, embed { max-width: none; } 34 | 35 | #map_canvas embed { max-width: none; } 36 | 37 | #map_canvas img { max-width: none; } 38 | 39 | #map_canvas object { max-width: none; } 40 | 41 | /* Reset for strange margins by default on
elements */ 42 | figure { margin: 0; } 43 | 44 | /* Base Type Styles Using Modular Scale ---------------------- */ 45 | body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; direction: ltr; } 46 | 47 | p { font-family: inherit; font-weight: normal; font-size: 14px; line-height: 1.6; margin-bottom: 17px; } 48 | p.lead { font-size: 17.5px; line-height: 1.6; margin-bottom: 17px; } 49 | 50 | aside p { font-size: 13px; line-height: 1.35; font-style: italic; } 51 | 52 | h1, h3, h4, h5, h6 { font-weight: bold; font-style: normal; color: #222222; text-rendering: optimizeLegibility; line-height: 1.1; margin-bottom: 14px; margin-top: 14px; } 53 | h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { font-size: 60%; color: #6f6f6f; line-height: 0; } 54 | 55 | h1 { font-size: 44px; } 56 | 57 | h3 { font-size: 27px; } 58 | 59 | h4 { font-size: 23px; } 60 | 61 | h5 { font-size: 17px; } 62 | 63 | h6 { font-size: 14px; } 64 | 65 | hr { border: solid #ddd; border-width: 1px 0 0; clear: both; margin: 22px 0 21px; height: 0; } 66 | 67 | .subheader { line-height: 1.3; color: #6f6f6f; font-weight: 300; margin-bottom: 17px; } 68 | 69 | em, i { font-style: italic; line-height: inherit; } 70 | 71 | strong, b { font-weight: bold; line-height: inherit; } 72 | 73 | small { font-size: 60%; line-height: inherit; } 74 | 75 | code { font-weight: bold; background: #ffff99; } 76 | 77 | /* The Grid ---------------------- */ 78 | .row { width: 940px; max-width: 100%; min-width: 768px; margin: 0 auto; } 79 | .row .row { width: auto; max-width: none; min-width: 0; margin: 0 -15px; } 80 | .row.collapse .column, .row.collapse .columns { padding: 0; } 81 | .row .row { width: auto; max-width: none; min-width: 0; margin: 0 -15px; } 82 | .row .row.collapse { margin: 0; } 83 | 84 | .column, .columns { float: left; min-height: 1px; padding: 0 15px; position: relative; } 85 | .column.centered, .columns.centered { float: none; margin: 0 auto; } 86 | 87 | [class*="column"] + [class*="column"]:last-child { float: right; } 88 | 89 | [class*="column"] + [class*="column"].end { float: left; } 90 | 91 | .one, .row .one { width: 8.33333%; } 92 | 93 | .two, .row .two { width: 16.66667%; } 94 | 95 | .three, .row .three { width: 25%; } 96 | 97 | .four, .row .four { width: 33.33333%; } 98 | 99 | .five, .row .five { width: 41.66667%; } 100 | 101 | .six, .row .six { width: 50%; } 102 | 103 | .seven, .row .seven { width: 58.33333%; } 104 | 105 | .eight, .row .eight { width: 66.66667%; } 106 | 107 | .nine, .row .nine { width: 75%; } 108 | 109 | .ten, .row .ten { width: 83.33333%; } 110 | 111 | .eleven, .row .eleven { width: 91.66667%; } 112 | 113 | .twelve, .row .twelve { width: 100%; } 114 | 115 | .row .offset-by-one { margin-left: 8.33333%; } 116 | 117 | .row .offset-by-two { margin-left: 16.66667%; } 118 | 119 | .row .offset-by-three { margin-left: 25%; } 120 | 121 | .row .offset-by-four { margin-left: 33.33333%; } 122 | 123 | .row .offset-by-five { margin-left: 41.66667%; } 124 | 125 | .row .offset-by-six { margin-left: 50%; } 126 | 127 | .row .offset-by-seven { margin-left: 58.33333%; } 128 | 129 | .row .offset-by-eight { margin-left: 66.66667%; } 130 | 131 | .row .offset-by-nine { margin-left: 75%; } 132 | 133 | .row .offset-by-ten { margin-left: 83.33333%; } 134 | 135 | .push-two { left: 16.66667%; } 136 | 137 | .pull-two { right: 16.66667%; } 138 | 139 | .push-three { left: 25%; } 140 | 141 | .pull-three { right: 25%; } 142 | 143 | .push-four { left: 33.33333%; } 144 | 145 | .pull-four { right: 33.33333%; } 146 | 147 | .push-five { left: 41.66667%; } 148 | 149 | .pull-five { right: 41.66667%; } 150 | 151 | .push-six { left: 50%; } 152 | 153 | .pull-six { right: 50%; } 154 | 155 | .push-seven { left: 58.33333%; } 156 | 157 | .pull-seven { right: 58.33333%; } 158 | 159 | .push-eight { left: 66.66667%; } 160 | 161 | .pull-eight { right: 66.66667%; } 162 | 163 | .push-nine { left: 75%; } 164 | 165 | .pull-nine { right: 75%; } 166 | 167 | .push-ten { left: 83.33333%; } 168 | 169 | .pull-ten { right: 83.33333%; } 170 | 171 | img, object, embed { max-width: 100%; height: auto; } 172 | 173 | object, embed { height: 100%; } 174 | 175 | img { -ms-interpolation-mode: bicubic; } 176 | 177 | #map_canvas img, .map_canvas img { max-width: none!important; } 178 | 179 | /* Nicolas Gallagher's micro clearfix */ 180 | .row { *zoom: 1; } 181 | .row:before, .row:after { content: ""; display: table; } 182 | .row:after { clear: both; } 183 | 184 | /* Block Grids ---------------------- */ 185 | /* These are 2-up, 3-up, 4-up and 5-up ULs, suited 186 | for repeating blocks of content. Add 'mobile' to 187 | them to switch them just like the layout grid 188 | (one item per line) on phones 189 | 190 | For IE7/8 compatibility block-grid items need to be 191 | the same height. You can optionally uncomment the 192 | lines below to support arbitrary height, but know 193 | that IE7/8 do not support :nth-child. 194 | -------------------------------------------------- */ 195 | .block-grid { display: block; overflow: hidden; padding: 0; } 196 | .block-grid > li { display: block; height: auto; float: left; } 197 | .block-grid.one-up { margin: 0; margin: 0 -8px; } 198 | .block-grid.one-up > li { width: 100%; padding: 0 0 15px; padding: 0 8px 8px; } 199 | .block-grid.two-up { margin: 0 -15px; margin: 0 -8px; } 200 | .block-grid.two-up > li { width: 50%; padding: 0 15px 15px; padding: 0 8px 8px; } 201 | .block-grid.two-up > li:nth-child(2n+1) { clear: both; } 202 | .block-grid.three-up { margin: 0 -12px; margin: 0 -8px; } 203 | .block-grid.three-up > li { width: 33.33333%; padding: 0 12px 12px; padding: 0 8px 8px; } 204 | .block-grid.three-up > li:nth-child(3n+1) { clear: both; } 205 | .block-grid.four-up { margin: 0 -10px; } 206 | .block-grid.four-up > li { width: 25%; padding: 0 10px 10px; } 207 | .block-grid.four-up > li:nth-child(4n+1) { clear: both; } 208 | .block-grid.five-up { margin: 0 -8px; } 209 | .block-grid.five-up > li { width: 20%; padding: 0 8px 8px; } 210 | .block-grid.five-up > li:nth-child(5n+1) { clear: both; } 211 | .block-grid.six-up { margin: 0 -8px; } 212 | .block-grid.six-up > li { width: 16.66667%; padding: 0 8px 8px; } 213 | .block-grid.six-up > li:nth-child(6n+1) { clear: both; } 214 | .block-grid.seven-up { margin: 0 -8px; } 215 | .block-grid.seven-up > li { width: 14.28571%; padding: 0 8px 8px; } 216 | .block-grid.seven-up > li:nth-child(7n+1) { clear: both; } 217 | .block-grid.eight-up { margin: 0 -8px; } 218 | .block-grid.eight-up > li { width: 12.5%; padding: 0 8px 8px; } 219 | .block-grid.eight-up > li:nth-child(8n+1) { clear: both; } 220 | .block-grid.nine-up { margin: 0 -8px; } 221 | .block-grid.nine-up > li { width: 11.11111%; padding: 0 8px 8px; } 222 | .block-grid.nine-up > li:nth-child(9n+1) { clear: both; } 223 | .block-grid.ten-up { margin: 0 -8px; } 224 | .block-grid.ten-up > li { width: 10%; padding: 0 8px 8px; } 225 | .block-grid.ten-up > li:nth-child(10n+1) { clear: both; } 226 | .block-grid.eleven-up { margin: 0 -8px; } 227 | .block-grid.eleven-up > li { width: 9.09091%; padding: 0 8px 8px; } 228 | .block-grid.eleven-up > li:nth-child(11n+1) { clear: both; } 229 | .block-grid.twelve-up { margin: 0 -8px; } 230 | .block-grid.twelve-up > li { width: 8.33333%; padding: 0 8px 8px; } 231 | .block-grid.twelve-up > li:nth-child(12n+1) { clear: both; } 232 | -------------------------------------------------------------------------------- /Application/app/assets/stylesheets/foundation.min.css: -------------------------------------------------------------------------------- 1 | *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%}body{background:#fff;font-family:"Helvetica Neue","Helvetica",Helvetica,Arial,sans-serif;font-weight:normal;font-style:normal;font-size:14px;line-height:1;color:#222;position:relative;-webkit-font-smoothing:antialiased}a{color:#2ba6cb;text-decoration:none;line-height:inherit}a:hover{color:#2795b6}a:focus{color:#2ba6cb;outline:none}p a,p a:visited{line-height:inherit}.left{float:left}.right{float:right}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.hide{display:none !important}.highlight{background:#ff9}#googlemap img,object,embed{max-width:none}#map_canvas embed{max-width:none}#map_canvas img{max-width:none}#map_canvas object{max-width:none}figure{margin:0}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;font-size:14px;direction:ltr}p{font-family:inherit;font-weight:normal;font-size:14px;line-height:1.6;margin-bottom:17px}p.lead{font-size:17.5px;line-height:1.6;margin-bottom:17px}aside p{font-size:13px;line-height:1.35;font-style:italic}h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue","Helvetica",Helvetica,Arial,sans-serif;font-weight:bold;font-style:normal;color:#222;text-rendering:optimizeLegibility;line-height:1.1;margin-bottom:14px;margin-top:14px}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-size:60%;color:#6f6f6f;line-height:0}h1{font-size:44px}h2{font-size:37px}h3{font-size:27px}h4{font-size:23px}h5{font-size:17px}h6{font-size:14px}hr{border:solid #ddd;border-width:1px 0 0;clear:both;margin:22px 0 21px;height:0}.subheader{line-height:1.3;color:#6f6f6f;font-weight:300;margin-bottom:17px}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:bold;line-height:inherit}small{font-size:60%;line-height:inherit}code{font-weight:bold;background:#ff9}ul,ol,dl{font-size:14px;line-height:1.6;margin-bottom:17px;list-style-position:outside}ul li ul,ul li ol{margin-left:20px;margin-bottom:0}ul.square,ul.circle,ul.disc{margin-left:17px}ul.square{list-style-type:square}ul.square li ul{list-style:inherit}ul.circle{list-style-type:circle}ul.circle li ul{list-style:inherit}ul.disc{list-style-type:disc}ul.disc li ul{list-style:inherit}ul.no-bullet{list-style:none}ul.large li{line-height:21px}ol{margin-left:20px}ol li ul,ol li ol{margin-left:20px;margin-bottom:0}blockquote,blockquote p{line-height:1.5;color:#6f6f6f}blockquote{margin:0 0 17px;padding:9px 20px 0 19px;border-left:1px solid #ddd}blockquote cite{display:block;font-size:13px;color:#555}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:#555}abbr,acronym{text-transform:uppercase;font-size:90%;color:#222;border-bottom:1px solid #ddd;cursor:help}abbr{text-transform:none}.print-only{display:none !important}@media print{*{background:transparent !important;color:black !important;box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.hide-on-print{display:none !important}.print-only{display:block !important}.hide-for-print{display:none !important}.show-for-print{display:inherit !important}}form{margin:0 0 19.41641px}.row form .row{margin:0 -6px}.row form .row .column,.row form .row .columns{padding:0 6px}.row form .row.collapse{margin:0}.row form .row.collapse .column,.row form .row.collapse .columns{padding:0}label{font-size:14px;color:#4d4d4d;cursor:pointer;display:block;font-weight:500;margin-bottom:3px}label.right{float:none;text-align:right}label.inline{line-height:32px;margin:0 0 12px 0}.prefix,.postfix{display:block;position:relative;z-index:2;text-align:center;width:100%;padding-top:0;padding-bottom:0;height:32px;line-height:31px}a.button.prefix,a.button.postfix{padding-left:0;padding-right:0;text-align:center}span.prefix,span.postfix{background:#f2f2f2;border:1px solid #ccc}.prefix{left:2px;-moz-border-radius-topleft:2px;-webkit-border-top-left-radius:2px;border-top-left-radius:2px;-moz-border-radius-bottomleft:2px;-webkit-border-bottom-left-radius:2px;border-bottom-left-radius:2px;overflow:hidden}.postfix{right:2px;-moz-border-radius-topright:2px;-webkit-border-top-right-radius:2px;border-top-right-radius:2px;-moz-border-radius-bottomright:2px;-webkit-border-bottom-right-radius:2px;border-bottom-right-radius:2px}input[type="text"],input[type="password"],input[type="date"],input[type="datetime"],input[type="email"],input[type="number"],input[type="search"],input[type="tel"],input[type="time"],input[type="url"],textarea{background-color:#fff;font-family:inherit;border:1px solid #ccc;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);color:rgba(0,0,0,0.75);display:block;font-size:14px;margin:0 0 12px 0;padding:6px;height:32px;width:100%;-webkit-transition:all 0.15s linear;-moz-transition:all 0.15s linear;-o-transition:all 0.15s linear;transition:all 0.15s linear}input[type="text"].oversize,input[type="password"].oversize,input[type="date"].oversize,input[type="datetime"].oversize,input[type="email"].oversize,input[type="number"].oversize,input[type="search"].oversize,input[type="tel"].oversize,input[type="time"].oversize,input[type="url"].oversize,textarea.oversize{font-size:17px;padding:4px 6px}input[type="text"]:focus,input[type="password"]:focus,input[type="date"]:focus,input[type="datetime"]:focus,input[type="email"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="time"]:focus,input[type="url"]:focus,textarea:focus{background:#fafafa;outline:none !important;border-color:#b3b3b3}input[type="text"][disabled],input[type="password"][disabled],input[type="date"][disabled],input[type="datetime"][disabled],input[type="email"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="time"][disabled],input[type="url"][disabled],textarea[disabled]{background-color:#ddd}textarea{height:auto}select{width:100%}fieldset{border:solid 1px #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:12px 12px 0;margin:18px 0}fieldset legend{font-weight:bold;background:#fff;padding:0 3px;margin:0;margin-left:-3px}.error input,input.error,.error textarea,textarea.error{border-color:#c60f13;background-color:rgba(198,15,19,0.1)}.error label,label.error{color:#c60f13}.error small,small.error{display:block;padding:6px 4px;margin-top:-13px;margin-bottom:12px;background:#c60f13;color:#fff;font-size:12px;font-weight:bold;-moz-border-radius-bottomleft:2px;-webkit-border-bottom-left-radius:2px;border-bottom-left-radius:2px;-moz-border-radius-bottomright:2px;-webkit-border-bottom-right-radius:2px;border-bottom-right-radius:2px}.error textarea:focus,textarea.error:focus{background:#fafafa;border-color:#b3b3b3}form.custom span.custom{display:inline-block;width:16px;height:16px;position:relative;top:2px;border:solid 1px #ccc;background:#fff}form.custom span.custom.radio{-webkit-border-radius:100px;-moz-border-radius:100px;-ms-border-radius:100px;-o-border-radius:100px;border-radius:100px}form.custom span.custom.checkbox:before{content:"";display:block;line-height:0.8;height:14px;width:14px;text-align:center;position:absolute;top:0;left:0;font-size:14px;color:#fff}form.custom span.custom.radio.checked:before{content:"";display:block;width:8px;height:8px;-webkit-border-radius:100px;-moz-border-radius:100px;-ms-border-radius:100px;-o-border-radius:100px;border-radius:100px;background:#222;position:relative;top:3px;left:3px}form.custom span.custom.checkbox.checked:before{content:"\00d7";color:#222}form.custom div.custom.dropdown{display:block;position:relative;width:auto;height:28px;margin-bottom:9px;margin-top:2px}form.custom div.custom.dropdown ul{overflow-y:auto;max-height:200px}form.custom div.custom.dropdown a.current{display:block;width:auto;line-height:26px;min-height:28px;padding:0;padding-left:6px;padding-right:38px;border:solid 1px #ddd;color:#141414;background-color:#fff;white-space:nowrap}form.custom div.custom.dropdown a.selector{position:absolute;width:27px;height:28px;display:block;right:0;top:0;border:solid 1px #ddd}form.custom div.custom.dropdown a.selector:after{content:"";display:block;content:"";display:block;width:0;height:0;border:solid 5px;border-color:#aaa transparent transparent transparent;position:absolute;left:50%;top:50%;margin-top:-2px;margin-left:-5px}form.custom div.custom.dropdown:hover a.selector:after,form.custom div.custom.dropdown.open a.selector:after{content:"";display:block;width:0;height:0;border:solid 5px;border-color:#222 transparent transparent transparent}form.custom div.custom.dropdown.open ul{display:block;z-index:10}form.custom div.custom.dropdown.small{width:134px !important}form.custom div.custom.dropdown.medium{width:254px !important}form.custom div.custom.dropdown.large{width:434px !important}form.custom div.custom.dropdown.expand{width:100% !important}form.custom div.custom.dropdown.open.small ul{width:134px !important}form.custom div.custom.dropdown.open.medium ul{width:254px !important}form.custom div.custom.dropdown.open.large ul{width:434px !important}form.custom div.custom.dropdown.open.expand ul{width:100% !important}form.custom div.custom.dropdown ul{position:absolute;width:auto;display:none;margin:0;left:0;top:27px;margin:0;padding:0;background:#fff;background:rgba(255,255,255,0.95);border:solid 1px #ccc}form.custom div.custom.dropdown ul li{color:#555;font-size:13px;cursor:pointer;padding:3px;padding-left:6px;padding-right:38px;min-height:18px;line-height:18px;margin:0;white-space:nowrap;list-style:none}form.custom div.custom.dropdown ul li.selected{background:#cdebf5;color:#000}form.custom div.custom.dropdown ul li.selected:after{content:"\2013";position:absolute;right:10px}form.custom div.custom.dropdown ul li:hover{background-color:#cdebf5;color:#000}form.custom div.custom.dropdown ul li:hover:after{content:"\2013";position:absolute;right:10px;color:#a3dbec}form.custom div.custom.dropdown ul li.selected:hover{background:#cdebf5;cursor:default;color:#000}form.custom div.custom.dropdown ul li.selected:hover:after{color:#000}form.custom div.custom.dropdown ul.show{display:block}form.custom .custom.disabled{background-color:#ddd}@-moz-document url-prefix(){form.custom div.custom.dropdown a.selector{height:30px}}.lt-ie9 form.custom div.custom.dropdown a.selector{height:30px}.row{width:940px;max-width:100%;min-width:768px;margin:0 auto}.row .row{width:auto;max-width:none;min-width:0;margin:0 -15px}.row.collapse .column,.row.collapse .columns{padding:0}.row .row{width:auto;max-width:none;min-width:0;margin:0 -15px}.row .row.collapse{margin:0}.column,.columns{float:left;min-height:1px;padding:0 15px;position:relative}.column.centered,.columns.centered{float:none;margin:0 auto}[class*="column"]+[class*="column"]:last-child{float:right}[class*="column"]+[class*="column"].end{float:left}.one,.row .one{width:8.33333%}.two,.row .two{width:16.66667%}.three,.row .three{width:25%}.four,.row .four{width:33.33333%}.five,.row .five{width:41.66667%}.six,.row .six{width:50%}.seven,.row .seven{width:58.33333%}.eight,.row .eight{width:66.66667%}.nine,.row .nine{width:75%}.ten,.row .ten{width:83.33333%}.eleven,.row .eleven{width:91.66667%}.twelve,.row .twelve{width:100%}.row .offset-by-one{margin-left:8.33333%}.row .offset-by-two{margin-left:16.66667%}.row .offset-by-three{margin-left:25%}.row .offset-by-four{margin-left:33.33333%}.row .offset-by-five{margin-left:41.66667%}.row .offset-by-six{margin-left:50%}.row .offset-by-seven{margin-left:58.33333%}.row .offset-by-eight{margin-left:66.66667%}.row .offset-by-nine{margin-left:75%}.row .offset-by-ten{margin-left:83.33333%}.push-two{left:16.66667%}.pull-two{right:16.66667%}.push-three{left:25%}.pull-three{right:25%}.push-four{left:33.33333%}.pull-four{right:33.33333%}.push-five{left:41.66667%}.pull-five{right:41.66667%}.push-six{left:50%}.pull-six{right:50%}.push-seven{left:58.33333%}.pull-seven{right:58.33333%}.push-eight{left:66.66667%}.pull-eight{right:66.66667%}.push-nine{left:75%}.pull-nine{right:75%}.push-ten{left:83.33333%}.pull-ten{right:83.33333%}img,object,embed{max-width:100%;height:auto}object,embed{height:100%}img{-ms-interpolation-mode:bicubic}#map_canvas img,.map_canvas img{max-width:none!important}.row{*zoom:1}.row:before,.row:after{content:"";display:table}.row:after{clear:both}.block-grid{display:block;overflow:hidden;padding:0}.block-grid>li{display:block;height:auto;float:left}.block-grid.one-up{margin:0;margin:0 -8px}.block-grid.one-up>li{width:100%;padding:0 0 15px;padding:0 8px 8px}.block-grid.two-up{margin:0 -15px;margin:0 -8px}.block-grid.two-up>li{width:50%;padding:0 15px 15px;padding:0 8px 8px}.block-grid.two-up>li:nth-child(2n+1){clear:both}.block-grid.three-up{margin:0 -12px;margin:0 -8px}.block-grid.three-up>li{width:33.33333%;padding:0 12px 12px;padding:0 8px 8px}.block-grid.three-up>li:nth-child(3n+1){clear:both}.block-grid.four-up{margin:0 -10px}.block-grid.four-up>li{width:25%;padding:0 10px 10px}.block-grid.four-up>li:nth-child(4n+1){clear:both}.block-grid.five-up{margin:0 -8px}.block-grid.five-up>li{width:20%;padding:0 8px 8px}.block-grid.five-up>li:nth-child(5n+1){clear:both}.block-grid.six-up{margin:0 -8px}.block-grid.six-up>li{width:16.66667%;padding:0 8px 8px}.block-grid.six-up>li:nth-child(6n+1){clear:both}.block-grid.seven-up{margin:0 -8px}.block-grid.seven-up>li{width:14.28571%;padding:0 8px 8px}.block-grid.seven-up>li:nth-child(7n+1){clear:both}.block-grid.eight-up{margin:0 -8px}.block-grid.eight-up>li{width:12.5%;padding:0 8px 8px}.block-grid.eight-up>li:nth-child(8n+1){clear:both}.block-grid.nine-up{margin:0 -8px}.block-grid.nine-up>li{width:11.11111%;padding:0 8px 8px}.block-grid.nine-up>li:nth-child(9n+1){clear:both}.block-grid.ten-up{margin:0 -8px}.block-grid.ten-up>li{width:10%;padding:0 8px 8px}.block-grid.ten-up>li:nth-child(10n+1){clear:both}.block-grid.eleven-up{margin:0 -8px}.block-grid.eleven-up>li{width:9.09091%;padding:0 8px 8px}.block-grid.eleven-up>li:nth-child(11n+1){clear:both}.block-grid.twelve-up{margin:0 -8px}.block-grid.twelve-up>li{width:8.33333%;padding:0 8px 8px}.block-grid.twelve-up>li:nth-child(12n+1){clear:both} 2 | -------------------------------------------------------------------------------- /Application/app/assets/stylesheets/pages.scss: -------------------------------------------------------------------------------- 1 | #forkMe { 2 | top: 3em; 3 | right: -6em; 4 | color: #fff; 5 | display: block; 6 | position: fixed; 7 | text-align: center; 8 | text-decoration: none; 9 | letter-spacing: .06em; 10 | background-color: #A00; 11 | padding: 0.5em 5em 0.4em 5em; 12 | text-shadow: 0 0 0.75em #444; 13 | box-shadow: 0 0 0.5em rgba(0,0,0,0.5); 14 | transform: rotate(45deg) scale(0.75,1); 15 | font: bold 16px/1.2em Arial, Sans-Serif; 16 | -webkit-text-shadow: 0 0 0.75em #444; 17 | -webkit-box-shadow: 0 0 0.5em rgba(0,0,0,0.5); 18 | -webkit-transform: rotate(45deg) scale(0.75,1); 19 | z-index:10; 20 | } 21 | #forkMe:before { 22 | content: ''; 23 | top: 0; 24 | left: 0; 25 | right: 0; 26 | bottom: 0; 27 | position: absolute; 28 | margin: -0.3em -5em; 29 | transform: scale(0.7); 30 | -webkit-transform: scale(0.7); 31 | border: 2px rgba(255,255,255,0.7) dashed; 32 | } 33 | #forkMe:hover {opacity: 0.9;} 34 | #jj { 35 | position: fixed; 36 | bottom: 0; 37 | right: 20px; 38 | display: flex; 39 | justify-content: center; 40 | align-items: center; 41 | align-content: center; 42 | margin: 0; 43 | padding: 5px; 44 | background-color: grey; 45 | a { 46 | color: white; 47 | text-decoration: none; 48 | &:hover { text-decoration: none; } 49 | } 50 | } -------------------------------------------------------------------------------- /Application/app/assets/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | html { overflow-y: scroll; } 2 | body { 3 | background: white; 4 | font-family: Arial; 5 | font-size: 60%; 6 | line-height: 1; 7 | color: #616161; 8 | padding: 35px 0; 9 | } 10 | input{ 11 | box-sizing: border-box; 12 | outline: none; 13 | } 14 | img { border: 0; max-width: 100%; } 15 | 16 | h1 { 17 | font-family: Arial; 18 | font-size: 4.0em; 19 | color: brown; 20 | line-height: 1.6em; 21 | margin-bottom: 10px; 22 | } 23 | p { 24 | font-size: 1.4em; 25 | line-height: 1.55em; 26 | margin-bottom: 12px; 27 | } 28 | .cont { 29 | font-weight: bold; 30 | padding: 6px 9px; 31 | display: block; 32 | float: left; 33 | margin-right: 10px; 34 | margin-bottom: 10px; 35 | text-decoration: none; 36 | border: 1px solid #356492; 37 | border-radius: 3px; 38 | color: #fff; 39 | background-color: LightGreen; 40 | background-image: linear-gradient(top, #5597d8, #3673af); 41 | font-size: 1.4em; 42 | line-height: 1.55em; 43 | margin-bottom: 12px; 44 | } 45 | .cont1 { 46 | font-weight: bold; 47 | padding: 6px 9px; 48 | display: block; 49 | float: left; 50 | margin-right: 10px; 51 | margin-bottom: 10px; 52 | text-decoration: none; 53 | border: 1px solid #356492; 54 | border-radius: 3px; 55 | color: #fff; 56 | background-color: Orange; 57 | background-image: linear-gradient(top, #5597d8, #3673af); 58 | font-size: 1.4em; 59 | line-height: 1.55em; 60 | margin-bottom: 12px; 61 | } 62 | 63 | a { 64 | color: #8eadd2; 65 | } 66 | a:hover { 67 | color: #6e91b9; 68 | } 69 | 70 | #head { 71 | display: block; 72 | width: 800px; 73 | margin: 0 auto; 74 | background: white; 75 | padding: 20px 30px; 76 | box-shadow: 0px 0px 0px 0px rgba(0,0,0,0.4); 77 | border-radius: 5px; 78 | } 79 | 80 | #data { 81 | display: block; 82 | padding: 20px 0; 83 | } 84 | 85 | #loader { 86 | display: block; 87 | width: 200px; 88 | height: 200px; 89 | margin: 0 auto; 90 | } 91 | 92 | .repolist { 93 | display: block; 94 | clear: both; 95 | width: 100%; 96 | } 97 | .repolist ul { 98 | font-size: 1.2em; 99 | } 100 | .repolist ul li { 101 | display: block; 102 | } 103 | .repolist ul li a { 104 | font-weight: bold; 105 | padding: 6px 9px; 106 | display: block; 107 | float: left; 108 | margin-right: 10px; 109 | margin-bottom: 10px; 110 | text-decoration: none; 111 | border: 1px solid #356492; 112 | border-radius: 3px; 113 | color: #fff; 114 | background-color: olive; 115 | background-image: linear-gradient(top, #5597d8, #3673af); 116 | } 117 | .repolist ul li a:hover { 118 | background-color: red; 119 | background-image: linear-gradient(top, #4b87c2, #396895); 120 | } 121 | 122 | #username { 123 | display: block; 124 | padding: 5px 8px; 125 | font-size: 1.4em; 126 | color: #666; 127 | width: 550px; 128 | margin-bottom: 15px; 129 | } 130 | #submit { 131 | display: inline-block; 132 | padding: 8px 18px; 133 | font-size: 14px; 134 | font-weight: bold; 135 | color: green; 136 | text-decoration: none; 137 | text-shadow: 0 1px 0 rgba(255,255,255,0.8); 138 | background-color: #eaeaea; 139 | background-image: linear-gradient(#fafafa, #eaeaea); 140 | border-radius: 3px; 141 | border: 1px solid #ddd; 142 | border-bottom-color: #c5c5c5; 143 | box-shadow: 0 1px 3px rgba(0,0,0,0.05); 144 | } 145 | #submit:hover { 146 | background-color: #dadada; 147 | background-image: linear-gradient(#eaeaea, #dadada); 148 | border-color: #ccc #ccc #b5b5b5; 149 | } 150 | #submit:active { 151 | background-color:#dadada; 152 | background-image: none; 153 | border-color: #b5b5b5; 154 | box-shadow: inset 0 3px 5px rgba(0,0,0,0.25); 155 | } 156 | .clearfix:after { content: "."; display: block; clear: both; visibility: hidden; line-height: 0; height: 0; } 157 | .clearfix { display: inline-block; } 158 | 159 | html[xmlns] .clearfix { display: block; } 160 | * html .clearfix { height: 1%; } -------------------------------------------------------------------------------- /Application/app/assets/stylesheets/styles.css: -------------------------------------------------------------------------------- 1 | * { box-sizing: border-box; } 2 | body { 3 | margin: 0; 4 | background: #111; 5 | color: #fff; 6 | } 7 | .prices { 8 | display: flex; 9 | margin: 3em auto; 10 | align-items: center; 11 | justify-content: center; 12 | } 13 | .pricingopt { 14 | width: 14em; 15 | height: 22em; 16 | background: #222; 17 | border-radius: 1ex; 18 | border: 1px solid #000; 19 | display: flex; 20 | flex-direction: column; 21 | justify-content: center; 22 | align-items: center; 23 | } 24 | .pricingopt.left { 25 | border-radius: 1ex 0 0 1ex; 26 | border-right: 0; 27 | } 28 | .pricingopt.right { 29 | border-radius: 0 1ex 1ex 0; 30 | border-left: 0; 31 | } 32 | .pricingopt.main { 33 | font-size: 1.1em; 34 | } 35 | .pricingopt h1, .pricingopt h2 { 36 | text-align: center; 37 | font-weight: 300; 38 | font-size: 1.7em; 39 | margin: 0.5em; 40 | } 41 | .pricingopt h2 { 42 | font-size: 2.3em; 43 | } 44 | .pricingopt ul { 45 | list-style-type: none; 46 | font-size: 1.15em; 47 | padding: 0; 48 | } 49 | .pricingopt ul li:before { 50 | content:"\2713\0020"; 51 | margin-right: 0.2em; 52 | } 53 | .pricingopt button { 54 | background: #333; 55 | border: 1px solid #111; 56 | width: 87%; 57 | margin: 2em auto; 58 | display: block; 59 | padding: 1em; 60 | border-radius: 0.5ex; 61 | color: #fff; 62 | font-size: 0.9em; 63 | font-family: 'Lato', sans-serif; 64 | } 65 | 66 | h1, h2, h3, #submit { 67 | font-family: 'Titillium Web', sans-serif; 68 | } 69 | 70 | div { 71 | border-radius: 5px; 72 | -moz-border-radius: 5px; 73 | -webkit-border-radius: 5px; 74 | } 75 | 76 | .container { 77 | padding-bottom: 100px; 78 | } 79 | .center { 80 | text-align: center; 81 | } 82 | 83 | #title { 84 | margin-bottom: 80px; 85 | } 86 | 87 | .user input { 88 | height: 100px; 89 | font-size: 50px; 90 | line-height: 80px; 91 | width: 100%; 92 | font-weight: bold; 93 | text-align: center; 94 | } 95 | 96 | input:focus { 97 | border:none; 98 | outline: none; 99 | } 100 | .user1 input { 101 | color: rgb(50, 92, 175); 102 | } 103 | 104 | .user2 input { 105 | color: rgb(186, 0,0); 106 | } 107 | 108 | .vs h2 { 109 | line-height: 80px; 110 | font-size: 100px; 111 | color: white; 112 | margin: 0px; 113 | } 114 | 115 | 116 | .fight { 117 | font-color: #ED1C24; 118 | } 119 | 120 | #submit { 121 | margin: auto; 122 | margin-top: 30px; 123 | border: dotted 5px #41403E; 124 | padding: 10px 10px; 125 | line-height: 30px; 126 | font-size: 20px; 127 | color: black; 128 | font-weight: bold; 129 | cursor: pointer; 130 | } 131 | 132 | #loading { 133 | line-height: 80px; 134 | font-size: 60px; 135 | color: white; 136 | margin: 0px; 137 | } 138 | 139 | .processing-container { 140 | margin-top: 30px!important; 141 | } 142 | 143 | .processing-container h5 { 144 | color: rgb(186, 0,0); 145 | margin: 5px 7px 5px 0; 146 | padding: 5px 7px; 147 | background: white; 148 | float: left; 149 | border-radius: 5px; 150 | -moz-border-radius: 5px; 151 | -webkit-border-radius: 5px; 152 | } 153 | #submit div { 154 | font-size: 20px; 155 | line-height: 20px; 156 | } 157 | 158 | 159 | .graph { 160 | height: 80px; 161 | display: inline-block; 162 | margin: 10px 0; 163 | } 164 | 165 | .label { 166 | font-size: 30px; 167 | margin-bottom: 0px; 168 | font-family: 'Source Sans Pro', sans-serif; 169 | } 170 | 171 | .graph h3 { 172 | font-size: 70px; 173 | line-height: 60px; 174 | } 175 | .graph_1 { 176 | float: left; 177 | width: 59%; 178 | background: rgb(50, 92, 175); 179 | } 180 | 181 | .graph_1 h3 { 182 | float: left; 183 | margin-left: 10px; 184 | } 185 | 186 | .graph_2 { 187 | float: right; 188 | width: 39%; 189 | background: rgb(186, 0,0); 190 | } 191 | 192 | .graph_2 h3 { 193 | float: right; 194 | margin-right: 10px; 195 | } 196 | 197 | .graph span { 198 | font-size: 40px; 199 | float: left; 200 | } 201 | 202 | 203 | .score h3 { 204 | font-size: 70px; 205 | line-height: 60px; 206 | } 207 | 208 | .score h2 { 209 | font-size: 100px; 210 | line-height: 100px; 211 | clear: both; 212 | } 213 | 214 | .twitter { 215 | margin-top: 40px; 216 | margin-bottom: 20px; 217 | } 218 | 219 | .twitter h5 { 220 | display: inline; 221 | position: relative; 222 | left: 10px; 223 | bottom: 5px; 224 | } 225 | .twitter iframe { 226 | display: inline; 227 | } 228 | 229 | #retry { 230 | margin: auto; 231 | padding: 20px 20px; 232 | background: rgb(250, 195, 0); 233 | line-height: 100px; 234 | font-size: 80px; 235 | color: white; 236 | font-weight: bold; 237 | cursor: pointer; 238 | } 239 | 240 | .winner-container { 241 | margin-top: -50px!important; 242 | } 243 | 244 | .hn-container { 245 | margin-top: 50px!important; 246 | } 247 | 248 | -------------------------------------------------------------------------------- /Application/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 | end 6 | -------------------------------------------------------------------------------- /Application/app/controllers/believes_controller.rb: -------------------------------------------------------------------------------- 1 | class BelievesController < ApplicationController 2 | 3 | end 4 | -------------------------------------------------------------------------------- /Application/app/controllers/compares_controller.rb: -------------------------------------------------------------------------------- 1 | class ComparesController < ApplicationController 2 | 3 | def home_v1_2 4 | end 5 | 6 | def org 7 | end 8 | 9 | end 10 | -------------------------------------------------------------------------------- /Application/app/controllers/concerns/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/app/controllers/concerns/.keep -------------------------------------------------------------------------------- /Application/app/controllers/contributions_controller.rb: -------------------------------------------------------------------------------- 1 | class ContributionsController < ApplicationController 2 | def generate 3 | svg = GithubChart.new(user: params["username"]).svg 4 | respond_to do |format| 5 | format.svg { render inline: svg} 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /Application/app/controllers/funfacts_controller.rb: -------------------------------------------------------------------------------- 1 | class FunfactsController < ApplicationController 2 | 3 | end 4 | -------------------------------------------------------------------------------- /Application/app/controllers/pages_controller.rb: -------------------------------------------------------------------------------- 1 | class PagesController < ApplicationController 2 | def home 3 | end 4 | end 5 | -------------------------------------------------------------------------------- /Application/app/helpers/application_helper.rb: -------------------------------------------------------------------------------- 1 | module ApplicationHelper 2 | end 3 | -------------------------------------------------------------------------------- /Application/app/helpers/pages_helper.rb: -------------------------------------------------------------------------------- 1 | module PagesHelper 2 | end 3 | -------------------------------------------------------------------------------- /Application/app/mailers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/app/mailers/.keep -------------------------------------------------------------------------------- /Application/app/models/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/app/models/.keep -------------------------------------------------------------------------------- /Application/app/models/concerns/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/app/models/concerns/.keep -------------------------------------------------------------------------------- /Application/app/views/believes/home.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 |
10 |
11 |

16 year-old issue found in 9 year-old GitHub using 12 year-old Git.

12 |
13 |

An issue has been found which was formed even before GitHub was established or Git was released. Take a look at it here

14 |
15 |

16 | Aditya Dancing 17 |

18 |
19 |
20 | 21 |
22 |

A man who had been committing on GitHub continuously for 100 years.

23 |
24 |

Ciro Santilli, a humble man has been commiting on GitHub for over 100 years. Unfortunately, his dedication was not preceived well by others and GitHub decided to hide his contributions. Take a look at his profile here

25 |
26 |

27 | Aditya Dancing 28 |

29 |
30 |
31 | 32 |
33 |

A man who has lost his GitHub contribution graph.

34 |
35 |

Ciro Santilli has lost his contribution graph. Take a look at his mysterious profile here
Luckily, you can take a look at how his graph would look like now using this feature of Repository Hunter

36 |
37 |

38 | Aditya Dancing 39 |

40 |
41 |
42 | 43 |
44 |

An username extending vertically indefinitely.

45 |
46 |

Usernames can extend vertically infinitely as well. Take a look at his mysterious profile here
47 |

48 |
49 |

50 | Aditya Dancing 51 |

52 |
53 |
54 | 55 |
56 |

A man has been on GitHub since 1991 with the highest number of followers.

57 |
58 |

Take a look at his profile here
59 |

60 |
61 |

62 | Aditya Dancing 63 |

64 |
65 |
66 | 67 |
68 |

You can make a commit on a date before your birth!

69 |
70 |

Try out the following command: git commit --date="Wed Feb 16 14:00 2011 +0100"
71 |

72 |
73 |
74 | 75 |
76 |

GitHub, Inc. was originally known as Logical Awesome LLC

77 |
78 |

Check out the present Logical Awesome LLC site 79 | here
80 |

81 |
82 |

83 | Aditya Dancing 84 |

85 |
86 |
87 | 88 |
89 |

Once, GitHub was a victim.

90 |
91 |

On 26 March 2015, GitHub fell victim to a massive distributed denial-of-service (DDOS) attack that lasted for more than 118 hours. The attack, which appeared to originate from China, primarily targeted GitHub-hosted user content describing methods of circumventing Internet censorship.
92 |

93 |
94 |
95 | 96 |
97 |

Links to Alleged NSA Data on GitHub

98 |
99 |

Researchers had pored over dumped data allegedly belonging to a group associated with the NSA. The data, which contains a number of working exploits, was distributed via Dropbox, MEGA, and other file sharing platforms.
The files were also linked to from a page on Github, but the company removed it despite having hosted plenty of hacked material in the past. It turns out that removal was not due to government pressure, but because the hacker or hackers behind the supposed breach were asking for cash to release more data.
100 |

101 |
102 |
103 | 104 |
105 |

10,000 AWS secret access keys publically available

106 |
107 |

Anyone who has your access key has the same level of access to your AWS resources that you do. Consequently, we go to significant lengths to protect your access keys, and in keeping with our shared-responsibility model, you should as well. 108 |
Read the article here
109 |

110 |
111 |
112 | 113 |
114 |

Over 600 private keys on GitHub for you to see.

115 |
116 |

Github has killed its search function to safeguard users who were caught out storing keys and passwords in public repositories. 'Users found that quite a large number of users who had added private keys to their repositories and then pushed the files up to GitHub. Searching on id_rsa, a file which contains the private key for SSH logins, returned over 600 results. Projects had live configuration files from cloud services such as Amazon Web Services and Azure with the encryption keys still included. Configuration and private key files are intended to be kept secret, since if it falls into wrong hands, that person can impersonate the user (or at least, the user's machine) and easily connect to that remote machine.' Search links popped up throughout Twitter pointing to stored keys, including what was reportedly account credentials for the Google Chrome source code repository. The keys can still be found using search engines, so check your repositories. 117 |
Read the article here
118 |

119 |
120 |
121 | 122 |
123 | 124 | Star me on GitHub 125 |

Need Assistance? View FAQ

126 |

Found something suspicious. Open an issue.

127 | 128 | -------------------------------------------------------------------------------- /Application/app/views/compares/home_v1_2.html.erb: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 |
6 |

Compare two Github accounts even though comparing is bad but it can be fun.

7 |
8 |
9 |
10 |
11 |
12 | 13 |
14 |
15 |

💪

16 |
17 | 18 |
19 | 20 |
21 | 22 |
23 |
24 |
25 |
Compare
26 |
27 |
28 | 29 |
30 | 31 | 41 | 42 | 44 | 45 |
46 |
47 | 48 | Star me on GitHub 49 | 50 | 51 | -------------------------------------------------------------------------------- /Application/app/views/compares/org.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 39 | 40 | 82 | 83 |
84 |
85 |
86 |
87 |

Find the best coder🏆in an organization

88 |
89 |
90 |
91 | 92 |
93 | 94 |
95 | 96 |
97 |
98 |
Compare
99 |
100 |
101 | 102 |
103 | 104 |
105 |
106 | 107 | Star me on GitHub 108 | 109 | 110 | -------------------------------------------------------------------------------- /Application/app/views/contributions/home.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 20 | 21 | 22 | 23 | 100 | Fork me on GitHub 101 | 102 | -------------------------------------------------------------------------------- /Application/app/views/funfacts/new_issues.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 16 | 17 | 18 | 19 | 76 | Fork me on GitHub 77 |

Need Assistance? View FAQ

78 |

Found something suspicious. Open an issue.

79 | 80 | 81 | -------------------------------------------------------------------------------- /Application/app/views/funfacts/new_users.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | 17 | 18 | 102 | Fork me on GitHub 103 |

Need Assistance? View FAQ

104 |

Found something suspicious. Open an issue.

105 | 106 | 107 | -------------------------------------------------------------------------------- /Application/app/views/funfacts/oldest_issues.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 | 20 | 85 | Fork me on GitHub 86 |

Need Assistance? View FAQ

87 |

Found something suspicious. Open an issue.

88 | 157 | 158 | 159 | -------------------------------------------------------------------------------- /Application/app/views/layouts/_battle.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Hunter 5 | 6 | <%= stylesheet_link_tag "styles" %> 7 | <%= stylesheet_link_tag "foundation" %> 8 | 9 | <%= javascript_include_tag "scraper" %> 10 | <%= javascript_include_tag "app" %> 11 | 12 | 13 | 14 | <%= csrf_meta_tags %> 15 | 16 | 17 | 18 | 70 | 71 | 122 | 123 | 124 | 125 | 126 | <%= yield %> 127 | 128 | 129 | -------------------------------------------------------------------------------- /Application/app/views/layouts/_head.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Hunter 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | <%= javascript_include_tag "scraper" %> 17 | 18 | <%= csrf_meta_tags %> 19 | 20 | 21 | 22 | 23 | 24 | 42 | 43 | 44 | <%= yield %> 45 | 46 | 47 | 48 | 85 | 86 | 87 | 190 | 191 | 238 | 239 | 240 | -------------------------------------------------------------------------------- /Application/app/views/layouts/_org.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Hunter 5 | 6 | <%= stylesheet_link_tag "styles" %> 7 | <%= stylesheet_link_tag "foundation" %> 8 | 9 | <%= javascript_include_tag "scraper2" %> 10 | <%= javascript_include_tag "app2" %> 11 | 12 | 13 | 14 | <%= csrf_meta_tags %> 15 | 16 | 17 | 18 | 19 | 56 | 57 | 58 | 160 | 161 | 208 | 209 | 228 | 229 | 280 | 281 | 282 | 283 | 299 | 300 | 301 | 302 | <%= yield %> 303 | 304 | 305 | -------------------------------------------------------------------------------- /Application/app/views/layouts/application.html.erb: -------------------------------------------------------------------------------- 1 | <% if current_page?(org_path) %> 2 | <%= render 'layouts/org' %> 3 | <% elsif current_page?(compare_path) %> 4 | <%= render 'layouts/battle' %> 5 | <% else %> 6 | <%= render 'layouts/head' %> 7 | <% end %> -------------------------------------------------------------------------------- /Application/app/views/pages/home.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 43 | 44 | 246 | 247 | 248 | 454 | View me on GitHub 455 |

Need Assistance? View FAQ

456 | 457 | 458 | -------------------------------------------------------------------------------- /Application/bin/bundle: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby.exe 2 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 3 | load Gem.bin_path('bundler', 'bundle') 4 | -------------------------------------------------------------------------------- /Application/bin/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby.exe 2 | APP_PATH = File.expand_path('../../config/application', __FILE__) 3 | require_relative '../config/boot' 4 | require 'rails/commands' 5 | -------------------------------------------------------------------------------- /Application/bin/rake: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby.exe 2 | require_relative '../config/boot' 3 | require 'rake' 4 | Rake.application.run 5 | -------------------------------------------------------------------------------- /Application/bin/setup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby.exe 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 | -------------------------------------------------------------------------------- /Application/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 | -------------------------------------------------------------------------------- /Application/config/application.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('../boot', __FILE__) 2 | 3 | require 'rails/all' 4 | 5 | # Require the gems listed in Gemfile, including any gems 6 | # you've limited to :test, :development, or :production. 7 | Bundler.require(*Rails.groups) 8 | 9 | module Hunter 10 | class Application < Rails::Application 11 | # Settings in config/environments/* take precedence over those specified here. 12 | # Application configuration should go into files in config/initializers 13 | # -- all .rb files in that directory are automatically loaded. 14 | 15 | # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. 16 | # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. 17 | # config.time_zone = 'Central Time (US & Canada)' 18 | 19 | # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. 20 | # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] 21 | # config.i18n.default_locale = :de 22 | 23 | # Do not swallow errors in after_commit/after_rollback callbacks. 24 | config.active_record.raise_in_transactional_callbacks = true 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /Application/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 | -------------------------------------------------------------------------------- /Application/config/database.yml: -------------------------------------------------------------------------------- 1 | # SQLite version 3.x 2 | # gem install sqlite3 3 | # 4 | # Ensure the SQLite 3 gem is defined in your Gemfile 5 | # gem 'sqlite3' 6 | # 7 | default: &default 8 | adapter: sqlite3 9 | pool: 5 10 | timeout: 5000 11 | 12 | development: 13 | <<: *default 14 | database: db/development.sqlite3 15 | 16 | # Warning: The database defined as "test" will be erased and 17 | # re-generated from your development database when you run "rake". 18 | # Do not set this db to the same as development or production. 19 | test: 20 | <<: *default 21 | database: db/test.sqlite3 22 | 23 | production: 24 | <<: *default 25 | database: db/production.sqlite3 26 | -------------------------------------------------------------------------------- /Application/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 | -------------------------------------------------------------------------------- /Application/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 | -------------------------------------------------------------------------------- /Application/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 = true 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 | -------------------------------------------------------------------------------- /Application/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 | -------------------------------------------------------------------------------- /Application/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 | Rails.application.config.assets.precompile += %w( search.js ) 13 | Rails.application.config.assets.precompile += %w( scraper.js ) 14 | Rails.application.config.assets.precompile += %w( app.js ) 15 | Rails.application.config.assets.precompile += %w( styles.css ) 16 | Rails.application.config.assets.precompile += %w( foundation.css ) 17 | Rails.application.config.assets.precompile += %w( scraper2.js ) 18 | Rails.application.config.assets.precompile += %w( app2.js ) -------------------------------------------------------------------------------- /Application/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 | -------------------------------------------------------------------------------- /Application/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 | -------------------------------------------------------------------------------- /Application/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 | -------------------------------------------------------------------------------- /Application/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 | -------------------------------------------------------------------------------- /Application/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 | Mime::Type.register "image/svg+xml", :svg 6 | -------------------------------------------------------------------------------- /Application/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: '_hunter_session' 4 | -------------------------------------------------------------------------------- /Application/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 | -------------------------------------------------------------------------------- /Application/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 | -------------------------------------------------------------------------------- /Application/config/routes.rb: -------------------------------------------------------------------------------- 1 | Rails.application.routes.draw do 2 | 3 | # PROFILE PRESENTATION 4 | get '', to: 'pages#home' 5 | 6 | # FUN FACTS 7 | get 'sad_users', to: 'funfacts#sad_users' 8 | get 'popular_users', to: 'funfacts#top_users_followers' 9 | get 'new_users', to: 'funfacts#new_users' 10 | get 'ancestors', to: 'funfacts#ancestors' 11 | get 'oldest_issues', to: 'funfacts#oldest_issues' 12 | get 'new_issues', to: 'funfacts#new_issues' 13 | get 'popular_issues', to: 'funfacts#popular_issues' 14 | 15 | # Believe it or not: GitHub 16 | get '/believe', to: 'believes#home' 17 | 18 | # GitHub Compare 19 | get '/compare', to: 'compares#home_v1_2' 20 | get '/org', to: 'compares#org' 21 | 22 | # Contribution graph feature 23 | get '/contribution', to: 'contributions#home' 24 | get "/contribution/:username" => "contributions#generate", format: :svg 25 | end -------------------------------------------------------------------------------- /Application/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: 219e0e1ab34a4a6e342c1a0879af7966175fcee5cef3f951e0e1dfef0a8045010d5a839c8dfa8fa0c8d2002d477c50b001d961c056fb88bfec079f49faddd12e 15 | 16 | test: 17 | secret_key_base: 01f219ed07ba15cdf0af4620b8f93515cf5ae1b20d234ebce8e4a9ccf34315f3067559727636bdd690b49aca87cc232101b709d61e7346e16022e28b1b8909d3 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 | -------------------------------------------------------------------------------- /Application/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 | -------------------------------------------------------------------------------- /Application/lib/assets/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/lib/assets/.keep -------------------------------------------------------------------------------- /Application/lib/tasks/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/lib/tasks/.keep -------------------------------------------------------------------------------- /Application/log/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/log/.keep -------------------------------------------------------------------------------- /Application/public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The page you were looking for doesn't exist (404) 5 | 6 | 55 | 56 | 57 | 58 | 59 |
60 |
61 |

The page you were looking for doesn't exist.

62 |

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

63 |
64 |

If you are the application owner check the logs for more information.

65 |
66 | 67 | 68 | -------------------------------------------------------------------------------- /Application/public/422.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The change you wanted was rejected (422) 5 | 6 | 55 | 56 | 57 | 58 | 59 |
60 |
61 |

The change you wanted was rejected.

62 |

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

63 |
64 |

If you are the application owner check the logs for more information.

65 |
66 | 67 | 68 | -------------------------------------------------------------------------------- /Application/public/500.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | We're sorry, but something went wrong (500) 5 | 6 | 55 | 56 | 57 | 58 | 59 |
60 |
61 |

We're sorry, but something went wrong.

62 |
63 |

If you are the application owner check the logs for more information.

64 |
65 | 66 | 67 | -------------------------------------------------------------------------------- /Application/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/public/favicon.ico -------------------------------------------------------------------------------- /Application/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 | -------------------------------------------------------------------------------- /Application/test/controllers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/test/controllers/.keep -------------------------------------------------------------------------------- /Application/test/controllers/pages_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class PagesControllerTest < ActionController::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /Application/test/fixtures/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/test/fixtures/.keep -------------------------------------------------------------------------------- /Application/test/helpers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/test/helpers/.keep -------------------------------------------------------------------------------- /Application/test/integration/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/test/integration/.keep -------------------------------------------------------------------------------- /Application/test/mailers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/test/mailers/.keep -------------------------------------------------------------------------------- /Application/test/models/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/test/models/.keep -------------------------------------------------------------------------------- /Application/test/test_helper.rb: -------------------------------------------------------------------------------- 1 | ENV['RAILS_ENV'] ||= 'test' 2 | require File.expand_path('../../config/environment', __FILE__) 3 | require 'rails/test_help' 4 | 5 | class ActiveSupport::TestCase 6 | # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. 7 | fixtures :all 8 | 9 | # Add more helper methods to be used by all tests here... 10 | end 11 | -------------------------------------------------------------------------------- /Application/vendor/assets/javascripts/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/vendor/assets/javascripts/.keep -------------------------------------------------------------------------------- /Application/vendor/assets/stylesheets/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Application/vendor/assets/stylesheets/.keep -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | CC0 1.0 Universal 2 | 3 | Statement of Purpose 4 | 5 | The laws of most jurisdictions throughout the world automatically confer 6 | exclusive Copyright and Related Rights (defined below) upon the creator and 7 | subsequent owner(s) (each and all, an "owner") of an original work of 8 | authorship and/or a database (each, a "Work"). 9 | 10 | Certain owners wish to permanently relinquish those rights to a Work for the 11 | purpose of contributing to a commons of creative, cultural and scientific 12 | works ("Commons") that the public can reliably and without fear of later 13 | claims of infringement build upon, modify, incorporate in other works, reuse 14 | and redistribute as freely as possible in any form whatsoever and for any 15 | purposes, including without limitation commercial purposes. These owners may 16 | contribute to the Commons to promote the ideal of a free culture and the 17 | further production of creative, cultural and scientific works, or to gain 18 | reputation or greater distribution for their Work in part through the use and 19 | efforts of others. 20 | 21 | For these and/or other purposes and motivations, and without any expectation 22 | of additional consideration or compensation, the person associating CC0 with a 23 | Work (the "Affirmer"), to the extent that he or she is an owner of Copyright 24 | and Related Rights in the Work, voluntarily elects to apply CC0 to the Work 25 | and publicly distribute the Work under its terms, with knowledge of his or her 26 | Copyright and Related Rights in the Work and the meaning and intended legal 27 | effect of CC0 on those rights. 28 | 29 | 1. Copyright and Related Rights. A Work made available under CC0 may be 30 | protected by copyright and related or neighboring rights ("Copyright and 31 | Related Rights"). Copyright and Related Rights include, but are not limited 32 | to, the following: 33 | 34 | i. the right to reproduce, adapt, distribute, perform, display, communicate, 35 | and translate a Work; 36 | 37 | ii. moral rights retained by the original author(s) and/or performer(s); 38 | 39 | iii. publicity and privacy rights pertaining to a person's image or likeness 40 | depicted in a Work; 41 | 42 | iv. rights protecting against unfair competition in regards to a Work, 43 | subject to the limitations in paragraph 4(a), below; 44 | 45 | v. rights protecting the extraction, dissemination, use and reuse of data in 46 | a Work; 47 | 48 | vi. database rights (such as those arising under Directive 96/9/EC of the 49 | European Parliament and of the Council of 11 March 1996 on the legal 50 | protection of databases, and under any national implementation thereof, 51 | including any amended or successor version of such directive); and 52 | 53 | vii. other similar, equivalent or corresponding rights throughout the world 54 | based on applicable law or treaty, and any national implementations thereof. 55 | 56 | 2. Waiver. To the greatest extent permitted by, but not in contravention of, 57 | applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and 58 | unconditionally waives, abandons, and surrenders all of Affirmer's Copyright 59 | and Related Rights and associated claims and causes of action, whether now 60 | known or unknown (including existing as well as future claims and causes of 61 | action), in the Work (i) in all territories worldwide, (ii) for the maximum 62 | duration provided by applicable law or treaty (including future time 63 | extensions), (iii) in any current or future medium and for any number of 64 | copies, and (iv) for any purpose whatsoever, including without limitation 65 | commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes 66 | the Waiver for the benefit of each member of the public at large and to the 67 | detriment of Affirmer's heirs and successors, fully intending that such Waiver 68 | shall not be subject to revocation, rescission, cancellation, termination, or 69 | any other legal or equitable action to disrupt the quiet enjoyment of the Work 70 | by the public as contemplated by Affirmer's express Statement of Purpose. 71 | 72 | 3. Public License Fallback. Should any part of the Waiver for any reason be 73 | judged legally invalid or ineffective under applicable law, then the Waiver 74 | shall be preserved to the maximum extent permitted taking into account 75 | Affirmer's express Statement of Purpose. In addition, to the extent the Waiver 76 | is so judged Affirmer hereby grants to each affected person a royalty-free, 77 | non transferable, non sublicensable, non exclusive, irrevocable and 78 | unconditional license to exercise Affirmer's Copyright and Related Rights in 79 | the Work (i) in all territories worldwide, (ii) for the maximum duration 80 | provided by applicable law or treaty (including future time extensions), (iii) 81 | in any current or future medium and for any number of copies, and (iv) for any 82 | purpose whatsoever, including without limitation commercial, advertising or 83 | promotional purposes (the "License"). The License shall be deemed effective as 84 | of the date CC0 was applied by Affirmer to the Work. Should any part of the 85 | License for any reason be judged legally invalid or ineffective under 86 | applicable law, such partial invalidity or ineffectiveness shall not 87 | invalidate the remainder of the License, and in such case Affirmer hereby 88 | affirms that he or she will not (i) exercise any of his or her remaining 89 | Copyright and Related Rights in the Work or (ii) assert any associated claims 90 | and causes of action with respect to the Work, in either case contrary to 91 | Affirmer's express Statement of Purpose. 92 | 93 | 4. Limitations and Disclaimers. 94 | 95 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 96 | surrendered, licensed or otherwise affected by this document. 97 | 98 | b. Affirmer offers the Work as-is and makes no representations or warranties 99 | of any kind concerning the Work, express, implied, statutory or otherwise, 100 | including without limitation warranties of title, merchantability, fitness 101 | for a particular purpose, non infringement, or the absence of latent or 102 | other defects, accuracy, or the present or absence of errors, whether or not 103 | discoverable, all to the greatest extent permissible under applicable law. 104 | 105 | c. Affirmer disclaims responsibility for clearing rights of other persons 106 | that may apply to the Work or any use thereof, including without limitation 107 | any person's Copyright and Related Rights in the Work. Further, Affirmer 108 | disclaims responsibility for obtaining any necessary consents, permissions 109 | or other rights required for any use of the Work. 110 | 111 | d. Affirmer understands and acknowledges that Creative Commons is not a 112 | party to this document and has no duty or obligation with respect to this 113 | CC0 or use of the Work. 114 | 115 | For more information, please see 116 | 117 | -------------------------------------------------------------------------------- /Preview/adichat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Preview/adichat.jpg -------------------------------------------------------------------------------- /Preview/github_compare.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Preview/github_compare.gif -------------------------------------------------------------------------------- /Preview/preview_1.2.0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Preview/preview_1.2.0.gif -------------------------------------------------------------------------------- /Preview/repository-hunter.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Preview/repository-hunter.gif -------------------------------------------------------------------------------- /Preview/repository_hunter_1.3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdiChat/Repository-Hunter/245e900f1a38fefb737641efc49938b6de38ffb9/Preview/repository_hunter_1.3.gif -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Repository Hunter :octocat:
2 | 3 | [![Join the chat at https://gitter.im/AdiChat/Repository-Hunter](https://badges.gitter.im/AdiChat/Repository-Hunter.svg)](https://gitter.im/AdiChat/Repository-Hunter?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 4 | [![License](https://img.shields.io/badge/license-CC0--1.0-orange.svg)](https://img.shields.io/badge/license-CC0--1.0-orange.svg)
5 | 6 | ### Making GitHub:octocat: more socially engaging 🎮 and fun 🍥 for all 👦 + 👧 + 👴 + 👶 + 🐮 + 🐦 + 🐱 ...
7 | 8 | ![alt text](https://github.com/AdiChat/Repository-Hunter/blob/master/Preview/repository_hunter_1.3.gif " The view of the application")
9 | 10 | The application provides 6 kinds of services: 11 | * **Believe it or not** 12 | * **Fun Facts** 13 | * **Embeddable GitHub Contribution graph** 14 | * **Compare two GitHub profiles** 15 | * **Find the best coder at an organization** 16 | * **Profile Presentation** 17 | 18 | * The first feature is 🎉 **Believe it or not**🎉. It explores some of the mysterious corners at GitHub such as: 19 | * A man who has been committing for over **100 years**. 20 | * A **16-year-old issue** on 9-year-old GitHub using 12-year-old Git 21 | * A man with **no contribution graph**. 22 | * A human with a name that extends vertically indefinitely and much more. 23 | 24 | * The second engaging feature is the 🎉 **_Fun Facts_** 🎉. This meets the curiosity of a human to peek into the progress/ work accomplished by other users. Several engaging facts are presented which when observed closely provides deep insights into the mind of our fellow GitHub users. Some instances of engaging features are the list of most commented issues in GitHub, the list of oldest issues in GitHub, some of the most popular developers in GitHub and others. Some deep insights are: 25 | * The most commented issue has around **16565 comments** but the sad part is that it is a result of automation. 26 | * The oldest unresolved bug is around **_15 years old_**. 27 | * The most popular user is _Linus Torvalds_ with over **_46700 followers_** whereas he follows none (contrary to the assumption that "_`more users I follow, the more users will follow me`_") . 28 | * A seemingly authentic issue has over **1915 comments** which is a discussion💭 over iCloudin, which is a tool to bypass iCloud and another issue addressing the same issue has over **1279 comments**. The strange part is there are only around 130 participants, a small number compared to other issues. 29 | * An issue over a project that won China 🌍 2014 State Science and Technology Prizes has over **1426 comments** with over **997 participants**.
30 | and observations continue forever. ▶️ 31 | 32 | * The third one is 🎉 **_Embeddable GitHub Contribution graph_** 📅. This allows anyone to embed their contribution graph in any web application. Get your graph today! The best part is the even if your graph has been removed as happened with _Ciro Santilli_ several years ago, still, you will be able to **see your long lost graph** and save it for warm memories. Here is my saved contribution graph:
33 | ![alt text](https://github.com/AdiChat/Repository-Hunter/blob/master/Preview/adichat.jpg " The view of the contribution graph")
34 | Check out your graph and embed it today: **[here](http://repository-hunter.herokuapp.com/contribution)** 35 | 36 | * The fourth feature is 🎉 **GitHub Compare**. You can compare two GitHub accounts and find out who is :medal_sports:stronger💪 ? Yes, I know comparing two entities is not morally correct yet it is quite fun to see who's ahead? Take this as a disclaimer. 37 | 38 | * The fifth feature is 🎉 **GitHub master of the Organization** :1st_place_medal:. You can find the ranking of all public members of an organization and thus, there is an entity that dominates the ranking and hence, is the best 🏆 coder in the organization. 39 | 40 | The top five contributors at **Google** are: 41 | 42 | | Rank | Score | User | 43 | |:----:|:-----:|:----:| 44 | | 1 | 169.84 | [keyboardsurfer](https://github.com/keyboardsurfer) :1st_place_medal: 45 | | 2 | 136.01 | [spf13](https://github.com/spf13) 46 | | 3 | 126.47 | [philipwalton](https://github.com/philipwalton) 47 | | 4 | 119.82 | [igrigorik](https://github.com/igrigorik) 48 | | 5 | 119.42 | [jverkoey](https://github.com/jverkoey) 49 | 50 | See the full list [here](https://github.com/AdiChat/Repository-Hunter/wiki/Rank-List-at-Google). Take a look at the ranking list of **DuckDuckGo** [here](https://github.com/AdiChat/Repository-Hunter/wiki/Rank-List-at-DuckDuckGo). 51 | 52 | * The sixth one is a 🎉 **user profile presentation service** :person_fencing: where the public profile details such as some users following the concerned user, some users being followed by the concerned user, the language usage distribution and some public information is displayed in an exciting way. Check your profile [today](http://repository-hunter.herokuapp.com/). 53 | 54 | #### Use the app [here](http://repository-hunter.herokuapp.com/)
55 | 56 | New exciting features coming soon. 🎉 57 | 58 | Consider giving this repository a 🌟 if you enjoyed it.
59 | --------------------------------------------------------------------------------