# encoding: utf-8 require 'spec_helper' include GitTrend RSpec.describe GitTrend::CLI do describe '#list' do before do @cli = CLI.new end context 'with no option' do before do stub_request_get('trending') end it 'display daily ranking' do expect { @cli.list }.to output(dummy_result_no_options).to_stdout end end describe 'with -l option' do context 'with ruby' do before do stub_request_get("trending?l=#{language}") end let(:language) {'ruby'} it 'display daily ranking by language' do res = <<-'EOS'.unindent |No. Name Lang Star Fork |--- ---------------------------------------- ---------- ------ ----- | 1 prat0318/json_resume Ruby 412 27 | 2 dawn/dawn Ruby 57 2 | 3 Homebrew/homebrew Ruby 15 7 | 4 etsy/nagios-herald Ruby 18 0 | 5 jekyll/jekyll Ruby 14 4 | 6 opf/openproject Ruby 11 0 | 7 caskroom/homebrew-cask Ruby 9 3 | 8 rails/rails Ruby 6 7 | 9 interagent/prmd Ruby 9 0 | 10 mitchellh/vagrant Ruby 8 2 | 11 discourse/discourse Ruby 7 3 | 12 CanCanCommunity/cancancan Ruby 7 1 | 13 venmo/synx Ruby 7 0 | 14 laravel/homestead Shell 6 2 | 15 alexreisner/geocoder Ruby 6 0 | 16 visionmedia/commander Ruby 5 0 | 17 CocoaPods/Specs Ruby 0 3 | 18 gitlabhq/gitlabhq Ruby 0 2 | 19 puppetlabs/puppetlabs-apache Ruby 0 2 | 20 gitlabhq/gitlab-recipes Ruby 0 2 | 21 Mixd/wp-deploy Ruby 0 1 | 22 svenfuchs/rails-i18n Ruby 0 1 | 23 Homebrew/homebrew-php Ruby 0 1 | 24 sferik/twitter Ruby 0 1 | 25 rightscale/rightscale_cookbooks Ruby 0 1 EOS expect { @cli.invoke(:list, [], {language: language}) }.to output(res).to_stdout end end context 'with objective-c++ (including + sign)' do before do stub_request_get("trending?l=objective-c%2B%2B") end let(:language) {'objective-c++'} it 'display daily ranking by language' do res = <<-'EOS'.unindent |No. Name Lang Star Fork |--- ---------------------------------------- ------------- ------ ----- | 1 facebook/pop Objective-C++ 0 0 | 2 johnno1962/Xtrace Objective-C++ 0 0 | 3 pivotal/cedar Objective-C++ 0 0 | 4 wetube/bitcloud Objective-C++ 0 0 | 5 jerols/PopTut Objective-C++ 0 0 | 6 otaviocc/OCBorghettiView Objective-C++ 0 0 | 7 droolsjbpm/optaplanner Objective-C++ 0 0 | 8 otaviocc/NHCalendarActivity Objective-C++ 0 0 | 9 callmeed/pop-playground Objective-C++ 0 0 | 10 jxd001/POPdemo Objective-C++ 0 0 | 11 couchdeveloper/RXPromise Objective-C++ 0 0 | 12 johnno1962/XprobePlugin Objective-C++ 0 0 | 13 openpeer/opios Objective-C++ 0 0 | 14 pivotal/PivotalCoreKit Objective-C++ 0 0 | 15 rbaumbach/Swizzlean Objective-C++ 0 0 | 16 andreacremaschi/ShapeKit Objective-C++ 0 0 | 17 Smartype/iOS_VPNPlugIn Objective-C++ 0 0 | 18 humblehacker/AutoLayoutDSL Objective-C++ 0 0 | 19 hoddez/FFTAccelerate Objective-C++ 0 0 | 20 armadillu/ofxPanZoom Objective-C++ 0 0 | 21 dodikk/CsvToSqlite Objective-C++ 0 0 | 22 hbang/TypeStatus Objective-C++ 0 0 | 23 trentbrooks/ofxCoreMotion Objective-C++ 0 0 | 24 Yonsm/CeleWare Objective-C++ 0 0 | 25 ccrma/miniAudicle Objective-C++ 0 0 EOS expect { @cli.invoke(:list, [], {language: language}) }.to output(res).to_stdout end end end describe 'with -s option' do context 'with weekly' do before do stub_request_get("trending?since=#{since}") end let(:since) {'weekly'} it 'display daily ranking since weekly' do res = <<-'EOS'.unindent |No. Name Lang Star Fork |--- -------------------------------------------------- ------------ ------ ----- | 1 numbbbbb/the-swift-programming-language-in-chinese JavaScript 2495 679 | 2 jessepollak/card CSS 2177 153 | 3 grant/swift-cheat-sheet JavaScript 1906 122 | 4 tictail/bounce.js CSS 1540 74 | 5 fullstackio/FlappySwift Swift 1125 401 | 6 GoogleCloudPlatform/kubernetes Go 1001 97 | 7 andlabs/ui Go 1004 36 | 8 facebook/Haxl Haskell 911 53 | 9 greatfire/wiki 683 196 | 10 interagent/http-api-design 757 42 | 11 prat0318/json_resume Ruby 717 50 | 12 lafikl/steady.js JavaScript 717 20 | 13 dotcloud/docker Go 617 119 | 14 dmytrodanylyk/circular-progress-button Java 608 69 | 15 docker/libswarm Go 606 20 | 16 watilde/beeplay JavaScript 594 23 | 17 austinzheng/swift-2048 Swift 518 116 | 18 Flolagale/mailin Python 543 14 | 19 hiphopapp/hiphop CoffeeScript 507 71 | 20 rpicard/explore-flask Python 454 27 | 21 addyosmani/psi JavaScript 443 8 | 22 twbs/bootstrap CSS 290 189 | 23 angular/angular.js JavaScript 268 194 | 24 mbostock/d3 JavaScript 307 113 | 25 maxpow4h/swiftz Swift 350 20 EOS expect { @cli.invoke(:list, [], {since: since}) }.to output(res).to_stdout end end context 'with monthly' do before do stub_request_get("trending?since=#{since}") end let(:since) {'monthly'} it 'display daily ranking since monthly' do res = <<-'EOS'.unindent |No. Name Lang Star Fork |--- -------------------------------------------------- ------------ ------ ----- | 1 fullstackio/FlappySwift Swift 5753 1530 | 2 interagent/http-api-design 4735 214 | 3 jessepollak/card CSS 3944 257 | 4 numbbbbb/the-swift-programming-language-in-chinese JavaScript 3159 831 | 5 calmh/syncthing Go 2738 123 | 6 grant/swift-cheat-sheet JavaScript 2254 136 | 7 atom/atom CoffeeScript 1761 285 | 8 angular/angular.js JavaScript 1389 842 | 9 schneiderandre/popping Objective-C 1681 129 | 10 quilljs/quill CoffeeScript 1655 75 | 11 twbs/bootstrap CSS 1235 887 | 12 tictail/bounce.js CSS 1553 74 | 13 venmo/synx Ruby 1545 40 | 14 lovell/sharp JavaScript 1528 39 | 15 mbostock/d3 JavaScript 1101 424 | 16 facebook/jest JavaScript 1287 50 | 17 octobercms/october PHP 1190 192 | 18 buunguyen/octotree JavaScript 1228 90 | 19 felipernb/algorithms.js JavaScript 1206 90 | 20 strongloop/loopback JavaScript 1198 61 | 21 greatfire/wiki 1067 254 | 22 austinzheng/swift-2048 Swift 1083 218 | 23 dotcloud/docker Go 1057 269 | 24 julianshapiro/velocity JavaScript 1081 71 | 25 babun/babun Shell 1068 46 EOS expect { @cli.invoke(:list, [], {since: since}) }.to output(res).to_stdout end end end describe 'with -d option' do after do ENV['COLUMNS'] = nil ENV['LINES'] = nil end context 'terminal width is enough' do before do stub_request_get("trending") ENV['COLUMNS'] = '140' ENV['LINES'] = '40' end it 'display daily ranking with description' do res = <<-'EOS'.unindent |No. Name Lang Star Fork Description |--- -------------------------------------------------- ------------ ------ ----- ----------------------------------------------------------- | 1 prat0318/json_resume Ruby 264 15 Generates pretty HTML, LaTeX, markdown, with biodata fee... | 2 andlabs/ui Go 185 8 Platform-native GUI library for Go. | 3 jessepollak/card CSS 174 9 make your credit card form better in one line of code | 4 fullstackio/FlappySwift Swift 148 44 swift implementation of flappy bird. More at fullstacked... | 5 grant/swift-cheat-sheet 153 13 A short guide to using Apple's new programming language,... | 6 Flolagale/mailin Python 155 3 Artisanal inbound emails for every web app | 7 numbbbbb/the-swift-programming-language-in-chinese JavaScript 120 31 中文版 Apple 官方 Swift 教程《The Swift Programming Lang... | 8 hippyvm/hippyvm PHP 113 1 HippyVM - an implementation of the PHP language in RPyth... | 9 neovim/neovim C 83 8 vim's rebirth for the 21st century | 10 hiphopapp/hiphop CoffeeScript 77 8 Free music streaming app | 11 interagent/http-api-design 78 4 HTTP API design guide extracted from work on the Heroku ... | 12 austinzheng/swift-2048 Swift 69 16 2048 for Swift | 13 mdznr/What-s-New Objective-C 72 2 Easily present the latest changes and features to your u... | 14 daneden/animate.css CSS 65 6 A cross-browser library of CSS animations. As easy to us... | 15 davidmerfield/randomColor JavaScript 66 3 A color generator for JavaScript. | 16 dawn/dawn Ruby 62 2 Docker-based PaaS in Ruby | 17 greatfire/wiki 54 9 | 18 swift-jp/swift-guide CSS 45 9 Appleが公表した新プログラミング言語「Swift」についての資... | 19 addyosmani/psi JavaScript 49 0 PageSpeed Insights for Node - with reporting | 20 mtford90/silk Python 47 0 Silky smooth profiling for Django | 21 agaue/agaue Go 47 0 Golang blog framework | 22 mentionapp/mntpulltoreact Objective-C 46 1 One gesture, many actions. An evolution of Pull to Refre... | 23 mikepenz/AboutLibraries Java 45 0 AboutLibraries is a library to offer some information of... | 24 PistonDevelopers/piston-workspace Shell 45 0 Git submodules of Piston projects | 25 maxpow4h/swiftz Swift 43 1 Functional programming in Swift EOS expect { @cli.invoke(:list, [], {description: 'description'}) }.to output(res).to_stdout end end context 'terminal width is tiny' do before do stub_request_get("trending") ENV['COLUMNS'] = '100' # it is not enough for description. ENV['LINES'] = '40' end it 'display daily ranking about the same as no option' do expect { @cli.invoke(:list, [], {description: 'description'}) }.to output(dummy_result_no_options).to_stdout end end end describe 'with -l and -s option' do context 'with ruby and weekly' do before do stub_request_get("trending?l=#{language}&since=#{since}") end let(:language) {'ruby'} let(:since) {'weekly'} it 'display daily ranking since weekly' do res = <<-'EOS'.unindent |No. Name Lang Star Fork |--- ---------------------------------------- ---------- ------ ----- | 1 prat0318/json_resume Ruby 717 50 | 2 dawn/dawn Ruby 349 11 | 3 newrelic/centurion Ruby 213 6 | 4 Homebrew/homebrew Ruby 107 74 | 5 rails/rails Ruby 100 74 | 6 code-mancers/invoker Ruby 97 2 | 7 CanCanCommunity/cancancan Ruby 92 5 | 8 etsy/nagios-herald Ruby 89 0 | 9 jekyll/jekyll Ruby 74 25 | 10 venmo/synx Ruby 82 2 | 11 interagent/prmd Ruby 74 5 | 12 discourse/discourse Ruby 64 22 | 13 gitlabhq/gitlabhq Ruby 56 21 | 14 vigetlabs/sass-json-vars Ruby 65 0 | 15 caskroom/homebrew-cask Ruby 49 30 | 16 mitchellh/vagrant Ruby 53 19 | 17 harrystech/seed_migration Ruby 57 0 | 18 twbs/bootstrap-sass Ruby 47 17 | 19 opal/opal Ruby 50 2 | 20 plataformatec/devise Ruby 39 22 | 21 sass/sass Ruby 43 12 | 22 nickjj/orats Ruby 46 2 | 23 chrishunt/desktop Ruby 39 3 | 24 chloerei/campo Ruby 35 9 | 25 jordansissel/fpm Ruby 35 4 EOS expect { @cli.invoke(:list, [], {language: language, since: since}) }.to output(res).to_stdout end end end end describe '#all_languages' do before do @cli = CLI.new stub_request_get('trending') end context 'with no option' do it 'display daily ranking' do res = <<-'EOS'.unindent |abap |as3 |ada |agda |alloy |antlr |apex |applescript |arc |arduino |aspx-vb |aspectj |nasm |ats |augeas |autohotkey |autoit |awk |blitzbasic |bluespec |boo |brightscript |bro |c |csharp |cpp |ceylon |cirru |clean |clips |clojure |cobol |coffeescript |cfm |common-lisp |coq |crystal |css |cuda |d |dart |dcpu-16-asm |dm |dogescript |dot |dylan |e |ec |eiffel |elixir |elm |emacs-lisp |erlang |fsharp |factor |fancy |fantom |flux |forth |fortran |frege |game-maker-language |gams |gap |glyph |gnuplot |go |gosu |grammatical-framework |groovy |harbour |haskell |haxe |hy |idl |idris |inform-7 |io |ioke |j |java |javascript |jsoniq |julia |kotlin |krl |lasso |livescript |logos |logtalk |lua |m |markdown |mathematica |matlab |max/msp |mercury |ruby |monkey |moocode |moonscript |nemerle |nesc |netlogo |nimrod |nu |objective-c |objective-c++ |objective-j |ocaml |omgrofl |ooc |opa |openedge-abl |oxygene |pan |parrot |pascal |pawn |perl |perl6 |php |pike |pogoscript |powershell |processing |prolog |propeller-spin |puppet |pure-data |purescript |python |r |racket |ragel-in-ruby-host |rdoc |realbasic |rebol |red |robotframework |rouge |ruby |rust |sas |scala |scheme |scilab |self |bash |shellsession |shen |slash |smalltalk |sourcepawn |sql |squirrel |standard-ml |stata |supercollider |swift |systemverilog |tcl |tex |turing |txl |typescript |unrealscript |vala |verilog |vhdl |vim |visual-basic |volt |wisp |xbase |xc |xml |xproc |xquery |xslt |xtend |zephir |zimpl | |183 languages |you can get only selected language list with '-l' option. |if languages is unknown, you can specify 'unkown'. | EOS expect { @cli.all_languages }.to output(res).to_stdout end end end private def stub_request_get(stub_url) url = Scraper::BASE_HOST.dup url << "/#{stub_url}" if stub_url uri = URI.parse(url) stub_request(:get, uri). to_return( :status => 200, :headers => {content_type: 'text/html'}, :body => load_http_stub(stub_url)) end def dummy_result_no_options <<-'EOS'.unindent |No. Name Lang Star Fork |--- -------------------------------------------------- ------------ ------ ----- | 1 prat0318/json_resume Ruby 264 15 | 2 andlabs/ui Go 185 8 | 3 jessepollak/card CSS 174 9 | 4 fullstackio/FlappySwift Swift 148 44 | 5 grant/swift-cheat-sheet 153 13 | 6 Flolagale/mailin Python 155 3 | 7 numbbbbb/the-swift-programming-language-in-chinese JavaScript 120 31 | 8 hippyvm/hippyvm PHP 113 1 | 9 neovim/neovim C 83 8 | 10 hiphopapp/hiphop CoffeeScript 77 8 | 11 interagent/http-api-design 78 4 | 12 austinzheng/swift-2048 Swift 69 16 | 13 mdznr/What-s-New Objective-C 72 2 | 14 daneden/animate.css CSS 65 6 | 15 davidmerfield/randomColor JavaScript 66 3 | 16 dawn/dawn Ruby 62 2 | 17 greatfire/wiki 54 9 | 18 swift-jp/swift-guide CSS 45 9 | 19 addyosmani/psi JavaScript 49 0 | 20 mtford90/silk Python 47 0 | 21 agaue/agaue Go 47 0 | 22 mentionapp/mntpulltoreact Objective-C 46 1 | 23 mikepenz/AboutLibraries Java 45 0 | 24 PistonDevelopers/piston-workspace Shell 45 0 | 25 maxpow4h/swiftz Swift 43 1 EOS end end