yourub 1.1.1 → 2.0.0

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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -6
  3. data/Gemfile +15 -1
  4. data/README.md +36 -25
  5. data/Rakefile +18 -0
  6. data/config/yourub.yml +1 -1
  7. data/lib/yourub/client.rb +38 -10
  8. data/lib/yourub/config.rb +34 -1
  9. data/lib/yourub/default.rb +1 -1
  10. data/lib/yourub/meta_search.rb +134 -0
  11. data/lib/yourub/rest/api.rb +6 -0
  12. data/lib/yourub/rest/categories.rb +39 -0
  13. data/lib/yourub/rest/request.rb +22 -4
  14. data/lib/yourub/rest/search.rb +11 -149
  15. data/lib/yourub/rest/videos.rb +38 -0
  16. data/lib/yourub/result.rb +41 -0
  17. data/lib/yourub/validator.rb +4 -11
  18. data/lib/yourub/version.rb +3 -3
  19. data/lib/yourub.rb +2 -3
  20. data/spec/fixtures/categories_list.json +1 -0
  21. data/spec/fixtures/categories_list_formatted.json +1 -0
  22. data/spec/fixtures/search_list.json +1 -0
  23. data/spec/fixtures/single_video.json +1 -0
  24. data/spec/fixtures/video_with_200_views.json +1 -0
  25. data/spec/fixtures/videos_list.json +1 -0
  26. data/spec/spec_helper.rb +11 -0
  27. data/spec/support/shared_context_result_load_fixture.rb +11 -0
  28. data/spec/support/shared_context_result_search_list.rb +16 -0
  29. data/spec/support/shared_context_result_search_list_with_single_videos.rb +24 -0
  30. data/spec/support/shared_context_stub_client_connection.rb +18 -0
  31. data/spec/yourub/client_spec.rb +29 -72
  32. data/spec/yourub/count_filter_spec.rb +4 -5
  33. data/spec/yourub/count_spec.rb +39 -0
  34. data/spec/yourub/integration.rb +105 -0
  35. data/spec/yourub/meta_search_spec.rb +141 -0
  36. data/spec/yourub/rest/categories_spec.rb +33 -0
  37. data/spec/yourub/rest/request_spec.rb +32 -0
  38. data/spec/yourub/rest/videos_spec.rb +24 -0
  39. data/spec/yourub/validator_spec.rb +54 -57
  40. data/yourub.gemspec +0 -5
  41. metadata +39 -66
  42. data/lib/yourub/cli.rb +0 -20
  43. data/lib/yourub/reader.rb +0 -21
  44. data/spec/fixtures/categories.json +0 -0
  45. data/spec/fixtures/category.json +0 -0
  46. data/spec/helper.rb +0 -26
@@ -0,0 +1,39 @@
1
+ require 'yourub'
2
+ require_relative '../spec_helper.rb'
3
+
4
+
5
+ describe Yourub::MetaSearch do
6
+ describe '#search' do
7
+ let(:client) { Yourub::Client.new() }
8
+ let(:result){ double }
9
+
10
+ context 'integrates a view count filter' do
11
+ context 'having a search result with 4 videos with 200 views' do
12
+ include_context "stub client connection"
13
+ include_context "search list result load fixture with single video", "search_list.json"
14
+ context "searching videos with more or equal 200 views" do
15
+ it 'find 4 videos' do
16
+ filter = { views: '>= 200' }
17
+ videos = []
18
+ client.search(query: "nasa", count_filter: filter, max_results: 2) do |v|
19
+ videos.push(v)
20
+ end
21
+ expect(videos.count).to eq(4)
22
+ end
23
+ end
24
+
25
+ context "searching videos with more than 200 views" do
26
+ it 'find 0 video' do
27
+ filter = { views: '> 200' }
28
+ videos = []
29
+ client.search(query: "nasa", count_filter: filter, max_results: 2) do |v|
30
+ videos.push(v)
31
+ end
32
+ expect(videos.count).to eq(0)
33
+ end
34
+ end
35
+
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,105 @@
1
+ require 'yourub'
2
+
3
+ #That is an integration test where the client is not stubbed, this test can
4
+ #pass only with an internet connection and a valid developer key. Use this test
5
+ #at the end of your changes, and add new tests if you have added new
6
+ #functionalities. This file is not run in the default spec suite
7
+ describe Yourub::Client do
8
+
9
+ context "on initialize" do
10
+ let(:subject) { Yourub::Client.new }
11
+
12
+ before do
13
+ end
14
+
15
+ it "return an error if the given country does not exist" do
16
+ subject.search(country: "MOON")
17
+ expect(lambda{subject}).not_to raise_error()
18
+ end
19
+
20
+ it "give me a list of valid countries" do
21
+ expect(subject.countries).to be_a_kind_of(Array)
22
+ end
23
+
24
+ it "retrieves videos that have more than 100 views" do
25
+ filter = {views: ">= 100"}
26
+ videos = []
27
+ subject.search(country: "US", category: "Sports", count_filter: filter) do |v|
28
+ videos.push(v)
29
+ end
30
+ expect(videos).to_not be_empty
31
+ end
32
+
33
+ it "retrieves videos for all the categories" do
34
+ videos = []
35
+ subject.search(country: "US", category: "all") do |v|
36
+ videos.push(v)
37
+ end
38
+ expect(videos).to_not be_empty
39
+ end
40
+
41
+ it "accept an 'order' parameter within the others" do
42
+ videos = []
43
+ subject.search(country: "US", category: "Sports", order: 'date') do |v|
44
+ videos.push(v)
45
+ end
46
+ expect(videos).to_not be_empty
47
+ end
48
+
49
+ it "retrieves 5 videos for each given category" do
50
+ videos = []
51
+ subject.search(country: "US, DE", category: "Sports", max_results: 5) do |v|
52
+ videos.push(v)
53
+ end
54
+ expect(videos.count).to eq(10)
55
+ end
56
+
57
+ it "retrieves 5 videos for each given category, also if they are passed as array" do
58
+ videos = []
59
+ subject.search(country: ["US", "DE"], category: "Sports", max_results: 5) do |v|
60
+ videos.push(v)
61
+ end
62
+ expect(videos.count).to eq(10)
63
+ end
64
+
65
+ it "retrieves the given number of video for the given category" do
66
+ videos = []
67
+ subject.search(category: "Sports", max_results: 2) do |v|
68
+ videos.push(v)
69
+ end
70
+ expect(videos.count).to eq(2)
71
+ end
72
+
73
+ it "retrieves the given number of video for the given word" do
74
+ videos = []
75
+ subject.search(query: "casa", max_results: 3) do |v|
76
+ videos.push(v)
77
+ end
78
+ expect(videos.count).to eq(3)
79
+ end
80
+
81
+ it "retrieves the given number of video for the given country" do
82
+ videos = []
83
+ subject.search(country: "US", max_results: 5) do |v|
84
+ videos.push(v)
85
+ end
86
+ expect(videos.count).to eq(5)
87
+ end
88
+
89
+ # it "retrieves a video for the given id" do
90
+ # subject.search(id: "mN0Dbj-xHY0")
91
+ # expect(videos.first["id"]).to eql("mN0Dbj-xHY0")
92
+ # end
93
+
94
+ # it "retrieves the view count for given id" do
95
+ # expect(subject.get_views("mN0Dbj-xHY0")).to be_a_kind_of(Integer)
96
+ # end
97
+
98
+ # it "return nil for a not existing video" do
99
+ # subject.search(id: "fffffffffffffffffffff")
100
+ # expect(subject.videos).to be_empty
101
+ # end
102
+ end
103
+
104
+ end
105
+
@@ -0,0 +1,141 @@
1
+ require 'yourub'
2
+ require_relative '../spec_helper.rb'
3
+
4
+ describe Yourub::MetaSearch do
5
+ context 'Initialize the Request class if the given parameter are valid' do
6
+
7
+ let(:client) { Yourub::Client.new() }
8
+ # let(:discovered_api) { double("youtube_api")}
9
+ #let(:discovered_api) { double("youtube_api")}
10
+ let(:response) {OpenStruct.new(data: {items: [{"statistics" => {"viewCount" => 2}}]}, status: 200)}
11
+ let(:videos_list_response) { fixture("videos_list.json")}
12
+ let(:search_list_response) { fixture("search_list.json")}
13
+ let(:categories_formatted) { fixture("categories_list_formatted.json") }
14
+ let(:single_video_response) { fixture("video_with_200_views.json") }
15
+ let(:result){ double }
16
+
17
+ before do
18
+ # discovered_api.stub_chain(:data, :items).and_return(categories)
19
+ # discovered_api.stub_chain(:search, :list).and_return("search.list")
20
+ # discovered_api.stub_chain(:video_categories, :list).and_return("video_categories.list")
21
+ # allow(client).to receive(:youtube_api).and_return(discovered_api)
22
+ #allow(client).to receive(:execute!).and_return(response)
23
+ #allow(Yourub::REST::Request).to receive(:new).and_return(response)
24
+ allow(result).to receive(:status).and_return(200)
25
+ end
26
+
27
+ describe '#search' do
28
+ context 'forward the parameters to the request' do
29
+ include_context "search list result load fixture", "search_list.json"
30
+ before do
31
+ allow(Yourub::REST::Categories).to receive(
32
+ :for_country).and_return(categories_formatted)
33
+ allow(Yourub::REST::Videos).to receive(:list).and_return(response)
34
+ end
35
+
36
+ it 'creates a search list request with the expected parameters' do
37
+ expect(Yourub::REST::Search).to receive(:list).with(
38
+ client,
39
+ {:part => "snippet",
40
+ :type => "video",
41
+ :order => "date",
42
+ :safeSearch => "none",
43
+ :category => "Sports",
44
+ :maxResults => 5,
45
+ :regionCode => "US",
46
+ :videoCategoryId => 17}
47
+ )
48
+ client.search(
49
+ country: 'US', category: 'Sports', order: 'date', max_results: 5
50
+ ) { |v| v }
51
+ end
52
+ end
53
+
54
+ context 'integrates a view count filter' do
55
+ include_context 'result load fixture', 'video_with_200_views.json'
56
+
57
+ let(:search_result) { double }
58
+ before do
59
+ allow(search_result).to receive_message_chain(
60
+ :data, :items).and_return(search_list_response)
61
+ search_result.data.items.each do |single_video|
62
+ allow(single_video).to receive_message_chain(
63
+ :id, :videoId).and_return(1)
64
+ end
65
+
66
+ allow(Yourub::REST::Search).to receive(:list).and_return(search_result)
67
+ allow(Yourub::REST::Videos).to receive(:single_video).and_return(result)
68
+ end
69
+ it 'retrieves videos that have more than 100 views' do
70
+ filter = { views: '>= 100' }
71
+
72
+ videos = []
73
+
74
+ client.search(query: "nasa", count_filter: filter) do |v|
75
+ videos.push(v)
76
+ end
77
+
78
+ expect(videos.count).to eq(4)
79
+ end
80
+
81
+ it 'retrieves no videos with more than 200 views' do
82
+ filter = { views: '< 200' }
83
+
84
+ videos = []
85
+
86
+ client.search(query: "nasa", count_filter: filter ) do |v|
87
+ videos.push(v)
88
+ end
89
+
90
+ expect(videos.count).to eq(0)
91
+ end
92
+
93
+ end
94
+
95
+ # TODO
96
+ # context 'iterates through the given nation' do
97
+ # it "retrieves 5 videos for each given category, also if they are passed as array" do
98
+ # videos = []
99
+ # subject.search(country: ["US", "DE"], category: "Sports", max_results: 5) do |v|
100
+ # videos.push v
101
+ # end
102
+ # expect(videos.count).to eq(10)
103
+ # end
104
+ # end
105
+
106
+ # context 'when the parameter category is == "all"' do
107
+ # it 'it iterates through all the categories' do
108
+ # videos = []
109
+ # client.search(country: 'US', category: 'all') do |v|
110
+ # videos.push v
111
+ # end
112
+ # expect(videos).to_not be_empty
113
+ # end
114
+ # end
115
+ end
116
+
117
+ describe "methods used only for single video" do
118
+ include_context "result load fixture", "video_with_200_views.json"
119
+
120
+ describe '#get' do
121
+ it 'send the request with the correct parameters' do
122
+ expect(Yourub::REST::Request).to receive(:new)
123
+ .with(client, 'videos', 'list', :id => "mN0Dbj-xHY0", :part=>"snippet,statistics")
124
+ client.get('mN0Dbj-xHY0')
125
+ end
126
+ end
127
+
128
+ describe '#get_views' do
129
+ it 'send the request with the correct parameters' do
130
+ expect(Yourub::REST::Request).to receive(:new)
131
+ .with(client, 'videos', 'list', :id => "mN0Dbj-xHY0", :part => "statistics")
132
+ client.get_views('mN0Dbj-xHY0')
133
+ end
134
+
135
+ it 'return the number of view for the given video' do
136
+ expect(client.get_views('mN0Dbj-xHY0')).to eq(200)
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,33 @@
1
+ require 'yourub'
2
+ require_relative '../../spec_helper.rb'
3
+
4
+ describe Yourub::REST::Categories do
5
+ context 'Initialize the Request class if the given parameter are valid' do
6
+ let(:category_request) { double }
7
+ let(:client) { Yourub::Client.new }
8
+ let(:categories) { fixture('categories_list.json') }
9
+ let(:categories_formatted) { fixture('categories_list_formatted.json') }
10
+
11
+ before do
12
+ allow(category_request).to receive_message_chain(
13
+ :data, :items
14
+ ).and_return(categories)
15
+ allow(Yourub::REST::Request).to receive(:new).and_return(category_request)
16
+ end
17
+
18
+ describe '.for_country' do
19
+ it 'create a request with the correct parameters' do
20
+ expect(Yourub::REST::Request).to receive(:new)
21
+ .with(client, 'video_categories', 'list',
22
+ 'part' => 'snippet', 'regionCode' => ['US'])
23
+ subject.for_country(client, ['US'])
24
+ end
25
+
26
+ it 'return an hash containing the id and the title for each category' do
27
+ expect(subject.for_country(client, ['US'])).to eq(
28
+ categories_formatted
29
+ )
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,32 @@
1
+ require 'yourub'
2
+ require_relative '../../spec_helper'
3
+
4
+ describe Yourub::REST::Request do
5
+ context 'during requests initialization' do
6
+ include_context "stub client connection"
7
+ let(:param) { { 'part' => 'snippet', 'regionCode' => 'de' } }
8
+
9
+ describe 'the request object calls the execute! method on the client' do
10
+ it 'execute the video list request on the client' do
11
+ expect(client).to receive(:execute!).with(
12
+ api_method: 'video_categories.list', parameters: param
13
+ )
14
+ Yourub::REST::Request.new(client, 'video_categories', 'list', param)
15
+ end
16
+
17
+ it 'execute the search list request on the client' do
18
+ expect(client).to receive(:execute!).with(
19
+ api_method: 'search.list', parameters: param
20
+ )
21
+ Yourub::REST::Request.new(client, 'search', 'list', param)
22
+ end
23
+
24
+ it 'execute the video list request on the client' do
25
+ expect(client).to receive(:execute!).with(
26
+ api_method: 'videos.list', parameters: param
27
+ )
28
+ Yourub::REST::Request.new(client, 'videos', 'list', param)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,24 @@
1
+ require 'yourub'
2
+ require_relative '../../spec_helper.rb'
3
+
4
+ describe Yourub::REST::Videos do
5
+ context "Initialize the Request class if the given parameter are valid" do
6
+ let(:video_request) { double }
7
+ let(:client) { Yourub::Client.new() }
8
+ let(:videos) { fixture("videos_list.json") }
9
+
10
+ before do
11
+ allow(video_request).to receive_message_chain(:data, :items).and_return(videos)
12
+ allow(Yourub::REST::Request).to receive(:new).and_return(video_request)
13
+ end
14
+
15
+ describe ".list" do
16
+ it "create a request with the correct parameters" do
17
+ expect(Yourub::REST::Request).to receive(:new)
18
+ .with(client, "videos", "list", {"part"=>"snippet", "regionCode" => ['US']})
19
+ subject.list(client, {"part"=>"snippet", "regionCode" => ['US']})
20
+ end
21
+ end
22
+ end
23
+ end
24
+
@@ -3,107 +3,104 @@ require 'yourub'
3
3
  describe Yourub::Validator do
4
4
  let(:subject) { Yourub::Validator.confirm(criteria) }
5
5
 
6
- context "passing an hash containing the search criteria" do
7
- context "with some valid criteria" do
8
-
9
- context "no matter if the crteria has old 'key' => 'val' or key: val sintax" do
10
- let(:criteria) { {"country" => 'US', "category" => 'Sport'} }
11
- it "return the criteria in the sym: val format" do
12
- expect(subject).to eq({country: ['US'], category: 'Sport'})
6
+ context 'passing an hash containing the search criteria' do
7
+ context 'with some valid criteria' do
8
+ context 'with an old hash syntax' do
9
+ let(:criteria) { { 'country' => 'US', 'category' => 'Sport' } }
10
+ it 'return the criteria in the sym: val format' do
11
+ expect(subject).to eq(country: ['US'], category: 'Sport')
13
12
  end
14
13
  end
15
14
 
16
- context "with valid nation but unknown parameter city" do
17
- let(:criteria) { {country: 'US', city: 'Berlin'} }
18
- it "return criteria including nation but excluding the city" do
19
- expect(subject).to eq({country: ['US']})
15
+ context 'with valid nation but unknown parameter city' do
16
+ let(:criteria) { { country: 'US', city: 'Berlin' } }
17
+ it 'return criteria including nation but excluding the city' do
18
+ expect(subject).to eq(country: ['US'])
20
19
  end
21
20
  end
22
21
 
23
- context "with an invalid :order value" do
24
- let(:criteria) { {order: 'banane', query: 'roberto baggio'} }
22
+ context 'with an invalid :order value' do
23
+ let(:criteria) { { order: 'banane', query: 'roberto baggio' } }
25
24
  it 'raise an argument error' do
26
- expect(lambda{subject}).to raise_error(ArgumentError)
25
+ expect(lambda{ subject }).to raise_error(ArgumentError)
27
26
  end
28
27
  end
29
28
 
30
- context "with a given category without a country" do
31
- let(:criteria) { {country: '', category: 'Sport'} }
32
- it "add the default country" do
33
- expect(subject).to eq({category: 'Sport', :country=>["US"]})
29
+ context 'with a given category without a country' do
30
+ let(:criteria) { { country: '', category: 'Sport' } }
31
+ it 'add the default country' do
32
+ expect(subject).to eq(category: 'Sport', :country => ['US'])
34
33
  end
35
34
  end
36
35
 
37
- context "with all the available parameters present" do
38
- let(:criteria) { {country: 'IT',
39
- category: 'Sport',
40
- max_results: 2,
41
- count_filter: {},
42
- query: '',
43
- id: ''} }
44
- it "return only them params that has a value" do
45
- expect(subject).to eq({country: ["IT"], category: 'Sport', max_results: 2 })
36
+ context 'with all the available parameters present' do
37
+ let(:criteria) do
38
+ { country: 'IT',
39
+ category: 'Sport',
40
+ max_results: 2,
41
+ count_filter: {},
42
+ query: ''
43
+ }
46
44
  end
47
- end
48
-
49
- context "when the parameter 'id' is set" do
50
- let(:criteria) { {country: 'US', id: '1111111111'} }
51
- it "ignore the other params and leave only the id" do
52
- expect(subject).to eq({ id: '1111111111' })
45
+ it 'return only them params that has a value' do
46
+ expect(subject).to eq(
47
+ country: ['IT'], category: 'Sport', max_results: 2
48
+ )
53
49
  end
54
50
  end
55
51
  end
56
52
 
57
- context "if none of the criteria are valid" do
58
- context "with non valid criteria" do
59
- let(:criteria) { {big: 1, bang: 2} }
53
+ context 'if none of the criteria are valid' do
54
+ context 'with non valid criteria' do
55
+ let(:criteria) { { big: 1, bang: 2 } }
60
56
  it 'raise an argument error' do
61
- expect(lambda{subject}).to raise_error(ArgumentError)
57
+ expect(lambda{ subject }).to raise_error(ArgumentError)
62
58
  end
63
59
  end
64
60
 
65
- context "with criteria in the wrong format, like a string" do
66
- let(:criteria) { "country = US" }
61
+ context 'with criteria in the wrong format, like a string' do
62
+ let(:criteria) { 'country = US' }
67
63
  it 'raise an argument error' do
68
- expect(lambda{subject}).to raise_error(ArgumentError)
64
+ expect(lambda{ subject }).to raise_error(ArgumentError)
69
65
  end
70
66
  end
71
67
 
72
- context "with an invalid country" do
73
- let(:criteria) { {country: 'MOON'} }
68
+ context 'with an invalid country' do
69
+ let(:criteria) { { country: 'MOON' } }
74
70
  it 'raise an argument error' do
75
- expect(lambda{subject}).to raise_error(ArgumentError)
71
+ expect(lambda{ subject }).to raise_error(ArgumentError)
76
72
  end
77
73
  end
78
74
  end
79
75
 
80
- context "with valid criteria but not enough to start a search" do
81
- context "only with maximum and count filter" do
82
- let(:criteria) { {max_results: 10, count_filter: {views: ">= 100"}} }
76
+ context 'with valid criteria but not enough to start a search' do
77
+ context 'only with maximum and count filter' do
78
+ let(:criteria) do
79
+ { max_results: 10, count_filter: { views: '>= 100' } }
80
+ end
83
81
  it 'raise an argument error' do
84
- expect(lambda{subject}).to raise_error(ArgumentError)
82
+ expect(lambda{ subject }).to raise_error(ArgumentError)
85
83
  end
86
84
  end
87
- end
85
+ end
88
86
  end
89
87
 
90
- context "passing a list of available categories and the selected one" do
88
+ context 'passing a list of available categories and the selected one' do
91
89
  let(:subject) { Yourub::Validator.valid_category(categories, selected_one) }
92
- let(:categories) { [{"10"=>"music"}, {"15"=>"pets&animals"}, {"17"=>"sports"}, {"18"=>"shortmovies"}] }
90
+ let(:categories) { [{'10'=>'music'}, {'15'=>'pets&animals'}, {'17'=>'sports'}, {'18'=>'shortmovies'}] }
93
91
 
94
- context "with an invalid category" do
95
- let(:selected_one) { "spaghetti" }
92
+ context 'with an invalid category' do
93
+ let(:selected_one) {"spaghetti"}
96
94
  it 'raise an argument error' do
97
95
  expect(lambda{subject}).to raise_error(ArgumentError)
98
96
  end
99
97
  end
100
98
 
101
- context "with a valid category" do
102
- let(:selected_one) { "sports" }
99
+ context 'with a valid category' do
100
+ let(:selected_one) { 'sports' }
103
101
  it 'return it' do
104
- expect(subject.first.has_value? "sports").to be_true
102
+ expect(subject.first.has_value? "sports").to eq true
105
103
  end
106
104
  end
107
105
  end
108
-
109
- end
106
+ end
data/yourub.gemspec CHANGED
@@ -19,11 +19,6 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_runtime_dependency 'google-api-client', '~> 0.7'
22
- spec.add_runtime_dependency "thor" , '~> 0.18'
23
22
  spec.add_development_dependency "bundler", "~> 1.3"
24
- spec.add_development_dependency "byebug", "~> 3.1"
25
- spec.add_development_dependency "rake", "~> 10.1"
26
- spec.add_development_dependency "rspec", "~> 2.14"
27
- #spec.add_development_dependency "webmock", "~> 1.20"
28
23
 
29
24
  end