phish_dot_net_client 0.0.1 → 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.
data/.gitignore CHANGED
@@ -8,3 +8,5 @@ tmp/*
8
8
  doc/*
9
9
  .ruby-gemset
10
10
  .ruby-version
11
+ *.gem
12
+ Gemfile.lock
data/Gemfile CHANGED
@@ -1,11 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'rest-client', '~> 1.6.7'
4
- gem 'json', '~> 1.8.0'
5
- gem 'nokogiri', '~> 1.6.0'
6
-
7
- group :development do
8
- gem 'rake'
9
- gem 'rspec'
10
- gem 'yard'
11
- end
3
+ gemspec
data/History.md ADDED
@@ -0,0 +1,9 @@
1
+ ### 0.1.0 / 2013-10-28
2
+
3
+ * Add code documentation
4
+ * Clean some stuff up
5
+
6
+
7
+ ### 0.0.1 / 2013-10-28
8
+
9
+ * Initial release
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Phish.net API Client
2
2
 
3
+ <a href="http://badge.fury.io/rb/phish_dot_net_client"><img src="https://badge.fury.io/rb/phish_dot_net_client@2x.png" alt="Gem Version" height="18"></a>
4
+
3
5
  A Phish.net API client, with support for parsing the 'setlistdata' field. Inspired by the other Ruby Phish.net API [client](http://api.phish.net/wrappers/ruby.php) written by [Stephen Blackstone](http://phish.net/user/steveb3210).
4
6
 
5
7
  [rdoc](http://rubydoc.info/github/alexebird/phish_dot_net_client/master/frames/file/README.md)
@@ -34,7 +36,8 @@ Rubygems:
34
36
  PhishDotNetClient.shows_query :month => '7', :country => 'USA', :state => 'CA'
35
37
 
36
38
  # Arguments are not checked for validity before being passed
37
- PhishDotNetClient.shows_setlists_get :fluff => 'head' # returns {"success" => 0,"reason" => "General API Error"}
39
+ PhishDotNetClient.shows_setlists_get :fluff => 'head'
40
+ # => returns {"success" => 0,"reason" => "General API Error"}
38
41
 
39
42
  # All methods return JSON parsed into Ruby Hashes/Arrays
40
43
  tweez = PhishDotNetClient.shows_setlists_get :showdate => '2013-07-31'
data/Rakefile CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'rspec/core/rake_task'
2
2
 
3
-
4
3
  desc "Parse the documentation from Phish.net to get the current method calls"
5
4
  task :parse_method_docs do
6
5
  # require 'nokogiri'
@@ -38,18 +37,22 @@ RSpec::Core::RakeTask.new(:spec) do |t|
38
37
  # t.verbose = false
39
38
  end
40
39
 
41
- desc "Run specs in spec/units"
42
- RSpec::Core::RakeTask.new('spec:units') do |t|
43
- t.pattern = "./spec/units/**/*_spec.rb"
44
- end
45
-
46
- desc "Run specs in spec/integration"
47
- RSpec::Core::RakeTask.new('spec:integration') do |t|
48
- t.pattern = "./spec/integration/**/*_spec.rb"
49
- end
50
-
51
40
  desc "Generate documentation"
52
41
  task :doc do
53
42
  require 'yard'
54
43
  sh "yard"
55
44
  end
45
+
46
+ desc "Instructions for releasing a new version"
47
+ task :"release:instructions" do
48
+ version = PhishDotNetClient::VERSION
49
+ gem_name = File.basename Dir.glob(File.join(File.expand_path('../', __FILE__), '*.gemspec')).first.sub('.gemspec', '')
50
+ last_release = `git tag | grep --color=never -e "v\\d\\+\\." | sort | tail -n1`.strip
51
+
52
+ puts "1. update version.rb"
53
+ puts "2. update History.md"
54
+ puts " git log #{last_release}..HEAD --no-merges --format=%B"
55
+ puts "3. git commit, git tag v#{version}, git push origin v#{version}"
56
+ puts "4. gem build #{gem_name}.gemspec ; mv #{gem_name}-#{version}.gem ~/gems/"
57
+ puts "5. gem push ~/gems/#{gem_name}-#{version}.gem"
58
+ end
@@ -1,99 +1,121 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'restclient'
4
- require 'json'
4
+ require 'oj'
5
5
  require 'nokogiri'
6
6
 
7
+ require 'phish_dot_net_client/version'
7
8
  require 'phish_dot_net_client/set'
8
9
  require 'phish_dot_net_client/setlist'
9
10
  require 'phish_dot_net_client/song'
10
11
  require 'phish_dot_net_client/song_transition'
11
- require 'phish_dot_net_client/version'
12
12
 
13
- # @todo write doc
13
+ # This module encapsulates interaction with the Phish.net API. It allows you to
14
+ # call any API method and will parse "setlistdata" fields in the JSON responses.
14
15
  module PhishDotNetClient
15
16
  extend self
16
17
 
17
18
  # The possible API methods. Generated from +rake parse_method_docs+.
18
- # API_METHODS =
19
- # {
20
- # "pnet.api.authkey.get" => { :scope => "protected" },
21
- # "pnet.api.authorize" => { :scope => "protected" },
22
- # "pnet.api.authorized.check" => { :scope => "protected" },
23
- # "pnet.api.isAuthorized" => { :scope => "protected" },
24
- # "pnet.artists.get" => { :scope => "public" },
25
- # "pnet.blog.get" => { :scope => "public" },
26
- # "pnet.blog.item.get" => { :scope => "public" },
27
- # "pnet.collections.get" => { :scope => "protected" },
28
- # "pnet.collections.query" => { :scope => "protected" },
29
- # "pnet.forum.canpost" => { :scope => "protected" },
30
- # "pnet.forum.get" => { :scope => "public" },
31
- # "pnet.forum.thread.get" => { :scope => "protected" },
32
- # "pnet.forum.thread.new" => { :scope => "protected" },
33
- # "pnet.forum.thread.respond" => { :scope => "protected" },
34
- # "pnet.news.comments.get" => { :scope => "public" },
35
- # "pnet.news.get" => { :scope => "public" },
36
- # "pnet.reviews.query" => { :scope => "protected" },
37
- # "pnet.reviews.recent" => { :scope => "public" },
38
- # "pnet.shows.links.get" => { :scope => "protected" },
39
- # "pnet.shows.query" => { :scope => "protected" },
40
- # "pnet.shows.setlists.get" => { :scope => "protected" },
41
- # "pnet.shows.setlists.latest" => { :scope => "public" },
42
- # "pnet.shows.setlists.random" => { :scope => "public" },
43
- # "pnet.shows.setlists.recent" => { :scope => "public" },
44
- # "pnet.shows.setlists.tiph" => { :scope => "public" },
45
- # "pnet.shows.upcoming" => { :scope => "public" },
46
- # "pnet.user.get" => { :scope => "protected" },
47
- # "pnet.user.myshows.add" => { :scope => "protected" },
48
- # "pnet.user.myshows.get" => { :scope => "protected" },
49
- # "pnet.user.myshows.remove" => { :scope => "protected" },
50
- # "pnet.user.register" => { :scope => "protected" },
51
- # "pnet.user.shows.rate" => { :scope => "protected" },
52
- # "pnet.user.uid.get" => { :scope => "protected" },
53
- # "pnet.user.username.check" => { :scope => "protected" }
54
- # }
19
+ API_METHODS =
20
+ {
21
+ "pnet.api.authkey.get" => { :scope => "protected" },
22
+ "pnet.api.authorize" => { :scope => "protected" },
23
+ "pnet.api.authorized.check" => { :scope => "protected" },
24
+ "pnet.api.isAuthorized" => { :scope => "protected" },
25
+ "pnet.artists.get" => { :scope => "public" },
26
+ "pnet.blog.get" => { :scope => "public" },
27
+ "pnet.blog.item.get" => { :scope => "public" },
28
+ "pnet.collections.get" => { :scope => "protected" },
29
+ "pnet.collections.query" => { :scope => "protected" },
30
+ "pnet.forum.canpost" => { :scope => "protected" },
31
+ "pnet.forum.get" => { :scope => "public" },
32
+ "pnet.forum.thread.get" => { :scope => "protected" },
33
+ "pnet.forum.thread.new" => { :scope => "protected" },
34
+ "pnet.forum.thread.respond" => { :scope => "protected" },
35
+ "pnet.news.comments.get" => { :scope => "public" },
36
+ "pnet.news.get" => { :scope => "public" },
37
+ "pnet.reviews.query" => { :scope => "protected" },
38
+ "pnet.reviews.recent" => { :scope => "public" },
39
+ "pnet.shows.links.get" => { :scope => "protected" },
40
+ "pnet.shows.query" => { :scope => "protected" },
41
+ "pnet.shows.setlists.get" => { :scope => "protected" },
42
+ "pnet.shows.setlists.latest" => { :scope => "public" },
43
+ "pnet.shows.setlists.random" => { :scope => "public" },
44
+ "pnet.shows.setlists.recent" => { :scope => "public" },
45
+ "pnet.shows.setlists.tiph" => { :scope => "public" },
46
+ "pnet.shows.upcoming" => { :scope => "public" },
47
+ "pnet.user.get" => { :scope => "protected" },
48
+ "pnet.user.myshows.add" => { :scope => "protected" },
49
+ "pnet.user.myshows.get" => { :scope => "protected" },
50
+ "pnet.user.myshows.remove" => { :scope => "protected" },
51
+ "pnet.user.register" => { :scope => "protected" },
52
+ "pnet.user.shows.rate" => { :scope => "protected" },
53
+ "pnet.user.uid.get" => { :scope => "protected" },
54
+ "pnet.user.username.check" => { :scope => "protected" }
55
+ }
55
56
 
56
57
  # The base URL for API calls
57
58
  BASE_URL = "https://api.phish.net/api.js"
58
59
 
59
60
  # "https://api.phish.net/api.js?api=2.0&method=pnet.shows.query&format=json&apikey=920FF765772E442F3E22&year=2011"
60
61
 
61
- @@default_params = { api: "2.0",
62
- format: "json" }
62
+ DEFAULT_PARAMS = { api: "2.0",
63
+ format: "json" }
63
64
 
65
+ # Set the apikey. The "private api key" from your Phish.net account should be
66
+ # used.
67
+ #
68
+ # @param private_api_key [String] the apikey
69
+ # @return [void]
64
70
  def apikey=(private_api_key)
65
- @@default_params.merge!(:apikey => private_api_key)
71
+ DEFAULT_PARAMS.merge!(:apikey => private_api_key)
66
72
  end
67
73
 
68
- def authorize(username=nil, passwd=nil)
69
- resp = call_api_method("pnet.api.authorize", :username => username, :passwd => passwd)
74
+ # Calls pnet.api.authorize with the specified username and password, then stores
75
+ # the username and returned authkey if the call was successful. The password is
76
+ # not stored.
77
+ #
78
+ # @param username [String] the username
79
+ # @param password [String] the password
80
+ #
81
+ # @return [void]
82
+ def authorize(username, password)
83
+ resp = call_api_method("pnet.api.authorize", :username => username, :passwd => password)
70
84
 
71
85
  if resp['success'] == 1 && resp.has_key?('authkey')
72
- @@default_params.merge!(:username => username, :authkey => resp['authkey'])
86
+ DEFAULT_PARAMS.merge!(:username => username, :authkey => resp['authkey'])
73
87
  end
74
88
  end
75
89
 
90
+ # Clears the stored API authentication parameters (apikey, username, authkey)
91
+ #
92
+ # @return [void]
76
93
  def clear_auth
77
- [:apikey, :username, :authkey].each { |key| @@default_params.delete(key) }
94
+ [:apikey, :username, :authkey].each { |key| DEFAULT_PARAMS.delete(key) }
78
95
  end
79
96
 
97
+ # @api private
98
+ #
99
+ # Calls the specified Phish.net api method.
100
+ #
80
101
  # @param api_method [String] the method to call
81
102
  # @param params [Hash] the url parameters for the api call
82
103
  #
104
+ # @raise [RuntimeError] if the http response status is a 2xx
105
+ #
83
106
  # @return [Hash, Array] the parsed JSON of API response
84
- # @api private
85
107
  def call_api_method(api_method, params={})
86
108
  # method_data = API_METHODS[api_method]
87
109
  # ensure_api_key if method_data[:scope] == "protected"
88
110
 
89
111
  params.merge!(:method => api_method)
90
- response = RestClient.get BASE_URL, { :params => @@default_params.merge(params) }
112
+ response = RestClient.get BASE_URL, { :params => DEFAULT_PARAMS.merge(params) }
91
113
 
92
114
  if response.code < 200 || response.code > 299
93
115
  raise "non 2xx reponse: status=#{response.code}"
94
116
  end
95
117
 
96
- parsed = JSON.parse(response)
118
+ parsed = Oj.load(response)
97
119
 
98
120
  if parsed.is_a?(Array)
99
121
  parsed.each do |obj|
@@ -106,6 +128,8 @@ module PhishDotNetClient
106
128
  return parsed
107
129
  end
108
130
 
131
+ # Override method_missing to provide mapping of Ruby methods to API method names.
132
+ #
109
133
  # @api private
110
134
  def method_missing(name, *args)
111
135
  api_method = get_api_method(name)
@@ -117,9 +141,9 @@ module PhishDotNetClient
117
141
  end
118
142
  end
119
143
 
120
- # private
121
-
122
144
  # @api private
145
+ # @param rb_method_name [Symbol] the Ruby method name
146
+ # @return [String] the api method name
123
147
  def get_api_method(rb_method_name)
124
148
  api_method_name = rb_method_name.to_s.gsub("_", ".")
125
149
 
@@ -137,6 +161,6 @@ module PhishDotNetClient
137
161
  end
138
162
 
139
163
  # def ensure_api_key
140
- # raise "api key is required" if @@default_params[:apikey].nil?
164
+ # raise "api key is required" if DEFAULT_PARAMS[:apikey].nil?
141
165
  # end
142
166
  end
@@ -1,13 +1,27 @@
1
1
  # encoding: utf-8
2
2
 
3
- # @api private
4
3
  module PhishDotNetClient
4
+
5
+ # This class represents a set from the 'setlistdata' field.
5
6
  class Set
6
7
 
8
+ # @!attribute [r] position
9
+ # @return [Integer] the position of the set, indexed starting at 0
7
10
  attr_reader :position
11
+
12
+ # @!attribute [r] name
13
+ # @return [String] the name of the set
8
14
  attr_reader :name
15
+
16
+ # @!attribute [r] songs
17
+ # @return [Array<Song>] the songs belonging to the set
9
18
  attr_reader :songs
10
19
 
20
+ # @param attrs [Hash] the attributes hash
21
+ # @option attrs [Integer] :position the set position
22
+ # @option attrs [Integer] :name the set name
23
+ #
24
+ # @api private
11
25
  def initialize(attrs={})
12
26
  @songs = []
13
27
  @position = attrs[:position]
@@ -1,21 +1,37 @@
1
1
  # encoding: utf-8
2
2
 
3
- # @api private
4
3
  module PhishDotNetClient
4
+
5
+ # This class represents the parsed data from the 'setlistdata' field.
5
6
  class Setlist
6
7
 
8
+ # @!attribute [r] sets
9
+ # @return [Array<Set>] the setlist's sets
7
10
  attr_reader :sets
11
+
12
+ # @!attribute [r] footnotes
13
+ # @return [Hash<Integer, Hash<Symbol, String>>] the setlist's footnotes
8
14
  attr_reader :footnotes
9
15
 
16
+ # @param setlistdata [String] the setlistdata string
17
+ #
18
+ # @api private
10
19
  def initialize(setlistdata)
11
20
  @sets, @footnotes = self.class.parse_setlistdata(setlistdata)
12
21
  end
13
22
 
23
+ # @return [Array<Song>] all songs in the setlist
14
24
  def songs
15
25
  return @sets.map(&:songs).reduce([]){|memo,songs| memo += songs }
16
26
  end
17
27
 
18
28
  # @api private
29
+ #
30
+ # Does the work of parsing the setlistdata.
31
+ #
32
+ # @param setlistdata [String] the setlistdata string
33
+ #
34
+ # @return [Array<(Array<Set>, Hash)>] the parsed sets and footnotes
19
35
  def self.parse_setlistdata(setlistdata)
20
36
  doc = Nokogiri::HTML(setlistdata)
21
37
 
@@ -36,14 +52,14 @@ module PhishDotNetClient
36
52
  slug_instances = {}
37
53
 
38
54
  setnodes = doc.css(".pnetset")
39
- position_in_show = 1
55
+ position_in_show = 0
40
56
 
41
57
  setnodes.each_with_index do |n,set_index|
42
58
  setname = n.css(".pnetsetlabel").first.content
43
- set = Set.new(:name => setname.sub!(/:\z/, ''), :position => set_index + 1)
59
+ set = Set.new(:name => setname.sub!(/:\z/, ''), :position => set_index)
44
60
  songs_doc = n.css("a")
45
61
  songs_doc.each_with_index do |song,song_index|
46
- position_in_set = song_index + 1
62
+ position_in_set = song_index
47
63
  title = song.content
48
64
  url = song.attr('href')
49
65
  slug = URI.parse(url).path
@@ -63,7 +79,7 @@ module PhishDotNetClient
63
79
  position_in_show += 1
64
80
  end
65
81
 
66
- transitions_text = n.content
82
+ transitions_text = n.content # strips html tags
67
83
  transitions_tokens += tokenize_transitions_text(transitions_text, transitions_tokens)
68
84
 
69
85
  sets << set
@@ -75,6 +91,15 @@ module PhishDotNetClient
75
91
  end
76
92
 
77
93
  # @api private
94
+ #
95
+ # Adds footnotes to their associated songs and adds transition information
96
+ # between songs.
97
+ #
98
+ # @param tokens [Array<Hash <Symbol, Object>>] the tokens to augment with
99
+ # @param songs [Array<Song>] the songs to augment
100
+ # @param footnotes [Hash<Integer, Hash<Symbol, String>>] the footnotes to augment with
101
+ #
102
+ # @return [void]
78
103
  def self.augment_songs(tokens, songs, footnotes)
79
104
  songs = Array.new(songs) # make a copy
80
105
 
@@ -113,8 +138,18 @@ module PhishDotNetClient
113
138
  end
114
139
 
115
140
  # @api private
141
+ #
142
+ # Tokenizes the html-stripped setlistdata text.
143
+ #
144
+ # @param transitions_text [String] the text to tokenize
145
+ # @param existing_tokens [Array<Hash<Symbol, Object>>] tokens of already
146
+ # parsed text, so that repeat songs can be detected.
147
+ #
148
+ # @raise [RuntimeError] if the transitions_text could not be parsed
149
+ #
150
+ # @return [Array<Hash<Symbol, Object>>]
116
151
  def self.tokenize_transitions_text(transitions_text, existing_tokens=[])
117
- tokens = []
152
+ rules = []
118
153
 
119
154
  # Account for multiple songs with the same title in a song list
120
155
  song_title_counts = {}
@@ -126,46 +161,47 @@ module PhishDotNetClient
126
161
  end
127
162
  end
128
163
 
129
- tokens.push(/\A[a-z0-9\s]+:/i => lambda do |match|
164
+ rules.push(/\A[a-z0-9\s]+:/i => lambda do |match|
130
165
  return { type: :set_name, name: match.to_s.strip.sub(':', '') }
131
166
  end)
132
167
 
133
- tokens.push(/\A[äa-z0-9\-?\.!:\/'\s\(\)]+[a-z0-9\)?!']/i => lambda do |match|
168
+ rules.push(/\A[äa-z0-9\-?\.!:\/'\s\(\)]+[a-z0-9\)?!']/i => lambda do |match|
134
169
  title = match.to_s.strip
135
170
  song_title_counts[title] ||= 0
136
171
  song_title_counts[title] += 1
137
172
  return { type: :song, title: title, instance: song_title_counts[title] }
138
173
  end)
139
174
 
140
- tokens.push(/\A\[(?<num>\d+)\]/ => lambda do |match|
175
+ rules.push(/\A\[(?<num>\d+)\]/ => lambda do |match|
141
176
  return { type: :note_ref, number: match[:num].to_i }
142
177
  end)
143
178
 
144
- tokens.push(/\A,/ => lambda do |match|
179
+ rules.push(/\A,/ => lambda do |match|
145
180
  return { type: :transition, transition_type: :no_segue }
146
181
  end)
147
182
 
148
- tokens.push(/\A>/ => lambda do |match|
183
+ rules.push(/\A>/ => lambda do |match|
149
184
  return { type: :transition, transition_type: :segue }
150
185
  end)
151
186
 
152
- tokens.push(/\A->/ => lambda do |match|
187
+ rules.push(/\A->/ => lambda do |match|
153
188
  return { type: :transition, transition_type: :deep_segue }
154
189
  end)
155
190
 
156
- tokens.push(/\A\s+/ => lambda do |match|
191
+ rules.push(/\A\s+/ => lambda do |match|
157
192
  return nil
158
193
  end)
159
194
 
160
195
  parsed_set = []
161
196
 
162
197
  until transitions_text.empty?
163
- matched = false
198
+ matched = false # keeps track of whether the transitions_text matched
199
+ # any rule. raise error if there no match.
164
200
 
165
- tokens.each do |matcher|
166
- token_regex, processor = matcher.keys.first, matcher.values.first
201
+ rules.each do |rule|
202
+ rule_regex, processor = rule.keys.first, rule.values.first
167
203
 
168
- if transitions_text.slice!(token_regex)
204
+ if transitions_text.slice!(rule_regex)
169
205
  matched = true
170
206
  token = processor.call($~)
171
207
  parsed_set.push(token) if token
@@ -1,18 +1,58 @@
1
1
  # encoding: utf-8
2
2
 
3
- # @api private
4
3
  module PhishDotNetClient
4
+
5
+ # This class represents a set from the 'setlistdata' field.
5
6
  class Song
7
+
8
+ # @!attribute [r] title
9
+ # @return [String] the song title
6
10
  attr_reader :title
11
+
12
+ # @!attribute [r] url
13
+ # @return [String] the song url
7
14
  attr_reader :url
15
+
16
+ # @!attribute [r] slug
17
+ # @return [String] the song slug (not unique). slug+instance can be used to
18
+ # create a unique slug when the setlist has the same song more than once.
8
19
  attr_reader :slug
20
+
21
+ # @!attribute [r] instance
22
+ # @return [Integer] the instance number of the song. Normally will be +1+ since
23
+ # most shows don't have multiple instances of the same song.
9
24
  attr_reader :instance
25
+
26
+ # @!attribute [r] position_in_set
27
+ # @return [String] the position of the song in it's set, indexed starting at 0
10
28
  attr_reader :position_in_set
29
+
30
+ # @!attribute [r] position_in_show
31
+ # @return [String] the position of the song in the show, indexed starting at 0
11
32
  attr_reader :position_in_show
33
+
34
+ # @!attribute [r] footnotes
35
+ # @return [Array<Integer>] the song's foonote numbers, used to lookup footnotes
36
+ # via {Setlist#footnotes}.
12
37
  attr_reader :footnotes
38
+
39
+ # @!attribute pre_transition
40
+ # @return [SongTransition] the transition to the previous song
13
41
  attr_accessor :pre_transition
42
+
43
+ # @!attribute post_transition
44
+ # @return [SongTransition] the transition to the next song
14
45
  attr_accessor :post_transition
15
46
 
47
+ # @api private
48
+ #
49
+ # @param attrs [Hash<Symbol, Object>] the song attributes
50
+ # @option attrs [String] :title the song title
51
+ # @option attrs [String] :url the song url
52
+ # @option attrs [String] :slug the song slug
53
+ # @option attrs [Integer] :instance the instance number of the song
54
+ # @option attrs [Integer] :position_in_set set position of the song
55
+ # @option attrs [Integer] :position_in_show show position of the song
16
56
  def initialize(attrs={})
17
57
  @title = attrs[:title]
18
58
  @url = attrs[:url]
@@ -23,6 +63,7 @@ module PhishDotNetClient
23
63
  @footnotes = []
24
64
  end
25
65
 
66
+ # @return [String] the song along with pre and post transitions
26
67
  def to_s
27
68
  s = StringIO.new
28
69
 
@@ -1,13 +1,33 @@
1
1
  # encoding: utf-8
2
2
 
3
- # @api private
4
3
  module PhishDotNetClient
4
+
5
+ # This class represents a transition between two songs.
5
6
  class SongTransition
6
7
 
8
+ # @!attribute [r] type
9
+ #
10
+ # Valid types:
11
+ # * :no_segue
12
+ # * :segue (aka '>')
13
+ # * :deep_segue (aka '->')
14
+ #
15
+ # @return [Symbol] the transition type
7
16
  attr_reader :type
17
+
18
+ # @!attribute [r] from_song
19
+ # @return [Song] the song going into the transition
8
20
  attr_reader :from_song
21
+
22
+ # @!attribute [r] to_song
23
+ # @return [Song] the song going out the transition
9
24
  attr_reader :to_song
10
25
 
26
+ # @api private
27
+ #
28
+ # @param type [Symbol] the transition type
29
+ # @param from_song [Song] the from song
30
+ # @param to_song [Song] the to song
11
31
  def initialize(type, from_song, to_song)
12
32
  @type = type
13
33
  @from_song = from_song
@@ -1,3 +1,7 @@
1
+ # encoding: utf-8
2
+
1
3
  module PhishDotNetClient
2
- VERSION = '0.0.1'
4
+
5
+ # Gem version
6
+ VERSION = '0.1.0'
3
7
  end
@@ -8,24 +8,26 @@ Gem::Specification.new do |spec|
8
8
  spec.version = PhishDotNetClient::VERSION
9
9
  spec.date = Date.today.to_s
10
10
  spec.licenses = ['MIT']
11
- spec.authors = ["Alexander Bird"]
12
- spec.email = ["alexebird@gmail.com"]
13
- spec.homepage = "https://github.com/alexebird/phish_dot_net_client"
11
+ spec.authors = ['Alexander Bird']
12
+ spec.email = ['alexebird@gmail.com']
13
+ spec.homepage = 'https://github.com/alexebird/phish_dot_net_client'
14
14
  spec.summary = %q{Phish.net API client with setlist parsing}
15
15
  spec.description = %q{Calls any Phish.net API method. Supports authentication. Parses 'setlistdata' fields.}
16
16
 
17
- spec.required_ruby_version = '>= 1.9.1'
17
+ spec.required_ruby_version = '>= 1.9.2'
18
18
  spec.required_rubygems_version = '>= 1.3.6'
19
19
 
20
- spec.add_dependency 'rest-client', '~> 1.6.7'
21
- spec.add_dependency 'json', '~> 1.8.0'
22
- spec.add_dependency 'nokogiri', '~> 1.6.0'
23
- spec.add_development_dependency 'rake'
20
+ spec.add_runtime_dependency 'rest-client', '~> 1.6.7'
21
+ spec.add_runtime_dependency 'oj', '~> 2.1.7'
22
+ spec.add_runtime_dependency 'nokogiri', '~> 1.6.0'
23
+ spec.add_development_dependency 'rake', '~> 10.0'
24
24
  spec.add_development_dependency 'rspec', '~> 2.14'
25
25
  spec.add_development_dependency 'yard', '~> 0.8'
26
+ spec.add_development_dependency 'redcarpet', '~> 3.0'
27
+ spec.add_development_dependency 'simplecov', '~> 0.7.1'
26
28
 
27
29
  spec.files = `git ls-files`.split($/)
28
30
  spec.test_files = spec.files.grep(%r{^spec/})
29
31
 
30
- spec.require_paths = ["lib"]
32
+ spec.require_paths = ['lib']
31
33
  end
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe PhishDotNetClient::Setlist do
4
+ # Test setlistdata:
4
5
  # Set 1: Runaway Jim[1], Foam, Punch You In the Eye[2] > Bathtub Gin, Cavern
5
6
  # Set 2: Also Sprach Zarathustra -> Cavern
6
7
  # Encore: Sleeping Monkey
@@ -5,7 +5,7 @@ describe PhishDotNetClient do
5
5
  let(:fake_api_key) { "fake-apikey" }
6
6
 
7
7
  def access_default_params(key)
8
- return pnet.class_variable_get(:@@default_params)[key]
8
+ return PhishDotNetClient::DEFAULT_PARAMS[key]
9
9
  end
10
10
 
11
11
  it "pre-sets the api version to '2.0'" do
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,14 @@
1
+ if ENV["COV"]
2
+ require 'simplecov'
3
+ SimpleCov.start
4
+ end
5
+
1
6
  require 'bundler'
2
7
  Bundler.require :development
3
8
 
4
- require './lib/phish_dot_net_client'
9
+ lib = File.expand_path('../lib/', __FILE__)
10
+ $:.unshift lib unless $:.include?(lib)
11
+ require 'phish_dot_net_client'
5
12
 
6
13
  RSpec.configure do |config|
7
14
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 0
8
7
  - 1
9
- version: 0.0.1
8
+ - 0
9
+ version: 0.1.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Alexander Bird
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2013-10-09 00:00:00 -04:00
17
+ date: 2013-10-28 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -33,7 +33,7 @@ dependencies:
33
33
  type: :runtime
34
34
  version_requirements: *id001
35
35
  - !ruby/object:Gem::Dependency
36
- name: json
36
+ name: oj
37
37
  prerelease: false
38
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
39
  none: false
@@ -41,10 +41,10 @@ dependencies:
41
41
  - - ~>
42
42
  - !ruby/object:Gem::Version
43
43
  segments:
44
+ - 2
44
45
  - 1
45
- - 8
46
- - 0
47
- version: 1.8.0
46
+ - 7
47
+ version: 2.1.7
48
48
  type: :runtime
49
49
  version_requirements: *id002
50
50
  - !ruby/object:Gem::Dependency
@@ -68,11 +68,12 @@ dependencies:
68
68
  requirement: &id004 !ruby/object:Gem::Requirement
69
69
  none: false
70
70
  requirements:
71
- - - ">="
71
+ - - ~>
72
72
  - !ruby/object:Gem::Version
73
73
  segments:
74
+ - 10
74
75
  - 0
75
- version: "0"
76
+ version: "10.0"
76
77
  type: :development
77
78
  version_requirements: *id004
78
79
  - !ruby/object:Gem::Dependency
@@ -103,6 +104,35 @@ dependencies:
103
104
  version: "0.8"
104
105
  type: :development
105
106
  version_requirements: *id006
107
+ - !ruby/object:Gem::Dependency
108
+ name: redcarpet
109
+ prerelease: false
110
+ requirement: &id007 !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ~>
114
+ - !ruby/object:Gem::Version
115
+ segments:
116
+ - 3
117
+ - 0
118
+ version: "3.0"
119
+ type: :development
120
+ version_requirements: *id007
121
+ - !ruby/object:Gem::Dependency
122
+ name: simplecov
123
+ prerelease: false
124
+ requirement: &id008 !ruby/object:Gem::Requirement
125
+ none: false
126
+ requirements:
127
+ - - ~>
128
+ - !ruby/object:Gem::Version
129
+ segments:
130
+ - 0
131
+ - 7
132
+ - 1
133
+ version: 0.7.1
134
+ type: :development
135
+ version_requirements: *id008
106
136
  description: Calls any Phish.net API method. Supports authentication. Parses 'setlistdata' fields.
107
137
  email:
108
138
  - alexebird@gmail.com
@@ -116,7 +146,7 @@ files:
116
146
  - .gitignore
117
147
  - .rspec
118
148
  - Gemfile
119
- - Gemfile.lock
149
+ - History.md
120
150
  - README.md
121
151
  - Rakefile
122
152
  - lib/phish_dot_net_client.rb
@@ -149,8 +179,8 @@ required_ruby_version: !ruby/object:Gem::Requirement
149
179
  segments:
150
180
  - 1
151
181
  - 9
152
- - 1
153
- version: 1.9.1
182
+ - 2
183
+ version: 1.9.2
154
184
  required_rubygems_version: !ruby/object:Gem::Requirement
155
185
  none: false
156
186
  requirements:
data/Gemfile.lock DELETED
@@ -1,32 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- diff-lcs (1.2.4)
5
- json (1.8.0)
6
- mime-types (1.25)
7
- mini_portile (0.5.1)
8
- nokogiri (1.6.0)
9
- mini_portile (~> 0.5.0)
10
- rake (10.1.0)
11
- rest-client (1.6.7)
12
- mime-types (>= 1.16)
13
- rspec (2.14.1)
14
- rspec-core (~> 2.14.0)
15
- rspec-expectations (~> 2.14.0)
16
- rspec-mocks (~> 2.14.0)
17
- rspec-core (2.14.5)
18
- rspec-expectations (2.14.3)
19
- diff-lcs (>= 1.1.3, < 2.0)
20
- rspec-mocks (2.14.3)
21
- yard (0.8.7.2)
22
-
23
- PLATFORMS
24
- ruby
25
-
26
- DEPENDENCIES
27
- json (~> 1.8.0)
28
- nokogiri (~> 1.6.0)
29
- rake
30
- rest-client (~> 1.6.7)
31
- rspec
32
- yard