daodao 0.0.1 → 0.1.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ac9c046fcc208a74bb7645267d5def002c35f12c
4
- data.tar.gz: 0d9bbd10a32402f9be3f8af7b971e9ac070b1216
3
+ metadata.gz: 94e13e69f1a94e9ef2457e87b79d059580e4e62b
4
+ data.tar.gz: b6ff9806987c8b4b28ac3fdbb8802c4728676165
5
5
  SHA512:
6
- metadata.gz: 1070827a478997f46f8a44018fc3d4239a7777b6ffdf9d810157c2366279b271536187b1032545f496f775251de8ea1c75fc4c08feaedf6e2c5b37b381945b83
7
- data.tar.gz: 440fcc776db47417224b6e3a4d4dbdec9d9cbd0a2bff8a0f5ce0e28bace35be89880d5ffd2a36f064fd99b2165f08e5767cacd4ee18b4d276e25eac19c2e221d
6
+ metadata.gz: 76c7b442362b441f4a038bccf9bb74a4eadcc802692c37049200f2e870f187caffafed1afea874bf05b4228976cc9da6923f1e277da39b8e10f1c495fd498a28
7
+ data.tar.gz: 1e302326ab4b61b556dad26e114055f29e3d3f067bfc7dba09a8adb6e6cdb9eb11e4e81149058587a2f795dec4d44451323fbd03266ef12ab1d44cba50e65dc4
data/.gitignore CHANGED
@@ -12,3 +12,4 @@
12
12
  *.o
13
13
  *.a
14
14
  mkmf.log
15
+ *.gem
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in daodao.gemspec
4
- gemspec
1
+ source 'https://ruby.taobao.org'
2
+ gem 'nokogiri','=1.6.6.2'
3
+ gem 'capybara', '=2.4.4'
4
+ gem 'capybara-webkit','=1.3.1'
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 charles
1
+ Copyright (c) 2014 timlentse
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # Daodao
1
+ ### Daodao
2
2
 
3
- TODO: Write a gem description
3
+ Daodao is a Ruby gem that crawls the ota's ranking and the rooms details in [www.daodao.com](http://www.daodao.com)
4
4
 
5
- ## Installation
5
+ ### Installation
6
6
 
7
7
  Add this line to your application's Gemfile:
8
8
 
@@ -17,12 +17,41 @@ And then execute:
17
17
  Or install it yourself as:
18
18
 
19
19
  $ gem install daodao
20
+
21
+ #### Getting started
20
22
 
21
- ## Usage
23
+ ```sh
24
+ $ touch test.rb
25
+ $ vi test.rb
26
+ ```
27
+ Add some codes like the following
28
+
29
+ ```ruby
30
+ require 'daodao'
31
+ uri = "/Hotel_Review-g298555-d2682464-Reviews-Four_Seasons_Hotel_Guangzhou-Guangzhou_Guangdong.html"
32
+ sample = Daodao::Rank.new(uri)
33
+ puts 'The rooms details are as follow :'
34
+ puts sample.rooms_details
35
+ ```
36
+ This will crawl the rooms details of the target hotel for you.
37
+
38
+ `Note:` You can pass other uri to `initialize` representing the hotel page.
39
+
40
+ #### Get ota's ranking
41
+
42
+ ```ruby
43
+ require 'daodao'
44
+
45
+ ranking = sample.rank
46
+ puts "The ota's ranking are as follow :"
47
+ puts ranking
48
+ ```
49
+
50
+ #### Bug
51
+ 1. The speed is still a problem
22
52
 
23
- TODO: Write usage instructions here
24
53
 
25
- ## Contributing
54
+ ### Contributing
26
55
 
27
56
  1. Fork it ( https://github.com/[my-github-username]/daodao/fork )
28
57
  2. Create your feature branch (`git checkout -b my-new-feature`)
data/Rakefile CHANGED
@@ -1,2 +1,2 @@
1
1
  require "bundler/gem_tasks"
2
-
2
+
@@ -6,10 +6,10 @@ require 'daodao/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "daodao"
8
8
  spec.version = Daodao::VERSION
9
- spec.authors = ["charles"]
10
- spec.email = ["charles.liu@corp.elong.com"]
11
- spec.summary = %q{daodao hotel list}
12
- spec.description = %q{daodao hotel list}
9
+ spec.authors = ["timlen"]
10
+ spec.email = ["tinglenxan@gmail.com"]
11
+ spec.summary = %q{}
12
+ spec.description = %q{daodao hotel list.}
13
13
  spec.homepage = ""
14
14
  spec.license = "MIT"
15
15
 
@@ -20,4 +20,6 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.7"
22
22
  spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec", "~> 3.1.0"
24
+
23
25
  end
@@ -1,5 +1,23 @@
1
- require "daodao/version"
2
-
1
+ require 'nokogiri'
2
+ require 'capybara'
3
+ require 'capybara-webkit'
4
+ require 'open-uri'
5
+ require 'daodao/version'
6
+ require 'daodao/rank'
7
+ require 'daodao/hotel'
8
+ require 'daodao/hotel_list'
3
9
  module Daodao
4
- # Your code goes here...
10
+ def self.rank(url)
11
+ page = Nokogiri::HTML(open(url))
12
+ row = {}
13
+ row[:hotel_id] = url.split('-')[2]
14
+ row[:hotel_name] = page.xpath('//span[@itemprop="name"]').text
15
+ rank=1
16
+ page.css("div.provider_meta_overview").each { |item|
17
+ key = 'rank'+rank.to_s
18
+ row[key.to_sym] = item.css("span.providerLogo_96x41").xpath('./img/@alt').first.value
19
+ rank+=1
20
+ }
21
+ row
22
+ end
5
23
  end
@@ -0,0 +1,49 @@
1
+ module Daodao
2
+ class Hotel
3
+
4
+ # Crawl page from the desired hotel page
5
+ # @parmas: hotel_id, string
6
+ def initialize(hotel_id)
7
+ raise "The argument of class HotelInfo should be string" if !hotel_id.instance_of?(String)
8
+ @id = hotel_id
9
+ @url = URI("http://daodao.com/Hotel_Review-#{hotel_id}")
10
+ @pages = Nokogiri::HTML(open(@url))
11
+ end
12
+
13
+ def name
14
+ @pages.xpath('//span[@itemprop="name"]').text
15
+ end
16
+
17
+ def id
18
+ @id
19
+ end
20
+
21
+ def stars
22
+ str = @pages.xpath('//div[@class="stars"]/span/img/@alt').first.value
23
+ str[/\d+/].to_i
24
+ end
25
+
26
+ def locality
27
+ @pages.at_css('span.locality').text
28
+ end
29
+
30
+ def country
31
+ @pages.at_css('span.country-name').text
32
+ end
33
+
34
+ def address
35
+ #TODO
36
+ #@pages.css('span.street-address')
37
+ end
38
+
39
+ def rank
40
+ text = @pages.xpath('//div[@class="slim_ranking"]/b[@class="rank_text"]').text
41
+ text[/\d+/].to_i
42
+ end
43
+
44
+ def desc
45
+ @pages.xpath('//span[@class="desc"]/text()')[0].text
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,33 @@
1
+ module Daodao
2
+ class HotelList
3
+ START_URL = "http://www.daodao.com/dpages/sitemap/hotels.html"
4
+ def initialize
5
+ @page = Nokogiri::HTML(open(URI(START_URL)))
6
+ @page_amount = @page.xpath("//div[@id='page_list']/p/a").size
7
+ end
8
+
9
+ # Fetch the hotels in each page
10
+ def hotels_in_page(page_id)
11
+ hotel_list = []
12
+ if page_id > 1
13
+ url = "http://www.daodao.com/dpages/sitemap/hotels-#{page_id}.html"
14
+ else
15
+ url = "http://www.daodao.com/dpages/sitemap/hotels.html"
16
+ end
17
+ page = Nokogiri::HTML(open(URI(url)))
18
+ page.xpath("//dl/a").each { |hotel|
19
+ item = {}
20
+ item[:name] = hotel.text
21
+ item[:url] = hotel['href']
22
+ hotel_list.push(item)
23
+ }
24
+ return hotel_list
25
+ end
26
+
27
+ # Get the page's number
28
+ def page_amount
29
+ @page_amount
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,92 @@
1
+ module Daodao
2
+ class Rank
3
+ include Capybara::DSL
4
+
5
+ def initialize(uri)
6
+ Capybara.current_driver = :webkit
7
+
8
+ Capybara.default_selector = :xpath
9
+
10
+ Capybara.app_host ="http://daodao.com"
11
+ page.driver.header "User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.77.4 (KHTML, like Gecko) Version/7.0.5 Safari/537.77.4"
12
+ puts " \e[34mBuilding Session...\e[0m"
13
+ @uri = uri
14
+ page.visit(URI(uri))
15
+ # Click the div to navigate hidden info
16
+ page.all("//div[@class='tab ']").each do |node|
17
+ node.trigger('click')
18
+ end
19
+ # Expand all divs tagged with '展开报价'
20
+ page.all("div[@class='provider_meta_overview mskQC_Meta_RoomTab msk']//*[text()='展开报价']").each do |layout|
21
+ puts '展开报价...'
22
+ layout.trigger('click')
23
+ end
24
+ @page = Nokogiri::HTML(page.html)
25
+ end
26
+
27
+ # Get all the rooms details
28
+ # @Return: an array, a list of rooms details
29
+ def rooms_details
30
+ otas = []
31
+ @page.css("div.provider_meta_overview").each { |item|
32
+ row = {}
33
+ row[:ota_name] = item.css("span.providerLogo_96x41").xpath('./img/@alt').first.value
34
+
35
+ state = item.css("span.unavailable")
36
+ if state.empty?
37
+ row[:ota_state] = "有房"
38
+ row[:lowest_price] = item.css("span.price").text.sub(/¥/,'').strip.to_i
39
+ else
40
+ row[:ota_state] = "也许有房"
41
+ row[:lowest_price] = nil
42
+ end
43
+
44
+ rooms = []
45
+ dropdown_room_list = @page.css("div.provider_rooms_details")[otas.size]
46
+ dropdown_room_list.xpath("./a").each do |room_details|
47
+ room = {}
48
+ room[:room_type] = room_details.at_css("span.room_type").text
49
+
50
+ price_tax_fees = room_details.at_css("span.price_tax_fees_wrap")
51
+ room[:room_price] = price_tax_fees['price'].to_i
52
+ room[:room_tax] = price_tax_fees['taxfee'].to_i
53
+
54
+ return_amount_node = room_details.css("span.rebate_amount")
55
+ room[:return_amount] = return_amount_node.empty? ? 0 : return_amount_node.text.sub(/¥/,'').to_i
56
+
57
+ room[:room_state] = room_details.at_css("span.available").text
58
+ rooms << room
59
+ end
60
+ row[:rooms_details] = rooms
61
+ otas << row
62
+ }
63
+ return otas
64
+ end
65
+
66
+ def name
67
+ @page.xpath('//span[@itemprop="name"]').text
68
+ end
69
+
70
+ def id
71
+ @uri.split('-')[2]
72
+ end
73
+
74
+ def rank
75
+ row = {}
76
+ row[:hotel_id] = self.id
77
+ row[:hotel_name] = self.name
78
+ rank=1
79
+ @page.css("div.provider_meta_overview").each { |item|
80
+ key = 'rank'+rank.to_s
81
+ row[key.to_sym] = item.css("span.providerLogo_96x41").xpath('./img/@alt').first.value
82
+ rank+=1
83
+ }
84
+ return row
85
+ end
86
+
87
+ def screen_shot
88
+ page.save_screenshot("#{Time.now}.png")
89
+ end
90
+
91
+ end
92
+ end
@@ -1,3 +1,3 @@
1
1
  module Daodao
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.3"
3
3
  end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe Daodao::HotelList do
4
+ object = Daodao::HotelList.new
5
+
6
+ it "The page amount is '307' " do
7
+ expect(object.page_amount).to eq 307
8
+ end
9
+
10
+ it " The first hotel's name is '168大酒店' " do
11
+ expect(object.hotels_in_page(1)[0][:name]).to eq "168大酒店"
12
+ end
13
+
14
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe Daodao::Hotel do
4
+ # hotel in guangzhou
5
+ gz_sample = Daodao::Hotel.new("d2682464")
6
+
7
+ it "has name '四季酒店'" do
8
+ expect(gz_sample.name).to eq '四季酒店'
9
+ end
10
+
11
+ it "has id 'd2682464'" do
12
+ expect(gz_sample.id).to eq 'd2682464'
13
+ end
14
+
15
+ it "has stars 5.0星级" do
16
+ expect(gz_sample.stars).to eq 5
17
+ end
18
+
19
+ it "has locality '广州市'" do
20
+ expect(gz_sample.locality).to eq "广州市"
21
+ end
22
+
23
+ it "has country name '广东省' " do
24
+ expect(gz_sample.country).to eq "广东省"
25
+ end
26
+
27
+ it "has rank '3'" do
28
+ expect(gz_sample.rank).to eq 3
29
+ end
30
+
31
+ it "has desc '\n' " do
32
+ expect(gz_sample.desc).to eq "\n"
33
+ end
34
+
35
+ #=====================================================================================================
36
+ # hotel in beijing
37
+ bj_sample = Daodao::Hotel.new("d3256870")
38
+
39
+ it "has name '北京怡亨酒店'" do
40
+ expect(bj_sample.name).to eq '北京怡亨酒店'
41
+ end
42
+
43
+ it "has stars 5.0星级" do
44
+ expect(bj_sample.stars).to eq 5
45
+ end
46
+
47
+ it "has locality '北京市'" do
48
+ expect(bj_sample.locality).to eq "北京市"
49
+ end
50
+
51
+ it "has country name '中国' " do
52
+ expect(bj_sample.country).to eq "中国"
53
+ end
54
+
55
+
56
+ it "has rank '1'" do
57
+ expect(bj_sample.rank).to eq 1
58
+ end
59
+
60
+ it "has desc '北京怡亨酒店位处世界最繁忙的首都之一,共设100间房间,酒店细节专为商务旅客而设计。26间客房和套房,均于浴室内设置旋流浴,其中20间奢华套房更特设私人户外游泳池。房间内提供我们著名的“怡亨生活精品”,为高级住宿体验带来新定义。怡亨酒店不仅让您细味现代奢华的艺术,亦让您品味现代艺术的奢华。' " do
61
+ expect(bj_sample.desc).to eq "北京怡亨酒店位处世界最繁忙的首都之一,共设100间房间,酒店细节专为商务旅客而设计。26间客房和套房,均于浴室内设置旋流浴,其中20间奢华套房更特设私人户外游泳池。房间内提供我们著名的“怡亨生活精品”,为高级住宿体验带来新定义。怡亨酒店不仅让您细味现代奢华的艺术,亦让您品味现代艺术的奢华。"
62
+ end
63
+
64
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+ describe Daodao do
3
+ ranks = Daodao.rank('http://www.daodao.com/Hotel_Review-g298555-d2682464-Reviews-Four_Seasons_Hotel_Guangzhou-Guangzhou_Guangdong.html')
4
+ it "The first Ota name 'Booking.com' " do
5
+ expect(ranks[:rank1]).to eq 'Booking.com'
6
+ end
7
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+ describe Daodao::Rank do
3
+ gz_sample = Daodao::Rank.new('/Hotel_Review-g298555-d2682464-Reviews-Four_Seasons_Hotel_Guangzhou-Guangzhou_Guangdong.html')
4
+ details = gz_sample.rooms_details
5
+ p gz_sample.rank
6
+ # screen shot
7
+ gz_sample.screen_shot
8
+
9
+ it "has otas amount '5'" do
10
+ expect(details.size).to eq 5
11
+ end
12
+
13
+ it "has lowest price '1903' " do
14
+ expect(details[2][:rooms_details][0][:room_price]).to eq 1903
15
+ end
16
+
17
+ it "The first Ota name 'Booking.com' " do
18
+ expect(details[0][:ota_name]).to eq 'Booking.com'
19
+ end
20
+
21
+ it "The rank 3 ota'name '艺龙旅行网' " do
22
+ expect(details[2][:ota_name]).to eq '艺龙旅行网'
23
+ end
24
+
25
+ it "The rooms amount provided by elong '10'" do
26
+ expect(details[2][:rooms_details].size).to eq 10
27
+ end
28
+
29
+ it "The highest price of the rooms '4230'" do
30
+ expect(details[0][:rooms_details][3][:room_price]).to eq 4230
31
+ end
32
+
33
+ it "The room-type with the lowest price '高级城景房'" do
34
+ expect(details[2][:rooms_details][0][:room_type]).to eq '高级城景房'
35
+ end
36
+
37
+ it "The first room's price of the last ota '2330'"do
38
+ expect(details[4][:rooms_details][0][:room_price]).to eq 2330
39
+ end
40
+
41
+ it "has The hotel name '四季酒店'"do
42
+ expect(gz_sample.name).to eq "四季酒店"
43
+ end
44
+
45
+ end
@@ -0,0 +1,91 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # The generated `.rspec` file contains `--require spec_helper` which will cause this
4
+ # file to always be loaded, without a need to explicitly require it in any files.
5
+ #
6
+ # Given that it is always loaded, you are encouraged to keep this file as
7
+ # light-weight as possible. Requiring heavyweight dependencies from this file
8
+ # will add to the boot time of your test suite on EVERY test run, even for an
9
+ # individual file that may not need all of that loaded. Instead, consider making
10
+ # a separate helper file that requires the additional dependencies and performs
11
+ # the additional setup, and require it from the spec files that actually need it.
12
+ #
13
+ # The `.rspec` file also contains a few flags that are not defaults but that
14
+ # users commonly want.
15
+ #
16
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
17
+ RSpec.configure do |config|
18
+ # rspec-expectations config goes here. You can use an alternate
19
+ # assertion/expectation library such as wrong or the stdlib/minitest
20
+ # assertions if you prefer.
21
+ config.expect_with :rspec do |expectations|
22
+ # This option will default to `true` in RSpec 4. It makes the `description`
23
+ # and `failure_message` of custom matchers include text for helper methods
24
+ # defined using `chain`, e.g.:
25
+ # be_bigger_than(2).and_smaller_than(4).description
26
+ # # => "be bigger than 2 and smaller than 4"
27
+ # ...rather than:
28
+ # # => "be bigger than 2"
29
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
30
+ end
31
+
32
+ # rspec-mocks config goes here. You can use an alternate test double
33
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
34
+ config.mock_with :rspec do |mocks|
35
+ # Prevents you from mocking or stubbing a method that does not exist on
36
+ # a real object. This is generally recommended, and will default to
37
+ # `true` in RSpec 4.
38
+ mocks.verify_partial_doubles = true
39
+ end
40
+
41
+ # The settings below are suggested to provide a good initial experience
42
+ # with RSpec, but feel free to customize to your heart's content.
43
+ =begin
44
+ # These two settings work together to allow you to limit a spec run
45
+ # to individual examples or groups you care about by tagging them with
46
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
47
+ # get run.
48
+ config.filter_run :focus
49
+ config.run_all_when_everything_filtered = true
50
+
51
+ # Limits the available syntax to the non-monkey patched syntax that is recommended.
52
+ # For more details, see:
53
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
54
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
55
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
56
+ config.disable_monkey_patching!
57
+
58
+ # This setting enables warnings. It's recommended, but in some cases may
59
+ # be too noisy due to issues in dependencies.
60
+ config.warnings = true
61
+
62
+ # Many RSpec users commonly either run the entire suite or an individual
63
+ # file, and it's useful to allow more verbose output when running an
64
+ # individual spec file.
65
+ if config.files_to_run.one?
66
+ # Use the documentation formatter for detailed output,
67
+ # unless a formatter has already been configured
68
+ # (e.g. via a command-line flag).
69
+ config.default_formatter = 'doc'
70
+ end
71
+
72
+ # Print the 10 slowest examples and example groups at the
73
+ # end of the spec run, to help surface which specs are running
74
+ # particularly slow.
75
+ config.profile_examples = 10
76
+
77
+ # Run specs in random order to surface order dependencies. If you find an
78
+ # order dependency and want to debug it, you can fix the order by providing
79
+ # the seed, which is printed after each run.
80
+ # --seed 1234
81
+ config.order = :random
82
+
83
+ # Seed global randomization in this process using the `--seed` CLI option.
84
+ # Setting this allows you to use `--seed` to deterministically reproduce
85
+ # test failures related to randomization by passing the same `--seed` value
86
+ # as the one that triggered the failure.
87
+ Kernel.srand config.seed
88
+ =end
89
+ end
90
+
91
+ require 'daodao'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: daodao
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
- - charles
7
+ - timlen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-25 00:00:00.000000000 Z
11
+ date: 2015-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,21 +38,44 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
- description: daodao hotel list
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 3.1.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 3.1.0
55
+ description: daodao hotel list.
42
56
  email:
43
- - charles.liu@corp.elong.com
57
+ - tinglenxan@gmail.com
44
58
  executables: []
45
59
  extensions: []
46
60
  extra_rdoc_files: []
47
61
  files:
48
62
  - ".gitignore"
63
+ - ".rspec"
49
64
  - Gemfile
50
65
  - LICENSE.txt
51
66
  - README.md
52
67
  - Rakefile
53
68
  - daodao.gemspec
54
69
  - lib/daodao.rb
70
+ - lib/daodao/hotel.rb
71
+ - lib/daodao/hotel_list.rb
72
+ - lib/daodao/rank.rb
55
73
  - lib/daodao/version.rb
74
+ - spec/hotel_list_spec.rb
75
+ - spec/hotel_spec.rb
76
+ - spec/rank_fast_spec.rb
77
+ - spec/rank_spec.rb
78
+ - spec/spec_helper.rb
56
79
  homepage: ''
57
80
  licenses:
58
81
  - MIT
@@ -73,8 +96,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
96
  version: '0'
74
97
  requirements: []
75
98
  rubyforge_project:
76
- rubygems_version: 2.4.4
99
+ rubygems_version: 2.2.2
77
100
  signing_key:
78
101
  specification_version: 4
79
- summary: daodao hotel list
80
- test_files: []
102
+ summary: ''
103
+ test_files:
104
+ - spec/hotel_list_spec.rb
105
+ - spec/hotel_spec.rb
106
+ - spec/rank_fast_spec.rb
107
+ - spec/rank_spec.rb
108
+ - spec/spec_helper.rb