prls 0.1.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.
- checksums.yaml +7 -0
- data/bin/prls +5 -0
- data/lib/prls.rb +19 -0
- data/lib/prls/bpp.rb +33 -0
- data/lib/prls/cli.rb +74 -0
- data/lib/prls/concord.rb +33 -0
- data/lib/prls/dps.rb +32 -0
- data/lib/prls/mti.rb +33 -0
- data/lib/prls/playscripts.rb +33 -0
- data/lib/prls/pro.rb +82 -0
- data/lib/prls/scraper.rb +154 -0
- data/lib/prls/version.rb +3 -0
- metadata +55 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: dac27d3d2d24e5b6eaf0a6b503e7c3d0877846b7ce582f918ac0c19d96fced75
|
4
|
+
data.tar.gz: 48e7f0024dea898a8b026b69030cfcc98fe9995f33dbffe173074d452b7ba4c2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a185f34c48cb0830a64b7cd0cfa812ef7897dd90215c3c930e3ce2be4cafa0bb960b9e95d149f2c09ed5a0dc29e01df2082cc63d39f5b107c8bf00e75c4332fa
|
7
|
+
data.tar.gz: 3ff0de42b39fddaeebc602b601f760722fd5e07489e8789ac4181f5944b98538984a123533928abe37403c766ed27bfb06c0fc2728dde2ceef74affb1bde0d2c
|
data/bin/prls
ADDED
data/lib/prls.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'word_wrap'
|
4
|
+
require 'word_wrap/core_ext'
|
5
|
+
|
6
|
+
|
7
|
+
require_relative "./prls/version"
|
8
|
+
|
9
|
+
require_relative "./prls/cli"
|
10
|
+
require_relative "./prls/pro"
|
11
|
+
require_relative "./prls/dps"
|
12
|
+
require_relative "./prls/concord"
|
13
|
+
require_relative "./prls/mti"
|
14
|
+
require_relative "./prls/playscripts"
|
15
|
+
require_relative "./prls/bpp"
|
16
|
+
require_relative "./prls/scraper"
|
17
|
+
|
18
|
+
|
19
|
+
|
data/lib/prls/bpp.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
class PRLS::CLI::BPP < PRLS::CLI::PRO
|
2
|
+
|
3
|
+
BPP_PLAYS = []
|
4
|
+
|
5
|
+
def initialize(attributes)
|
6
|
+
super
|
7
|
+
BPP_PLAYS << self
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.all
|
11
|
+
BPP_PLAYS
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.get_plays
|
15
|
+
if self.all.empty?
|
16
|
+
url = "https://www.broadwayplaypub.com/catalog/plays/newly-published/?paged=&count=90"
|
17
|
+
self.new_from_scrape(PRLS::CLI::Scraper.new.bpp_index(url))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.list_plays
|
22
|
+
puts ""
|
23
|
+
puts "Here are Broadway Play Publishing, Inc.'s featured plays:"
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.get_details(index)
|
28
|
+
if self.all[index].need_attr?
|
29
|
+
self.all[index].add_attr(PRLS::CLI::Scraper.new.bpp_info(self.all[index].url))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
data/lib/prls/cli.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
class PRLS::CLI
|
2
|
+
|
3
|
+
def call
|
4
|
+
header
|
5
|
+
menu
|
6
|
+
end
|
7
|
+
|
8
|
+
def header
|
9
|
+
puts ""
|
10
|
+
puts "PERFORMING RIGHTS LOOKUP SERVICE"
|
11
|
+
puts "--------------------------------"
|
12
|
+
end
|
13
|
+
|
14
|
+
def pros
|
15
|
+
puts ""
|
16
|
+
puts "Select a PRO to see their currently featured plays:"
|
17
|
+
puts ""
|
18
|
+
puts "1. Dramatist's Play Service, Inc."
|
19
|
+
puts "2. Concord Theatricals (formerly Samuel French, Ltd.)"
|
20
|
+
puts "3. Music Theatre International"
|
21
|
+
puts "4. Playscripts, Inc."
|
22
|
+
puts "5. Broadway Play Publishing, Inc."
|
23
|
+
puts ""
|
24
|
+
puts "To exit, type 'exit'."
|
25
|
+
puts ""
|
26
|
+
end
|
27
|
+
|
28
|
+
def menu
|
29
|
+
input = nil
|
30
|
+
while input != 'exit'
|
31
|
+
pros
|
32
|
+
input = gets.chomp.downcase
|
33
|
+
case input.to_s
|
34
|
+
when '1'
|
35
|
+
puts ""
|
36
|
+
puts "Loading..."
|
37
|
+
puts ""
|
38
|
+
DPS.get_plays
|
39
|
+
DPS.list_plays
|
40
|
+
when '2'
|
41
|
+
puts ""
|
42
|
+
puts "Loading..."
|
43
|
+
puts ""
|
44
|
+
CONCORD.get_plays
|
45
|
+
CONCORD.list_plays
|
46
|
+
when '3'
|
47
|
+
puts ""
|
48
|
+
puts "Loading..."
|
49
|
+
puts ""
|
50
|
+
MTI.get_plays
|
51
|
+
MTI.list_plays
|
52
|
+
when '4'
|
53
|
+
puts ""
|
54
|
+
puts "Loading..."
|
55
|
+
puts ""
|
56
|
+
PLAYSCRIPTS.get_plays
|
57
|
+
PLAYSCRIPTS.list_plays
|
58
|
+
when '5'
|
59
|
+
puts ""
|
60
|
+
puts "Loading..."
|
61
|
+
puts ""
|
62
|
+
BPP.get_plays
|
63
|
+
BPP.list_plays
|
64
|
+
when 'exit'
|
65
|
+
puts 'Exiting...'
|
66
|
+
else
|
67
|
+
puts 'Invalid entry. Please try again.'
|
68
|
+
puts ""
|
69
|
+
menu
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
data/lib/prls/concord.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
class PRLS::CLI::CONCORD < PRLS::CLI::PRO
|
2
|
+
|
3
|
+
CONCORD_PLAYS = []
|
4
|
+
|
5
|
+
def initialize(attributes)
|
6
|
+
super
|
7
|
+
CONCORD_PLAYS << self
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.all
|
11
|
+
CONCORD_PLAYS
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.get_plays
|
15
|
+
if self.all.empty?
|
16
|
+
url = "https://www.concordtheatricals.com/perform/plays"
|
17
|
+
self.new_from_scrape(PRLS::CLI::Scraper.new.concord_index(url))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.list_plays
|
22
|
+
puts ""
|
23
|
+
puts "Here are Concord Theatrical's featured plays:"
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.get_details(index)
|
28
|
+
if self.all[index].need_attr?
|
29
|
+
self.all[index].add_attr(PRLS::CLI::Scraper.new.concord_info(self.all[index].url))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
data/lib/prls/dps.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
class PRLS::CLI::DPS < PRLS::CLI::PRO
|
2
|
+
|
3
|
+
DPS_PLAYS = []
|
4
|
+
|
5
|
+
def initialize(attributes)
|
6
|
+
super
|
7
|
+
DPS_PLAYS << self
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.all
|
11
|
+
DPS_PLAYS
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.get_plays
|
15
|
+
if self.all.empty?
|
16
|
+
url = "https://www.dramatists.com/dps/nowpublished.aspx"
|
17
|
+
self.new_from_scrape(PRLS::CLI::Scraper.new.dps_index(url))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.list_plays
|
22
|
+
puts ""
|
23
|
+
puts "Here are Dramatist's Play Service, Inc.'s featured plays:"
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.get_details(index)
|
28
|
+
if self.all[index].need_attr?
|
29
|
+
self.all[index].add_attr(PRLS::CLI::Scraper.new.dps_info(self.all[index].url))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/prls/mti.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
class PRLS::CLI::MTI < PRLS::CLI::PRO
|
2
|
+
|
3
|
+
MTI_PLAYS = []
|
4
|
+
|
5
|
+
def initialize(attributes)
|
6
|
+
super
|
7
|
+
MTI_PLAYS << self
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.all
|
11
|
+
MTI_PLAYS
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.get_plays
|
15
|
+
if self.all.empty?
|
16
|
+
url = "https://www.mtishows.com/shows/all"
|
17
|
+
self.new_from_scrape(PRLS::CLI::Scraper.new.mti_index(url))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.list_plays
|
22
|
+
puts ""
|
23
|
+
puts "Here are Music Theatre International's featured plays:"
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.get_details(index)
|
28
|
+
if self.all[index].need_attr?
|
29
|
+
self.all[index].add_attr(PRLS::CLI::Scraper.new.mti_info(self.all[index].url))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class PRLS::CLI::PLAYSCRIPTS < PRLS::CLI::PRO
|
2
|
+
|
3
|
+
PLAYSCRIPTS_PLAYS = []
|
4
|
+
|
5
|
+
def initialize(attributes)
|
6
|
+
super
|
7
|
+
PLAYSCRIPTS_PLAYS << self
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.all
|
11
|
+
PLAYSCRIPTS_PLAYS
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.get_plays
|
15
|
+
if self.all.empty?
|
16
|
+
url = "https://www.playscripts.com/find-a-play?sort=recentpopularity"
|
17
|
+
self.new_from_scrape(PRLS::CLI::Scraper.new.playscripts_index(url))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.list_plays
|
22
|
+
puts ""
|
23
|
+
puts "Here are Playscripts, Inc.'s featured plays:"
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.get_details(index)
|
28
|
+
if self.all[index].need_attr?
|
29
|
+
self.all[index].add_attr(PRLS::CLI::Scraper.new.playscripts_info(self.all[index].url))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
data/lib/prls/pro.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
class PRLS::CLI::PRO
|
2
|
+
|
3
|
+
attr_accessor :title, :author, :summary, :blurb, :url
|
4
|
+
|
5
|
+
def initialize(attributes)
|
6
|
+
attributes.each do |key, val|
|
7
|
+
self.send("#{key}=", val) if self.respond_to?("#{key}=")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_attr(hash)
|
12
|
+
hash.each do |key, val|
|
13
|
+
self.send("#{key}=", val) if self.respond_to?("#{key}=")
|
14
|
+
end
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def need_attr?
|
19
|
+
if self.instance_variables.size < 5
|
20
|
+
true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.new_from_scrape(array)
|
25
|
+
array.each do |data|
|
26
|
+
self.new(data)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.list_plays
|
31
|
+
puts ""
|
32
|
+
index = 0
|
33
|
+
self.all.each do |play|
|
34
|
+
puts "#{index + 1}. #{play.title}"
|
35
|
+
index += 1
|
36
|
+
end
|
37
|
+
puts ""
|
38
|
+
puts "Which play would you like to learn more about?"
|
39
|
+
puts ""
|
40
|
+
choice = gets.chomp
|
41
|
+
while choice.to_i > self.all.size + 1
|
42
|
+
puts "Invalid entry, please try again."
|
43
|
+
choice = gets.chomp
|
44
|
+
end
|
45
|
+
self.get_details(choice.to_i - 1)
|
46
|
+
self.list_details(choice.to_i - 1)
|
47
|
+
choice = 0
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.list_details(index)
|
51
|
+
puts ""
|
52
|
+
puts "TITLE"
|
53
|
+
puts ""
|
54
|
+
puts "#{self.all[index].title} by #{self.all[index].author}"
|
55
|
+
puts ""
|
56
|
+
puts "SUMMARY"
|
57
|
+
puts ""
|
58
|
+
if self.all[index].summary == nil || self.all[index].summary == ""
|
59
|
+
puts "No summary found."
|
60
|
+
else
|
61
|
+
puts self.all[index].summary.split.join(' ').wrap
|
62
|
+
end
|
63
|
+
puts ""
|
64
|
+
puts "REVIEWS"
|
65
|
+
puts ""
|
66
|
+
if self.all[index].blurb == nil || self.all[index].blurb == ""
|
67
|
+
puts "No reviews found."
|
68
|
+
else
|
69
|
+
puts self.all[index].blurb.split.join(' ').wrap
|
70
|
+
end
|
71
|
+
puts ""
|
72
|
+
puts "Learn more about #{self.all[index].title} here: #{self.all[index].url}"
|
73
|
+
puts ""
|
74
|
+
puts "Would you like to learn more about another play? Y/N"
|
75
|
+
input = gets.chomp
|
76
|
+
if input.downcase == 'y'
|
77
|
+
puts ""
|
78
|
+
self.list_plays
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
data/lib/prls/scraper.rb
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
class PRLS::CLI::Scraper
|
2
|
+
|
3
|
+
attr_accessor :dps_plays, :dps_content,
|
4
|
+
:mti_plays, :mti_content,
|
5
|
+
:concord_plays, :concord_content,
|
6
|
+
:playscripts_plays, :playscripts_content,
|
7
|
+
:bpp_plays, :bpp_content
|
8
|
+
|
9
|
+
|
10
|
+
def dps_index(url)
|
11
|
+
dps_index = Nokogiri::HTML(open(url))
|
12
|
+
@dps_plays = []
|
13
|
+
|
14
|
+
dps_index.css('table td a').each do |play|
|
15
|
+
if play != nil
|
16
|
+
@dps_plays << {
|
17
|
+
:title => play.text,
|
18
|
+
:url => play.attribute('href').value
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
@dps_plays
|
23
|
+
end
|
24
|
+
|
25
|
+
def dps_info(url)
|
26
|
+
dps_info = Nokogiri::HTML(open(url))
|
27
|
+
@dps_content = {}
|
28
|
+
|
29
|
+
dps_info.css('#single').each do |content|
|
30
|
+
@dps_content = {
|
31
|
+
:author => content.css('#authorname').text,
|
32
|
+
:summary => content.css('#lexisynopsis').text,
|
33
|
+
:blurb => content.css('.lexishorttext').text
|
34
|
+
}
|
35
|
+
end
|
36
|
+
@dps_content
|
37
|
+
end
|
38
|
+
|
39
|
+
def concord_index(url)
|
40
|
+
concord_index = Nokogiri::HTML(open(url))
|
41
|
+
@concord_plays = []
|
42
|
+
concord_index.css('.card__item--text').each do |play|
|
43
|
+
@concord_plays << {
|
44
|
+
:title => play.css('a').text,
|
45
|
+
:url => "https://www.concordtheatricals.com#{play.css('a').attribute('href').value}"
|
46
|
+
}
|
47
|
+
end
|
48
|
+
@concord_plays
|
49
|
+
end
|
50
|
+
|
51
|
+
def concord_info(url)
|
52
|
+
concord_info = Nokogiri::HTML(open(url))
|
53
|
+
@concord_content = {
|
54
|
+
:author => concord_info.css('.type-large-credits').css('a').text,
|
55
|
+
:summary => concord_info.css('.pdp-section .type-regular').css('.longer-content').text,
|
56
|
+
:blurb => []
|
57
|
+
}
|
58
|
+
concord_info.css('type-regular').css('.pdp-sub-section').each do |review|
|
59
|
+
@concord_content[:blurb] << review.text
|
60
|
+
end
|
61
|
+
@concord_content[:blurb] = @concord_content[:blurb].join(' ')
|
62
|
+
@concord_content
|
63
|
+
end
|
64
|
+
|
65
|
+
def mti_index(url)
|
66
|
+
mti_index = Nokogiri::HTML(open(url))
|
67
|
+
@mti_plays = []
|
68
|
+
|
69
|
+
mti_index.css('.alphabetical-item').each do |play|
|
70
|
+
@mti_plays << {
|
71
|
+
:title => play.css('span').text,
|
72
|
+
:url => play.css('a').attribute('href').value
|
73
|
+
}
|
74
|
+
end
|
75
|
+
@mti_plays
|
76
|
+
end
|
77
|
+
|
78
|
+
def mti_info(url)
|
79
|
+
mti_data = Nokogiri::HTML(open(url))
|
80
|
+
@mti_content = {}
|
81
|
+
|
82
|
+
mti_data.css('.group-content-main').each do |content|
|
83
|
+
@mti_content = {
|
84
|
+
:author => [],
|
85
|
+
:summary => content.css('.show__summary').text,
|
86
|
+
:blurb => content.css('.show__brief').text
|
87
|
+
}
|
88
|
+
end
|
89
|
+
|
90
|
+
mti_data.css('.show__attributions .attribution__author-name').each do |author|
|
91
|
+
@mti_content[:author] << author.text
|
92
|
+
end
|
93
|
+
|
94
|
+
@mti_content[:author] = @mti_content[:author].uniq.join(', ')
|
95
|
+
|
96
|
+
@mti_content
|
97
|
+
end
|
98
|
+
|
99
|
+
def playscripts_index(url)
|
100
|
+
playscripts_index = Nokogiri::HTML(open(url))
|
101
|
+
@playscripts_plays = []
|
102
|
+
playscripts_index.css('.theater-story').each do |play|
|
103
|
+
@playscripts_plays << {
|
104
|
+
:title => play.css('.infos').css('.text').text,
|
105
|
+
:url => "https://www.playscripts.com#{play.css('.infos').css('a').attribute('href').value}"
|
106
|
+
}
|
107
|
+
end
|
108
|
+
@playscripts_plays
|
109
|
+
end
|
110
|
+
|
111
|
+
def playscripts_info(url)
|
112
|
+
playscripts_info = Nokogiri::HTML(open(url))
|
113
|
+
@playscripts_content = {
|
114
|
+
:summary => playscripts_info.css('.infos').css('.story-description').text.split.join(' ').chomp(' Read More'),
|
115
|
+
:author => playscripts_info.css('.infos').css('.playauthors').css('a').text,
|
116
|
+
}
|
117
|
+
blurb_check = playscripts_info.css('.script-more-info').css('.content').css('.p-review').first
|
118
|
+
if blurb_check != nil
|
119
|
+
@playscripts_content[:blurb] = blurb_check.text.split.join(' ')
|
120
|
+
end
|
121
|
+
@playscripts_content
|
122
|
+
end
|
123
|
+
|
124
|
+
def bpp_index(url)
|
125
|
+
bpp_index = Nokogiri::HTML(open(url))
|
126
|
+
@bpp_plays = []
|
127
|
+
bpp_index.css('.product-details').each do |play|
|
128
|
+
@bpp_plays << {
|
129
|
+
:title => play.css('a').text.chomp(' [read more]'),
|
130
|
+
:url => play.css('a').attribute('href').value
|
131
|
+
}
|
132
|
+
end
|
133
|
+
@bpp_plays
|
134
|
+
end
|
135
|
+
|
136
|
+
def bpp_info(url)
|
137
|
+
bpp_data = Nokogiri::HTML(open(url))
|
138
|
+
play = bpp_data.css('.product-essential')
|
139
|
+
@bpp_content = {:author => play.css('.authorbilling').text, :blurb => []}
|
140
|
+
if play.css('.description p').first != nil
|
141
|
+
@bpp_content[:summary] = play.css('.description p').first.text
|
142
|
+
end
|
143
|
+
play.css('#tab-reviews p').each do |review|
|
144
|
+
if review != nil
|
145
|
+
@bpp_content[:blurb] << review.text
|
146
|
+
end
|
147
|
+
end
|
148
|
+
@bpp_content[:blurb] = @bpp_content[:blurb].join(' ')
|
149
|
+
@bpp_content
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
|
data/lib/prls/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: prls
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Justin McLawhorn
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-07-02 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email:
|
15
|
+
- jwmclawhorn@gmail.com
|
16
|
+
executables:
|
17
|
+
- prls
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- bin/prls
|
22
|
+
- lib/prls.rb
|
23
|
+
- lib/prls/bpp.rb
|
24
|
+
- lib/prls/cli.rb
|
25
|
+
- lib/prls/concord.rb
|
26
|
+
- lib/prls/dps.rb
|
27
|
+
- lib/prls/mti.rb
|
28
|
+
- lib/prls/playscripts.rb
|
29
|
+
- lib/prls/pro.rb
|
30
|
+
- lib/prls/scraper.rb
|
31
|
+
- lib/prls/version.rb
|
32
|
+
homepage: https://github.com/justinmcla/prls
|
33
|
+
licenses:
|
34
|
+
- MIT
|
35
|
+
metadata: {}
|
36
|
+
post_install_message:
|
37
|
+
rdoc_options: []
|
38
|
+
require_paths:
|
39
|
+
- lib
|
40
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 2.3.0
|
45
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
requirements: []
|
51
|
+
rubygems_version: 3.1.4
|
52
|
+
signing_key:
|
53
|
+
specification_version: 4
|
54
|
+
summary: Fetches featured plays from Performance Rights Organizations (PROs).
|
55
|
+
test_files: []
|