market_bot 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Rakefile
CHANGED
@@ -82,6 +82,9 @@ namespace :spec do
|
|
82
82
|
|
83
83
|
download('https://market.android.com/details?id=apps_topselling_paid&cat=ARCADE&start=1000&num=24',
|
84
84
|
File.join(File.dirname(__FILE__), 'spec', 'market_bot', 'android', 'data', 'leaderboard-apps_topselling_paid-page4.txt'))
|
85
|
+
|
86
|
+
download('https://market.android.com/details?id=apps_editors_choice',
|
87
|
+
File.join(File.dirname(__FILE__), 'spec', 'market_bot', 'android', 'data', 'leaderboard-apps_editors_choice.txt'))
|
85
88
|
end
|
86
89
|
end
|
87
90
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.6
|
@@ -6,6 +6,14 @@ module MarketBot
|
|
6
6
|
attr_reader :hydra
|
7
7
|
|
8
8
|
def self.parse(html)
|
9
|
+
if html.include?('<title>Editors' Choice - Android Market</title>')
|
10
|
+
parse_editors_choice_page(html)
|
11
|
+
else
|
12
|
+
parse_normal_page(html)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.parse_normal_page(html)
|
9
17
|
results = []
|
10
18
|
doc = Nokogiri::HTML(html)
|
11
19
|
|
@@ -35,6 +43,26 @@ module MarketBot
|
|
35
43
|
results
|
36
44
|
end
|
37
45
|
|
46
|
+
def self.parse_editors_choice_page(html)
|
47
|
+
results = []
|
48
|
+
|
49
|
+
doc = Nokogiri::HTML(html)
|
50
|
+
|
51
|
+
doc.css('.fsg-snippet').each do |snippet_node|
|
52
|
+
result = {}
|
53
|
+
|
54
|
+
result[:title] = snippet_node.css('.title').text
|
55
|
+
result[:price_usd] = nil
|
56
|
+
result[:developer] = snippet_node.css('.goog-inline-block').text
|
57
|
+
result[:market_id] = snippet_node.attributes['data-docid'].text
|
58
|
+
result[:market_url] = "https://market.android.com/details?id=#{result[:market_id]}"
|
59
|
+
|
60
|
+
results << result
|
61
|
+
end
|
62
|
+
|
63
|
+
results
|
64
|
+
end
|
65
|
+
|
38
66
|
def initialize(identifier, category=nil, options={})
|
39
67
|
@identifier = identifier
|
40
68
|
@category = category
|
@@ -63,16 +91,21 @@ module MarketBot
|
|
63
91
|
end
|
64
92
|
|
65
93
|
def enqueue_update(options={})
|
66
|
-
|
67
|
-
|
94
|
+
if @identifier.to_s.downcase == 'apps_editors_choice' && category == nil
|
95
|
+
url = 'https://market.android.com/details?id=apps_editors_choice'
|
96
|
+
process_page(url, 1)
|
97
|
+
else
|
98
|
+
min_rank = options[:min_rank] || 1
|
99
|
+
max_rank = options[:max_rank] || 500
|
68
100
|
|
69
|
-
|
70
|
-
|
101
|
+
min_page = rank_to_page(min_rank)
|
102
|
+
max_page = rank_to_page(max_rank)
|
71
103
|
|
72
|
-
|
104
|
+
@parsed_results = []
|
73
105
|
|
74
|
-
|
75
|
-
|
106
|
+
urls = market_urls(:min_page => min_page, :max_page => max_page)
|
107
|
+
urls.each_index{ |i| process_page(urls[i], i+1) }
|
108
|
+
end
|
76
109
|
|
77
110
|
self
|
78
111
|
end
|
data/market_bot.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "market_bot"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Chad Remesch"]
|
12
|
-
s.date = "2011-10-
|
12
|
+
s.date = "2011-10-26"
|
13
13
|
s.description = "Market Bot is a high performance Ruby scraper for Google's Android Market with a simple to use API. It is built on top of Nokogiri and Typhoeus."
|
14
14
|
s.email = "chad@remesch.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
|
|
35
35
|
"spec/market_bot/android/data/app_1.txt",
|
36
36
|
"spec/market_bot/android/data/app_2.txt",
|
37
37
|
"spec/market_bot/android/data/app_3.txt",
|
38
|
+
"spec/market_bot/android/data/leaderboard-apps_editors_choice.txt",
|
38
39
|
"spec/market_bot/android/data/leaderboard-apps_topselling_paid-page1.txt",
|
39
40
|
"spec/market_bot/android/data/leaderboard-apps_topselling_paid-page2.txt",
|
40
41
|
"spec/market_bot/android/data/leaderboard-apps_topselling_paid-page3.txt",
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<!DOCTYPE html><!--
|
2
|
+
Content-type: Preventing MHTML XSS in IE.
|
3
|
+
|
4
|
+
--><html><head><script type="text/javascript">function a(c){this.t={};this.tick=function(c,e,b){b=b!=void 0?b:(new Date).getTime();this.t[c]=[b,e]};this.tick("start",null,c)}var d=new a;window.jstiming={Timer:a,load:d};try{var f=null;window.chrome&&window.chrome.csi&&(f=Math.floor(window.chrome.csi().pageT));f==null&&window.gtbExternal&&(f=window.gtbExternal.pageT());f==null&&window.external&&(f=window.external.pageT);f&&(window.jstiming.pt=f)}catch(g){};
|
5
|
+
</script>
|
6
|
+
<title>Editors' Choice - Android Market</title><link rel="stylesheet" href="/static/client/css/1199136287-site_css_ltr.css">
|
7
|
+
<meta name="Description" content="Discover the latest apps and games. Purchase and enjoy instantly on your Android phone or tablet."><link rel="shortcut icon" href="/static/client/images/favicon.ico"><style type="text/css">body, .stripes, .app-icon {background-image: url(/static/client/images/background-stripes.gif);}.star-on-img {background-image: url(/static/client/images/star-on.png);}.star-off-img {background-image: url(/static/client/images/star-off.png);}.star-on-dark-img {background-image: url(/static/client/images/star-on-dark.png);}.star-off-dark-img {background-image: url(/static/client/images/star-off-dark.png);}.star-half-dark-img {background-image: url(/static/client/images/star-half-dark.png);}.toggle-button {background-image: url(/static/client/images/toggle-button.png);}#super-tooltip-arrow {background-image: url(/static/client/images/tooltip-arrows.png);}.big-number {background-image: url(/static/client/images/ordered-list-circle.gif);}.search-summary {background-image:url(/static/client/images/search-header.gif);}.search-filters-toggle {background-image:url(/static/client/images/search-filters-notch.gif);}.doc-header-content, .page-banner-heading {background-image:url(/static/client/images/app-header-stripes.gif);}.mylibrary-page .page-banner-heading, .purchases-page .page-banner-heading, .doc-banner-container, .doc-banner-container-header {background-image:url(/static/client/images/dark-background-stripes.gif);}.books .doc-header-content, .books .page-banner-heading, .books .promo-page-banner-spacer {background-image:url(/static/client/images/book-header-stripes.gif);}.movies .doc-header-content, .movies .page-banner-heading {background-image:url(/static/client/images/movie-header-stripes.gif);}.page-banner-icon {background-image:url(/static/client/images/little_droid.png);}.books .page-banner-icon {background-image:url(/static/client/images/little-book.png);}.movies .page-banner-icon {background-image:url(/static/client/images/little-film.png);}.book-icon {background-image:url(/static/client/images/book-icon-background.png);}.apps .carousel-heading-wrapper {background-image:url(/static/client/images/app-carousel-icon.png);}.corpus-selector .apps .corpus-item {background-image:url(/static/client/images/app-carousel-icon-r.png);}.books .carousel-heading-wrapper {background-image:url(/static/client/images/book-carousel-icon.png);}.corpus-selector .books .corpus-item {background-image:url(/static/client/images/book-carousel-icon-r.png);}.movies .carousel-heading-wrapper {background-image:url(/static/client/images/movie-carousel-icon.png);}.corpus-selector .movies .corpus-item {background-image:url(/static/client/images/movie-carousel-icon-r.png);}.promo-thumbnail-splash {background-image:url(/static/client/images/promo-image-texture.gif);}.fsg-page-banner-wrapper {background-image:url(/static/client/images/dots-6x6.png);}.co-dialog-loading, .frag-loading-icon, .my-library-filter-loading-icon, .num-pagination-loading-icon, .sort-order-loading-icon, .co-dialog-img-waiting {background-image: url(/static/client/images/spinner.gif);}.goog-flat-menu-button-dropdown {background-image:url(/static/client/images/dropdown-triangle.png);}.co-dialog-header-logo, .rap-dialog-header-logo {background-image:url(/static/client/images/android-market-logo-checkout.png);}.modal-dialog-title-close {background-image: url(/static/client/images/green_close_x.png);}.odd-track {background-image:url(/static/client/images/dots.png);}.co-dialog-img-error {background-image: url(/static/client/images/warning-yield.png);}.co-dialog-selected, .co-dialog-img-ok {background-image: url(/static/client/images/checkmark.png);}.super-promo {background-image: url(/static/client/images/promo-background.png);}.tweet-button {background-image: url(/static/client/images/tweet.png);}</style><script src="https://checkout.google.com/customer/gadget/embeddedbuy.js?divId=checkout-root©rightFooterDivId=checkout-footer&hl=en_US&gl=US"></script><link rel="canonical" href="https://market.android.com/details?id=apps_editors_choice" /><link rel="alternate" hreflang="cs" href="https://market.android.com/details?id=apps_editors_choice&hl=cs" /><link rel="alternate" hreflang="da" href="https://market.android.com/details?id=apps_editors_choice&hl=da" /><link rel="alternate" hreflang="de" href="https://market.android.com/details?id=apps_editors_choice&hl=de" /><link rel="alternate" hreflang="en" href="https://market.android.com/details?id=apps_editors_choice&hl=en" /><link rel="alternate" hreflang="es" href="https://market.android.com/details?id=apps_editors_choice&hl=es" /><link rel="alternate" hreflang="es_419" href="https://market.android.com/details?id=apps_editors_choice&hl=es_419" /><link rel="alternate" hreflang="fr" href="https://market.android.com/details?id=apps_editors_choice&hl=fr" /><link rel="alternate" hreflang="it" href="https://market.android.com/details?id=apps_editors_choice&hl=it" /><link rel="alternate" hreflang="nl" href="https://market.android.com/details?id=apps_editors_choice&hl=nl" /><link rel="alternate" hreflang="no" href="https://market.android.com/details?id=apps_editors_choice&hl=no" /><link rel="alternate" hreflang="pl" href="https://market.android.com/details?id=apps_editors_choice&hl=pl" /><link rel="alternate" hreflang="pt_BR" href="https://market.android.com/details?id=apps_editors_choice&hl=pt_BR" /><link rel="alternate" hreflang="pt_PT" href="https://market.android.com/details?id=apps_editors_choice&hl=pt_PT" /><link rel="alternate" hreflang="fi" href="https://market.android.com/details?id=apps_editors_choice&hl=fi" /><link rel="alternate" hreflang="sv" href="https://market.android.com/details?id=apps_editors_choice&hl=sv" /><link rel="alternate" hreflang="tr" href="https://market.android.com/details?id=apps_editors_choice&hl=tr" /><link rel="alternate" hreflang="el" href="https://market.android.com/details?id=apps_editors_choice&hl=el" /><link rel="alternate" hreflang="ru" href="https://market.android.com/details?id=apps_editors_choice&hl=ru" /><link rel="alternate" hreflang="ko" href="https://market.android.com/details?id=apps_editors_choice&hl=ko" /><link rel="alternate" hreflang="zh_CN" href="https://market.android.com/details?id=apps_editors_choice&hl=zh_CN" /><link rel="alternate" hreflang="zh_TW" href="https://market.android.com/details?id=apps_editors_choice&hl=zh_TW" /><link rel="alternate" hreflang="ja" href="https://market.android.com/details?id=apps_editors_choice&hl=ja" /></head><body dir="ltr"><style type="text/css">#gbar,#guser{font-size:13px;padding-top:0 !important}#gbar{height:22px}#guser{padding-bottom:7px !important;text-align:right}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}@media all{.gb1{height:22px;margin-right:.5em;vertical-align:top}#gbar{float:left}}a.gb1,a.gb4{text-decoration:underline !important}a.gb1,a.gb4{color:#00c !important}.gbi .gb4{color:#dd8e27 !important}.gbf .gb4{color:#900 !important}</style><script>var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-19995902-1']); _gaq.push(['_trackPageLoadTime']); _gaq.push(['_trackPageview']); (function() {var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);})();</script><script src="https://apis.google.com/js/plusone.js">{"lang": "en_US"}</script><div id="gbar-header"><div id=gbar><nobr><a class=gb1 href="http://www.google.com/webhp?hl=en">Web</a> <a class=gb1 href="http://www.google.com/imghp?hl=en">Images</a> <a class=gb1 href="http://video.google.com/?hl=en">Videos</a> <a class=gb1 href="http://maps.google.com/maps?hl=en">Maps</a> <a class=gb1 href="http://news.google.com/nwshp?hl=en">News</a> <a class=gb1 href="http://www.google.com/prdhp?hl=en">Shopping</a> <a class=gb1 href="https://mail.google.com/mail/">Gmail</a> <a class=gb1 style="text-decoration:none" href="http://www.google.com/intl/en/options/"><u>More</u> »</a></nobr></div><div id=guser width=100%><nobr><span id=gbn class=gbi></span><span id=gbf class=gbf></span><span id=gbe><a href="/account" class=gb4>My Market Account</a> | </span><a id=gb_70 href="https://www.google.com/accounts/ServiceLogin?service=androidmarket&passive=86400&continue=https://market.android.com/details?id%3Dapps_editors_choice&followup=https://market.android.com/details?id%3Dapps_editors_choice" class=gb4>Sign in</a></nobr></div></div><div class="g-doc-1026 doc-content editorial-container-page-fsg editors-choice apps"><div id="header"><div id="main-header" class="g-section g-tpl-33-67 g-split"><div class="g-unit g-first"><a href="/" id="logo">Android Market</a></div><div class="g-unit"><div class="g-section g-tpl-67-33 g-split"><div class="g-unit g-first" style="text-align:right"><ul id="top-nav" class="top-nav"><li class="goog-inline-block top-nav-tab top-nav-tab-selected"><a href="/apps" class="top-nav-tab-apps">Apps</a><div class="top-nav-arrow"><div class="down-arrow"></div></div><ul class="top-nav-sub"><li class="top-nav-sub-item "><a href="/apps/GAME">Games</a><ul class="top-nav-sub"><li class="top-nav-sub-item "><a href="/apps/ARCADE">Arcade & Action</a></li><li class="top-nav-sub-item "><a href="/apps/BRAIN">Brain & Puzzle</a></li><li class="top-nav-sub-item "><a href="/apps/CARDS">Cards & Casino</a></li><li class="top-nav-sub-item "><a href="/apps/CASUAL">Casual</a></li><li class="top-nav-sub-item "><a href="/apps/GAME_WALLPAPER">Live Wallpaper</a></li><li class="top-nav-sub-item "><a href="/apps/RACING">Racing</a></li><li class="top-nav-sub-item "><a href="/apps/SPORTS_GAMES">Sports Games</a></li><li class="top-nav-sub-item top-nav-sub-item-last"><a href="/apps/GAME_WIDGETS">Widgets</a></li></ul></li><li class="top-nav-sub-item top-nav-sub-item-last"><a href="/apps/APPLICATION">Applications</a><ul class="top-nav-sub"><li class="top-nav-sub-item "><a href="/apps/BOOKS_AND_REFERENCE">Books & Reference</a></li><li class="top-nav-sub-item "><a href="/apps/BUSINESS">Business</a></li><li class="top-nav-sub-item "><a href="/apps/COMICS">Comics</a></li><li class="top-nav-sub-item "><a href="/apps/COMMUNICATION">Communication</a></li><li class="top-nav-sub-item "><a href="/apps/EDUCATION">Education</a></li><li class="top-nav-sub-item "><a href="/apps/ENTERTAINMENT">Entertainment</a></li><li class="top-nav-sub-item "><a href="/apps/FINANCE">Finance</a></li><li class="top-nav-sub-item "><a href="/apps/HEALTH_AND_FITNESS">Health & Fitness</a></li><li class="top-nav-sub-item "><a href="/apps/LIBRARIES_AND_DEMO">Libraries & Demo</a></li><li class="top-nav-sub-item "><a href="/apps/LIFESTYLE">Lifestyle</a></li><li class="top-nav-sub-item "><a href="/apps/APP_WALLPAPER">Live Wallpaper</a></li><li class="top-nav-sub-item "><a href="/apps/MEDIA_AND_VIDEO">Media & Video</a></li><li class="top-nav-sub-item "><a href="/apps/MEDICAL">Medical</a></li><li class="top-nav-sub-item "><a href="/apps/MUSIC_AND_AUDIO">Music & Audio</a></li><li class="top-nav-sub-item "><a href="/apps/NEWS_AND_MAGAZINES">News & Magazines</a></li><li class="top-nav-sub-item "><a href="/apps/PERSONALIZATION">Personalization</a></li><li class="top-nav-sub-item "><a href="/apps/PHOTOGRAPHY">Photography</a></li><li class="top-nav-sub-item "><a href="/apps/PRODUCTIVITY">Productivity</a></li><li class="top-nav-sub-item "><a href="/apps/SHOPPING">Shopping</a></li><li class="top-nav-sub-item "><a href="/apps/SOCIAL">Social</a></li><li class="top-nav-sub-item "><a href="/apps/SPORTS">Sports</a></li><li class="top-nav-sub-item "><a href="/apps/TOOLS">Tools</a></li><li class="top-nav-sub-item "><a href="/apps/TRANSPORTATION">Transportation</a></li><li class="top-nav-sub-item "><a href="/apps/TRAVEL_AND_LOCAL">Travel & Local</a></li><li class="top-nav-sub-item "><a href="/apps/WEATHER">Weather</a></li><li class="top-nav-sub-item top-nav-sub-item-last"><a href="/apps/APP_WIDGETS">Widgets</a></li></ul></li></ul></li><li class="goog-inline-block top-nav-tab "><a href="/movies" class="top-nav-tab-movies">Movies</a><div class="top-nav-arrow"><div class="down-arrow"></div></div><ul class="top-nav-sub"><li class="top-nav-sub-item "><a href="/movies/1">Action & Adventure</a></li><li class="top-nav-sub-item "><a href="/movies/2">Animation & Cartoons</a></li><li class="top-nav-sub-item "><a href="/movies/4">Comedy</a></li><li class="top-nav-sub-item "><a href="/movies/6">Drama</a></li><li class="top-nav-sub-item "><a href="/movies/7">Documentary</a></li><li class="top-nav-sub-item "><a href="/movies/8">Family</a></li><li class="top-nav-sub-item top-nav-sub-item-last"><a href="/movies/10">Horror</a></li></ul></li><li class="goog-inline-block top-nav-tab "><a href="/books" class="top-nav-tab-books">Books</a><div class="top-nav-arrow"><div class="down-arrow"></div></div><ul class="top-nav-sub"><li class="top-nav-sub-item "><a href="/books/coll_1204">Biographies & Memoirs</a></li><li class="top-nav-sub-item "><a href="/books/coll_1205">Business & Investing</a></li><li class="top-nav-sub-item "><a href="/books/coll_1206">Children's Books</a></li><li class="top-nav-sub-item "><a href="/books/coll_1207">Computers & Internet</a></li><li class="top-nav-sub-item "><a href="/books/coll_1208">Cooking, Food & Wine</a></li><li class="top-nav-sub-item "><a href="/books/coll_1221">Fantasy</a></li><li class="top-nav-sub-item "><a href="/books/coll_1200">Fiction</a></li><li class="top-nav-sub-item "><a href="/books/coll_1209">History</a></li><li class="top-nav-sub-item "><a href="/books/coll_1210">Humor</a></li><li class="top-nav-sub-item "><a href="/books/coll_1211">Lifestyle & Home</a></li><li class="top-nav-sub-item "><a href="/books/coll_1213">Mystery & Thrillers</a></li><li class="top-nav-sub-item "><a href="/books/coll_1214">Parenting & Families</a></li><li class="top-nav-sub-item "><a href="/books/coll_1215">Politics & Current Events</a></li><li class="top-nav-sub-item "><a href="/books/coll_1216">Reference</a></li><li class="top-nav-sub-item "><a href="/books/coll_1217">Religion & Spirituality</a></li><li class="top-nav-sub-item "><a href="/books/coll_1218">Romance</a></li><li class="top-nav-sub-item "><a href="/books/coll_1219">Science</a></li><li class="top-nav-sub-item "><a href="/books/coll_1220">Science Fiction</a></li><li class="top-nav-sub-item "><a href="/books/coll_1222">Sports</a></li><li class="top-nav-sub-item top-nav-sub-item-last"><a href="/books/coll_1224">Travel</a></li></ul></li><li class="goog-inline-block top-nav-tab top-nav-tab-last"><a href="/mylibrary" class="top-nav-tab-myLibrary">My Library</a></li></ul></div><div class="g-unit"><form action="/search" method="get" id="search-box" class="goog-inline-block"><input id="search-text" type="text" autocomplete="off" class="form-text-box no-focus" data-suggestServerUrl="https://market.android.com/suggest/SuggRequest?json=1" data-suggestServerType="apps" placeholder="Search" name="q" value=""><input id="search-button" type="submit" class="form-primary-button no-focus" tabindex="-1" value=""><input type=hidden name="so" value="1"/><input type=hidden name="c" value="apps"/></form></div></div></div></div><div id="alerts-bar" class="butter-bar" style="display:none"><span id="alerts-bar-contents"></span></div></div><div class="page-content"><div class="fsg-page-banner-wrapper"><div class="fsg-page-banner"style="background-image: url('https://g0.gstatic.com/android/market_images/editorial/editors-choice-header.jpg')"><div class="fsg-page-banner-heading"><div class="promo-page-banner-spacer"></div><h1 class="page-banner-text">Editors' Choice</h1></div></div></div><div class="fsg-description">Here are some of the best apps on Android Market, as chosen by our staff. From games to everyday tools and entertainment apps, we highly recommend you try these out!</div><div class="fsg-container"><table><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.ArtInGames.AirAttackHDLite"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.ArtInGames.AirAttackHDLite&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://www.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/airattack.jpg" alt="Air Attack HD"/></a></div><a data-a="1" data-c="1" href="/details?id=com.ArtInGames.AirAttackHDLite&feature=editorial-apps_editors_choice"><span class="title">Air Attack HD</span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=Art+In+Games">Art In Games</a></div></span><div class="description">A white-knuckled air attack into enemy territory... while on your coffee break.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.rovio.angrybirdsrio"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.rovio.angrybirdsrio&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_angrybirds.png" alt="Angry Birds Rio"/></a></div><a data-a="1" data-c="1" href="/details?id=com.rovio.angrybirdsrio&feature=editorial-apps_editors_choice"><span class="title">Angry Birds Rio</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Rovio+Mobile+Ltd.">Rovio Mobile Ltd.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Warning: This sequel to the infamous original may cause you to spend hours & hours of your life slinging birds. Again.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.bithack.apparatus"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.bithack.apparatus&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_apparatus.png" alt="Apparatus"/></a></div><a data-a="1" data-c="1" href="/details?id=com.bithack.apparatus&feature=editorial-apps_editors_choice"><span class="title">Apparatus</span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=Bithack">Bithack</a></div></span><div class="description">Recipe for fun: Start with a strangely addictive puzzle game. Add realistic physics. Top with stunning graphics.</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.levelup.beautifulwidgets"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.levelup.beautifulwidgets&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_beautifulwidgets.png" alt="Beautiful Widgets"/></a></div><a data-a="1" data-c="1" href="/details?id=com.levelup.beautifulwidgets&feature=editorial-apps_editors_choice"><span class="title">Beautiful Widgets</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=LevelUp+Studio">LevelUp Studio</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Checking the weather never looked so good! Hundreds of customizable options for your Android phone!</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.glu.android.bugvillage"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.glu.android.bugvillage&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_bugvillage.png" alt="Bug Village"/></a></div><a data-a="1" data-c="1" href="/details?id=com.glu.android.bugvillage&feature=editorial-apps_editors_choice"><span class="title">Bug Village</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Glu+Mobile">Glu Mobile</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Keep your bugs happy and they'll help you build a beautiful, 3-D colony.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.silvertree.cordy"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.silvertree.cordy&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_cordy.png" alt="Cordy"/></a></div><a data-a="1" data-c="1" href="/details?id=com.silvertree.cordy&feature=editorial-apps_editors_choice"><span class="title">Cordy</span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=SilverTree+Media">SilverTree Media</a></div></span><div class="description">A little robot that you've gotta love. Features true 3-D gameplay and incredible graphics.</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.doubleTwist.androidPlayerProKey"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.doubleTwist.androidPlayerProKey&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_doubletwist.png" alt="doubleTwist AirSync"/></a></div><a data-a="1" data-c="1" href="/details?id=com.doubleTwist.androidPlayerProKey&feature=editorial-apps_editors_choice"><span class="title">doubleTwist AirSync</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=doubleTwist+%E2%84%A2">doubleTwist ™</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Get the digital music from your computer onto your Android...with no wires!</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.endomondo.android.pro"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.endomondo.android.pro&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/endomondo.jpg" alt="Endomondo Pro"/></a></div><a data-a="1" data-c="1" href="/details?id=com.endomondo.android.pro&feature=editorial-apps_editors_choice"><span class="title">Endomondo Pro</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Endomondo">Endomondo</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Get your own personal trainer without personal trainer prices.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.espn.score_center"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.espn.score_center&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_espn.png" alt="ESPN ScoreCenter"/></a></div><a data-a="1" data-c="1" href="/details?id=com.espn.score_center&feature=editorial-apps_editors_choice"><span class="title">ESPN ScoreCenter</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=ESPN+Inc">ESPN Inc</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Its like having the whole SportsCenter crew in your pocket.</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.evernote"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.evernote&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/evernote.jpg" alt="Evernote"/></a></div><a data-a="1" data-c="1" href="/details?id=com.evernote&feature=editorial-apps_editors_choice"><span class="title">Evernote</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Evernote+Corp.">Evernote Corp.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Elephants never forget, neither does Evernote. Take notes, capture photos and record memos with this memory enhancer.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.facebook.katana"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.facebook.katana&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/facebook.jpg" alt="Facebook"/></a></div><a data-a="1" data-c="1" href="/details?id=com.facebook.katana&feature=editorial-apps_editors_choice"><span class="title">Facebook</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Facebook">Facebook</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Because your Facebook news feed is more important than the "real" news.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.subatomicstudios"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.subatomicstudios&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_fieldrunners.png" alt="Field Runners HD"/></a></div><a data-a="1" data-c="1" href="/details?id=com.subatomicstudios&feature=editorial-apps_editors_choice"><span class="title">Field Runners HD</span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=Subatomic+Studios,+LLC">Subatomic Studios, LLC</a></div></span><div class="description">The next generation tower defense game...classic gameplay with HD graphics and incredible animation.</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="net.flixster.android"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=net.flixster.android&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/flixster.jpg" alt="Flixster"/></a></div><a data-a="1" data-c="1" href="/details?id=net.flixster.android&feature=editorial-apps_editors_choice"><span class="title">Flixster</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Flixster+Inc.">Flixster Inc.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Having trouble figuring out what movie to see? Flixster has you covered with the latest movie reviews, trailers, and showtimes - all for free!</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.joelapenna.foursquared"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.joelapenna.foursquared&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/foursquare.jpg" alt="Foursquare"/></a></div><a data-a="1" data-c="1" href="/details?id=com.joelapenna.foursquared&feature=editorial-apps_editors_choice"><span class="title">Foursquare</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=foursquare">foursquare</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Makes checking in on Android a snap. Discover what is going on in the world around you!</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.glympse.android.glympse"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.glympse.android.glympse&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_glympse.png" alt="Glympse"/></a></div><a data-a="1" data-c="1" href="/details?id=com.glympse.android.glympse&feature=editorial-apps_editors_choice"><span class="title">Glympse</span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=Share+your+where">Share your where</a></div></span><div class="description">Location based sharing...where you control exactly who can see where you are and when they can see you.</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.google.android.apps.maps"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.google.android.apps.maps&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://www.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/googlemaps.jpg" alt="Google Maps"/></a></div><a data-a="1" data-c="1" href="/details?id=com.google.android.apps.maps&feature=editorial-apps_editors_choice"><span class="title">Google Maps</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Google+Inc.">Google Inc.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Doesn't matter if you type it or say it, Google Maps will find it and get you there.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.glu.android.gunbros_free"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.glu.android.gunbros_free&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://www.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_gunbros.png" alt="Gun bros"/></a></div><a data-a="1" data-c="1" href="/details?id=com.glu.android.gunbros_free&feature=editorial-apps_editors_choice"><span class="title">Gun bros</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Glu+Mobile">Glu Mobile</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Help Percy and Francis save the planet without getting off the couch.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.com2us.HB3D"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.com2us.HB3D&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/homerunbattle3d.jpg" alt="HomeRun Battle 3D"/></a></div><a data-a="1" data-c="1" href="/details?id=com.com2us.HB3D&feature=editorial-apps_editors_choice"><span class="title">HomeRun Battle 3D</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Com2uS">Com2uS</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Never made it to the big leagues? Who cares? It's your turn to hit it out of the park!</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.imdb.mobile"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.imdb.mobile&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_imdb.png" alt="IMdb"/></a></div><a data-a="1" data-c="1" href="/details?id=com.imdb.mobile&feature=editorial-apps_editors_choice"><span class="title">IMdb</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=IMDb">IMDb</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">End the "who starred in that movie" arguments for good. With IMdb you can become a film and TV know-it-all.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.amazon.kindle"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.amazon.kindle&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/kindle.jpg" alt="Kindle for Android"/></a></div><a data-a="1" data-c="1" href="/details?id=com.amazon.kindle&feature=editorial-apps_editors_choice"><span class="title">Kindle for Android</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Amazon+Mobile">Amazon Mobile</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Whether Twain or Twilight, the world's library is at your fingertips.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.mint"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.mint&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/mint.jpg" alt="Mint.com Personal Finance"/></a></div><a data-a="1" data-c="1" href="/details?id=com.mint&feature=editorial-apps_editors_choice"><span class="title">Mint.com Personal Finance</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Intuit+Inc">Intuit Inc</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Manage your personal finances from a slick app that's always with you. Staying on budget has never been easier!</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.bamnetworks.mobile.android.gameday.atbat2011.full"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.bamnetworks.mobile.android.gameday.atbat2011.full&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/mlbatbat.jpg" alt="MLB at Bat 11"/></a></div><a data-a="1" data-c="1" href="/details?id=com.bamnetworks.mobile.android.gameday.atbat2011.full&feature=editorial-apps_editors_choice"><span class="title">MLB at Bat 11</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=MLB+Advanced+Media,+L.P.">MLB Advanced Media, L.P.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Eat, breathe and sleep baseball. Baseball! Baseball! Baseball!</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.dualboot.apps.beach"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.dualboot.apps.beach&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_mybeach.png" alt="My Beach HD"/></a></div><a data-a="1" data-c="1" href="/details?id=com.dualboot.apps.beach&feature=editorial-apps_editors_choice"><span class="title">My Beach HD</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=DualBoot+Games">DualBoot Games</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Breathe the sea air, get sand in your toes...every time you use your phone</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.netgate"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.netgate&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://www.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_pageonce.png" alt="PageOnce - Money & Bills"/></a></div><a data-a="1" data-c="1" href="/details?id=com.netgate&feature=editorial-apps_editors_choice"><span class="title">PageOnce - Money & Bills</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Pageonce">Pageonce</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Keep on budget when you are on the go! Like a financial assistant on your phone.</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.larvalabs.photowall"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.larvalabs.photowall&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/photowall.jpg" alt="PhotoWall"/></a></div><a data-a="1" data-c="1" href="/details?id=com.larvalabs.photowall&feature=editorial-apps_editors_choice"><span class="title">PhotoWall</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Larva+Labs+Ltd.">Larva Labs Ltd.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Remake your phone in your own image with this personalized wallpaper app.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.alphonso.pulse"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.alphonso.pulse&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/pulse.jpg" alt="Pulse"/></a></div><a data-a="1" data-c="1" href="/details?id=com.alphonso.pulse&feature=editorial-apps_editors_choice"><span class="title">Pulse</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Alphonso+Labs">Alphonso Labs</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Cherry pick your favorite online news sources to create your own, highly personalized newspaper.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.rdio.android.ui"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.rdio.android.ui&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_rdio.png" alt="Rdio"/></a></div><a data-a="1" data-c="1" href="/details?id=com.rdio.android.ui&feature=editorial-apps_editors_choice"><span class="title">Rdio</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Rdio">Rdio</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">After you subscribe to rdio, all the music you need is with you wherever you go!</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.polarbit.RecklessRacing"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.polarbit.RecklessRacing&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://www.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/recklessracing.jpg" alt="Reckless racing"/></a></div><a data-a="1" data-c="1" href="/details?id=com.polarbit.RecklessRacing&feature=editorial-apps_editors_choice"><span class="title">Reckless racing</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=polarbit">polarbit</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Drive your Android in ways you'd never dare to in the real world.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.fivemobile.thescore"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.fivemobile.thescore&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_scoremobile.png" alt="ScoreMobile for Android"/></a></div><a data-a="1" data-c="1" href="/details?id=com.fivemobile.thescore&feature=editorial-apps_editors_choice"><span class="title">ScoreMobile for Android</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Score+Media+Ventures+Inc.">Score Media Ventures Inc.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Keep up with every kick, dunk or swing of your favorite team with this real-time sports app.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.shopkick.app"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.shopkick.app&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_shopkick.png" alt="shopkick"/></a></div><a data-a="1" data-c="1" href="/details?id=com.shopkick.app&feature=editorial-apps_editors_choice"><span class="title">shopkick</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=The+Hottest+App+In+Shopping">The Hottest App In Shopping</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">With those deals and rewards, is there a better excuse for hitting the mall?</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.sketchbook"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.sketchbook&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_sketchbook.png" alt="Sketchbook Mobile"/></a></div><a data-a="1" data-c="1" href="/details?id=com.sketchbook&feature=editorial-apps_editors_choice"><span class="title">Sketchbook Mobile</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Autodesk+Inc.">Autodesk Inc.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Get creative! Paint and draw like a pro with this high-quality app.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.com2us.sliceit"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.com2us.sliceit&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/sliceit.jpg" alt="Slice it"/></a></div><a data-a="1" data-c="1" href="/details?id=com.com2us.sliceit&feature=editorial-apps_editors_choice"><span class="title">Slice it</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Com2uS">Com2uS</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">No matter how you slice it, this fun and challenging game lets you sharpen your geometry chops.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.dasur.slideit"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.dasur.slideit&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_slideit.png" alt="Slide It"/></a></div><a data-a="1" data-c="1" href="/details?id=com.dasur.slideit&feature=editorial-apps_editors_choice"><span class="title">Slide It</span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=Dasur+Ltd.">Dasur Ltd.</a></div></span><div class="description">Hate pecking words on a touch screen? Stop typing and start sliding!</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.melodis.midomiMusicIdentifier"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.melodis.midomiMusicIdentifier&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/soundhound.jpg" alt="SoundHound"/></a></div><a data-a="1" data-c="1" href="/details?id=com.melodis.midomiMusicIdentifier&feature=editorial-apps_editors_choice"><span class="title">SoundHound</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=SoundHound+Inc.">SoundHound Inc.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Stumped recognizing a tune? Having SoundHound is like carrying around a master music nerd in your pocket.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.touchtype.swiftkey"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.touchtype.swiftkey&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://www.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_swiftkey.png" alt="SwiftKey"/></a></div><a data-a="1" data-c="1" href="/details?id=com.touchtype.swiftkey&feature=editorial-apps_editors_choice"><span class="title">SwiftKey</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=TouchType+Ltd">TouchType Ltd</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Tired of typing long words on the phone keyboard? Let Swiftkey predict what you are about to type</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.gianormousgames.towerraiders2"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.gianormousgames.towerraiders2&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/towerraiders.jpg" alt="Tower Raiders Gold 2"/></a></div><a data-a="1" data-c="1" href="/details?id=com.gianormousgames.towerraiders2&feature=editorial-apps_editors_choice"><span class="title">Tower Raiders Gold 2</span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=Gianormous+Games,+LLC">Gianormous Games, LLC</a></div></span><div class="description">Test your battle strategy skill with this addictive defense game.</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.worldmate"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.worldmate&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_worldmate.png" alt="WorldMate "/></a></div><a data-a="1" data-c="1" href="/details?id=com.worldmate&feature=editorial-apps_editors_choice"><span class="title">WorldMate </span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=WorldMate">WorldMate</a></div></span><div class="description">Never loose your flight info or details of your next appointment again! WorldMate tracks all of the logistics of your trip so you don't have to.</div></div></td></tr></table></div></div><div id="footer"><a class="footer-link" href="/account">My Market Account</a>|<a class="footer-link"><select id="user-locale"><option value="">Choose a language</option><option value="cs">Čeština</option><option value="da">Dansk</option><option value="de">Deutsch</option><option value="en">English</option><option value="es">Español (España)</option><option value="es_419">Español (Latinoamérica)</option><option value="fr">Français</option><option value="it">Italiano</option><option value="nl">Nederlands</option><option value="no">Norsk</option><option value="pl">Polski</option><option value="pt_BR">Português (Brasil)</option><option value="pt_PT">Português (Portugal)</option><option value="fi">Suomi</option><option value="sv">Svenska</option><option value="tr">Türkçe</option><option value="el">Ελληνικά</option><option value="ru">Русский</option><option value="ko">한국어</option><option value="zh_CN">中文(简体中文)</option><option value="zh_TW">中文(繁體中文)</option><option value="ja">日本語</option></select></a>|<a class="footer-link" href="http://www.google.com/support/androidmarket?hl=en_US">Help</a></div><div id="footer-tab-edge"></div><div id="sub-footer">©2011 Google<a class="sub-footer-link" href="https://market.android.com/support/bin/answer.py?answer=1196026">Site Terms of Service</a> <a class="sub-footer-link" href="https://market.android.com/support/bin/answer.py?answer=1196018">Privacy Policy</a> <a class="sub-footer-link" href="http://developer.android.com/index.html">Developers</a></div><div id="checkout-footer" style="display:none;"></div></div><div id="super-tooltip" style="display:none"><div id="super-tooltip-contents" class="drop-shadow"></div><div id="super-tooltip-arrow"></div></div><div id="checkout-root"></div><script type="text/javascript" src="/static/client/js/3155463159-site_js_compiled_site_js.js"></script>
|
8
|
+
<script>var initProps = {signedIn: false, userEmail: '', userGivenName: '', userFamilyName: '', devices: {}, selectedDeviceId: '', absoluteBaseUrl: 'https:\/\/market.android.com', basePathPrefix: '\/', currentPageRelativeUrl: '\/details?id\x3dapps_editors_choice', checkoutBuyUrl: 'https:\/\/checkout.google.com\/customer\/gadget\/buy.html', gaiaForcedLoginBaseUrl: 'https:\/\/www.google.com\/accounts\/ServiceLogin?service\x3dandroidmarket\x26passive\x3d0', gaiaLoginBaseUrl: 'https:\/\/www.google.com\/accounts\/ServiceLogin?service\x3dandroidmarket\x26passive\x3d86400', gaiaLoginContinueUrl: 'https:\/\/market.android.com\/details?id\x3dapps_editors_choice', accountUrl: '\/account', imagePath: '\/static\/client\/images\/', enableDangerMouse: true, extraInitCallbacks: [], histogram: true, token: '', locale: 'en_US', country: 'US', ipCountry: 'US', analyticsQueue: window._gaq || [], dc: [,24,24,24,,,,1,,1,,100,,["CA","GB"]
|
9
|
+
,,1,,1,1,1,,,,,,1,1]
|
10
|
+
, csiAction: 'editorial_container', shareboxBaseUrl: 'https:\/\/plus.sandbox.google.com\/'}; window.checkout_xpc_localxpcbase = 'https:\/\/market.android.com\/static\/client\/images\/'; window.xpcRsrcUri = 'https:\/\/market.android.com\/static\/client\/images\/';initProps.extraInitCallbacks.push( googdotpartialforcompilation(restoreGetDocument, '', ''));initProps.extraInitCallbacks.push( googdotpartialforcompilation(checkoutBuyFlowCompleted, '', '', '', '', '', ''));initProps.extraInitCallbacks.push(enableWatchPopup); letsGo();</script></body></html>
|
@@ -5,18 +5,25 @@ include MarketBot::Android
|
|
5
5
|
test_id = :apps_topselling_paid
|
6
6
|
test_category = :arcade
|
7
7
|
|
8
|
-
$test_src_pages = []
|
9
|
-
(1..4).each do |page|
|
10
|
-
$test_src_pages[page] = read_file(File.dirname(__FILE__), 'data', "leaderboard-apps_topselling_paid-page#{page}.txt")
|
11
|
-
end
|
12
8
|
|
13
9
|
def stub_hydra(hydra)
|
10
|
+
test_src_pages = []
|
11
|
+
(1..4).each do |page|
|
12
|
+
test_src_pages[page] = read_file(File.dirname(__FILE__), 'data', "leaderboard-apps_topselling_paid-page#{page}.txt")
|
13
|
+
end
|
14
|
+
|
14
15
|
(0...4).each do |i|
|
15
16
|
start = i * 24
|
16
|
-
response = Typhoeus::Response.new(:code => 200, :headers => '', :body =>
|
17
|
+
response = Typhoeus::Response.new(:code => 200, :headers => '', :body => test_src_pages[i + 1])
|
17
18
|
url = "https://market.android.com/details?id=apps_topselling_paid&cat=ARCADE&start=#{start}&num=24"
|
18
19
|
hydra.stub(:get, url).and_return(response)
|
19
20
|
end
|
21
|
+
|
22
|
+
test_src_editors_choice = read_file(File.dirname(__FILE__), 'data', "leaderboard-apps_editors_choice.txt")
|
23
|
+
|
24
|
+
response = Typhoeus::Response.new(:code => 200, :headers => '', :body => test_src_editors_choice)
|
25
|
+
url = "https://market.android.com/details?id=apps_editors_choice"
|
26
|
+
hydra.stub(:get, url).and_return(response)
|
20
27
|
end
|
21
28
|
|
22
29
|
def check_results(results)
|
@@ -99,5 +106,24 @@ describe 'Leaderboard' do
|
|
99
106
|
|
100
107
|
check_results(lb.results)
|
101
108
|
end
|
109
|
+
|
110
|
+
context 'special case (editors choice page)' do
|
111
|
+
it 'should properly parse the page and turn them into results' do
|
112
|
+
hydra = Typhoeus::Hydra.new
|
113
|
+
stub_hydra(hydra)
|
114
|
+
lb = Leaderboard.new('apps_editors_choice', nil, :hydra => hydra)
|
115
|
+
lb.update
|
116
|
+
|
117
|
+
lb.results.count.should == 37
|
118
|
+
|
119
|
+
app = lb.results.last
|
120
|
+
|
121
|
+
app[:title].should == 'WorldMate '
|
122
|
+
app[:price_usd].should == nil
|
123
|
+
app[:developer].should == 'WorldMate'
|
124
|
+
app[:market_id].should == 'com.worldmate'
|
125
|
+
app[:market_url].should == 'https://market.android.com/details?id=com.worldmate'
|
126
|
+
end
|
127
|
+
end
|
102
128
|
end
|
103
129
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: market_bot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-10-
|
12
|
+
date: 2011-10-26 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: typhoeus
|
16
|
-
requirement: &
|
16
|
+
requirement: &70241800417620 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.2.4
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70241800417620
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: nokogiri
|
27
|
-
requirement: &
|
27
|
+
requirement: &70241800417140 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.5.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70241800417140
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &70241800416660 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 2.3.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70241800416660
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: bundler
|
49
|
-
requirement: &
|
49
|
+
requirement: &70241800416180 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.0.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70241800416180
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: jeweler
|
60
|
-
requirement: &
|
60
|
+
requirement: &70241800432840 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 1.6.4
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70241800432840
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rcov
|
71
|
-
requirement: &
|
71
|
+
requirement: &70241800432360 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70241800432360
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: ZenTest
|
82
|
-
requirement: &
|
82
|
+
requirement: &70241800431880 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: 4.6.2
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70241800431880
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: ruby-debug19
|
93
|
-
requirement: &
|
93
|
+
requirement: &70241800431400 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: 0.11.6
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *70241800431400
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: rdoc
|
104
|
-
requirement: &
|
104
|
+
requirement: &70241800430920 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,7 +109,7 @@ dependencies:
|
|
109
109
|
version: 3.9.4
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *70241800430920
|
113
113
|
description: Market Bot is a high performance Ruby scraper for Google's Android Market
|
114
114
|
with a simple to use API. It is built on top of Nokogiri and Typhoeus.
|
115
115
|
email: chad@remesch.com
|
@@ -137,6 +137,7 @@ files:
|
|
137
137
|
- spec/market_bot/android/data/app_1.txt
|
138
138
|
- spec/market_bot/android/data/app_2.txt
|
139
139
|
- spec/market_bot/android/data/app_3.txt
|
140
|
+
- spec/market_bot/android/data/leaderboard-apps_editors_choice.txt
|
140
141
|
- spec/market_bot/android/data/leaderboard-apps_topselling_paid-page1.txt
|
141
142
|
- spec/market_bot/android/data/leaderboard-apps_topselling_paid-page2.txt
|
142
143
|
- spec/market_bot/android/data/leaderboard-apps_topselling_paid-page3.txt
|
@@ -159,7 +160,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
159
160
|
version: '0'
|
160
161
|
segments:
|
161
162
|
- 0
|
162
|
-
hash:
|
163
|
+
hash: 2946849998697334279
|
163
164
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
164
165
|
none: false
|
165
166
|
requirements:
|