rubyoverflow 1.0.2 → 2.0.2.pre1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/.rvmrc +47 -0
- data/.travis.yml +5 -0
- data/Gemfile +2 -0
- data/LICENSE +1 -1
- data/README.rdoc +14 -20
- data/RELEASENOTES +1 -97
- data/Rakefile +7 -49
- data/lib/rubyoverflow.rb +46 -108
- data/lib/rubyoverflow/answers.rb +5 -57
- data/lib/rubyoverflow/base.rb +21 -68
- data/lib/rubyoverflow/questions.rb +5 -101
- data/lib/rubyoverflow/sites.rb +18 -0
- data/lib/rubyoverflow/stats.rb +8 -0
- data/lib/rubyoverflow/users.rb +5 -70
- data/lib/rubyoverflow/version.rb +3 -0
- data/rubyoverflow.gemspec +26 -0
- data/spec/answers_spec.rb +13 -0
- data/spec/questions_spec.rb +13 -0
- data/spec/sites_spec.rb +18 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/stats_spec.rb +12 -0
- data/spec/users_spec.rb +23 -0
- metadata +94 -121
- data/VERSION +0 -1
- data/lib/rubyoverflow/answer.rb +0 -61
- data/lib/rubyoverflow/apiSite.rb +0 -32
- data/lib/rubyoverflow/apiSites.rb +0 -25
- data/lib/rubyoverflow/apiVersion.rb +0 -6
- data/lib/rubyoverflow/badge.rb +0 -44
- data/lib/rubyoverflow/badgeCounts.rb +0 -22
- data/lib/rubyoverflow/badges.rb +0 -59
- data/lib/rubyoverflow/comment.rb +0 -41
- data/lib/rubyoverflow/comments.rb +0 -115
- data/lib/rubyoverflow/errors.rb +0 -17
- data/lib/rubyoverflow/pagedBase.rb +0 -27
- data/lib/rubyoverflow/pagedDash.rb +0 -7
- data/lib/rubyoverflow/postTimelineEvent.rb +0 -93
- data/lib/rubyoverflow/postTimelineEvents.rb +0 -39
- data/lib/rubyoverflow/question.rb +0 -110
- data/lib/rubyoverflow/repChange.rb +0 -34
- data/lib/rubyoverflow/repChanges.rb +0 -41
- data/lib/rubyoverflow/revision.rb +0 -62
- data/lib/rubyoverflow/revisions.rb +0 -52
- data/lib/rubyoverflow/statistics.rb +0 -57
- data/lib/rubyoverflow/styling.rb +0 -19
- data/lib/rubyoverflow/tag.rb +0 -27
- data/lib/rubyoverflow/tags.rb +0 -46
- data/lib/rubyoverflow/user.rb +0 -181
- data/lib/rubyoverflow/userTimelineEvent.rb +0 -43
- data/lib/rubyoverflow/userTimelineEvents.rb +0 -35
- data/test/apiKey.rb +0 -5
- data/test/helper.rb +0 -159
- data/test/test_answer.rb +0 -20
- data/test/test_answers.rb +0 -32
- data/test/test_badge.rb +0 -18
- data/test/test_badges.rb +0 -30
- data/test/test_base.rb +0 -63
- data/test/test_statistics.rb +0 -26
- data/test/test_user.rb +0 -56
- data/test/test_users.rb +0 -37
data/.rvmrc
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
4
|
+
# development environment upon cd'ing into the directory
|
5
|
+
|
6
|
+
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
|
7
|
+
environment_id="ruby-1.9.2-p290@rubyoverflow"
|
8
|
+
|
9
|
+
#
|
10
|
+
# Uncomment following line if you want options to be set only for given project.
|
11
|
+
#
|
12
|
+
# PROJECT_JRUBY_OPTS=( --1.9 )
|
13
|
+
|
14
|
+
#
|
15
|
+
# First we attempt to load the desired environment directly from the environment
|
16
|
+
# file. This is very fast and efficient compared to running through the entire
|
17
|
+
# CLI and selector. If you want feedback on which environment was used then
|
18
|
+
# insert the word 'use' after --create as this triggers verbose mode.
|
19
|
+
#
|
20
|
+
if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
|
21
|
+
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
|
22
|
+
then
|
23
|
+
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
24
|
+
|
25
|
+
if [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]]
|
26
|
+
then
|
27
|
+
. "${rvm_path:-$HOME/.rvm}/hooks/after_use"
|
28
|
+
fi
|
29
|
+
else
|
30
|
+
# If the environment file has not yet been created, use the RVM CLI to select.
|
31
|
+
if ! rvm --create use "$environment_id"
|
32
|
+
then
|
33
|
+
echo "Failed to create RVM environment '${environment_id}'."
|
34
|
+
exit 1
|
35
|
+
fi
|
36
|
+
fi
|
37
|
+
|
38
|
+
#
|
39
|
+
# If you use an RVM gemset file to install a list of gems (*.gems), you can have
|
40
|
+
# it be automatically loaded. Uncomment the following and adjust the filename if
|
41
|
+
# necessary.
|
42
|
+
#
|
43
|
+
# filename=".gems"
|
44
|
+
# if [[ -s "$filename" ]] ; then
|
45
|
+
# rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
|
46
|
+
# fi
|
47
|
+
|
data/Gemfile
ADDED
data/LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -2,33 +2,27 @@
|
|
2
2
|
|
3
3
|
rubyoverflow is a library for querying the Stack Overflow API
|
4
4
|
|
5
|
-
==
|
5
|
+
== Build Status
|
6
|
+
{<img src="https://secure.travis-ci.org/danseaver/rubyoverflow.png" />}[http://travis-ci.org/danseaver/rubyoverflow]
|
7
|
+
|
8
|
+
== Dependency Status
|
9
|
+
{<img src="https://gemnasium.com/danseaver/rubyoverflow.png" alt="Dependency Status Gemnasium" />}[https://gemnasium.com/danseaver/rubyoverflow]
|
6
10
|
|
7
|
-
Rubyoverflow::Client.config do |options|
|
8
|
-
options.host = 'http://api.superuser.com' # optional, defaults to stackoverflow, queries super user
|
9
|
-
options.api_key = 'api_key_here' # optional, sets the api key
|
10
|
-
options.version = '0.8' # optional, defaults to 0.8,sets the api version
|
11
|
-
end
|
12
11
|
|
13
12
|
== Example
|
14
13
|
|
15
14
|
require 'rubyoverflow'
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
thirdTagSet = secondTagSet.get_next_set #gets the third page of tags using the prior parameters
|
22
|
-
puts firstTag.name # => tag's name
|
23
|
-
puts tag.count # => # of questions with tag
|
24
|
-
|
25
|
-
#User Example
|
26
|
-
me = Users.retrieve_by_id(53587).users.first #gets me
|
27
|
-
myquestions = me.get_questions #gets the questions I asked
|
15
|
+
|
16
|
+
c = Rubyoverflow::Client.new
|
17
|
+
result = c.users.fetch(:id => 53587) # By default, this will query StackOverflow.com
|
18
|
+
me = result.users.first # Get the first user out of the results
|
19
|
+
puts me.display_name # => "Dan Seaver"
|
28
20
|
|
29
21
|
|
22
|
+
c = Rubyoverflow::Client.new :host => "http://api.serverfault.com" # Query ServerFault.com
|
23
|
+
|
30
24
|
== Note on Patches/Pull Requests
|
31
|
-
|
25
|
+
|
32
26
|
* Fork the project.
|
33
27
|
* Make your feature addition or bug fix.
|
34
28
|
* Add tests for it. This is important so I don't break it in a
|
@@ -39,5 +33,5 @@ rubyoverflow is a library for querying the Stack Overflow API
|
|
39
33
|
|
40
34
|
== Copyright
|
41
35
|
|
42
|
-
Copyright (c)
|
36
|
+
Copyright (c) 2011 Dan Seaver. See LICENSE for details.
|
43
37
|
|
data/RELEASENOTES
CHANGED
@@ -1,98 +1,2 @@
|
|
1
|
-
[1.0.1]
|
2
|
-
Minor formatting refactorings
|
3
|
-
Setup tests with rspec
|
4
|
-
Updated Client.new to accept an ApiSite
|
5
|
-
Added Styling class
|
6
|
-
Added styling and state to ApiSite (was previously missing)
|
7
|
-
Added change_end_point to Client and Base classes (accessible from any querying class)
|
8
|
-
Removed display_name from Statistics
|
9
|
-
Added site, total_accepted, and view_per_day from Statistics (was previously missing)
|
10
|
-
Added tests for Answer and Answers
|
11
|
-
Added tests for Base and got Base.convert_if_array working correctly
|
12
|
-
Replaced convert_if_array to convert_to_id_list
|
13
|
-
Added User#item_id
|
14
|
-
Added tests for Badge and Badges
|
15
|
-
Completed check_badge_set stub in test/helper
|
16
|
-
Added item_id to badge so that you can pass an array containing badges to a method
|
17
|
-
Updated convert_if_array to append the id of an item if that class defines the item_id method
|
18
|
-
Added protected_date to Question (previously missing)
|
19
|
-
Removed parameters from User#get_badges, as the route doesn't support parameters
|
20
|
-
Update Users.retrieve_by_badge to support a Badge as a parameter
|
21
|
-
Stubbed out test helper methods for checking class sets
|
22
|
-
Completed unit tests for Users and User classes
|
23
|
-
|
24
|
-
|
25
|
-
[1.0.0]
|
26
|
-
Updated PostTimelineEvent to implement new property, question_id
|
27
|
-
Updated get_post to properly handle the post being a question or answer
|
28
|
-
Added get_parent_question to PostTimelineEvent
|
29
|
-
|
30
|
-
[0.9.1]
|
31
|
-
Switched from using Open-URI+GZIP+JSON to HTTParty
|
32
|
-
|
33
|
-
[0.9.0]
|
34
|
-
Updated API_VERSION to match the Stack Exchange API version
|
35
|
-
|
36
|
-
[0.8.4]
|
37
|
-
Added ApiSite and ApiSites as well as ApiSites.retrieve_sites to retrieve all API endpoints known to the Stack Exchange API
|
38
|
-
Added the class method Users.retrieve_associated_accounts and the instance method User.retrieve_associated_accounts, which calls the Users.retrieve_associated_accounts method with the instance's associated_id
|
39
|
-
|
40
|
-
[0.8.3]
|
41
|
-
Added Badge#get_recipients
|
42
|
-
Added Answer#get_comments
|
43
|
-
Added Users.get_moderators
|
44
|
-
Added PostTimelineEvent#get_post, PostTimelineEvent#get_post_comment, and PostTimelineEvent#get_revision
|
45
|
-
Added Question#get_timeline, Question#get_answers, Question#get_comments
|
46
|
-
|
47
|
-
[0.8.2]
|
48
|
-
Added get_next_set to paged results, retrieve the next set using the same parameters that were used to retrieve the initial set
|
49
|
-
Added methods to get answers, questions, favorites, etc from a user that has been retrieved
|
50
|
-
|
51
|
-
[0.8.1]
|
52
|
-
All classes moved into the Rubyoverflow module
|
53
|
-
|
54
|
-
[0.8.0]
|
55
|
-
Added Revision and Revisions, along with revision retrieval methods
|
56
|
-
Added Questions.search which maps to '/search'
|
57
|
-
Added Errors
|
58
|
-
|
59
|
-
[0.6.0]
|
60
|
-
Added RepChange and RepChanges with RepChanges.retrieve_by_user
|
61
|
-
Added UserTimeLineEvent and UserTimeLineEvents with UserTimeLineEvent.retrieve_by_user
|
62
|
-
Added PostTimeLineEvent and PostTimeLineEvents with PostTimeLineEvent.retrieve_by_question
|
63
|
-
|
64
|
-
[0.5.1]
|
65
|
-
Removed @dash member from classes, as it is only used in initialize, shrinking memory usage of classes
|
66
|
-
|
67
1
|
[0.5.0]
|
68
|
-
|
69
|
-
|
70
|
-
[0.4.1]
|
71
|
-
Added Users and retrieve, retrieve_by_id and retrieve_by_badge
|
72
|
-
|
73
|
-
[0.4.0]
|
74
|
-
Added Comment and Answer wrappers
|
75
|
-
Added retrieval methods for comments and answers
|
76
|
-
|
77
|
-
[0.3.2]
|
78
|
-
Update Badges.retrieve_by_user(id) and Tags.retrieve_by_user(id) to accept an array of ids
|
79
|
-
|
80
|
-
[0.3.1]
|
81
|
-
Added Badges.retrieve_by_user(id)
|
82
|
-
Fixed User class (added if to creation of BadgesCount member)
|
83
|
-
|
84
|
-
[0.3.0]
|
85
|
-
Mapped User, Badge, BadgeCount, Badges
|
86
|
-
Added PagedBase and PagedDash to reuse common properties of paged queries
|
87
|
-
Added Badges.retrieve_all, retrieve_all_non_tag_based and retrieve_all_tag_based
|
88
|
-
Refactored Tags to use new PagedBase and PagedDash classes
|
89
|
-
|
90
|
-
[0.2.3]
|
91
|
-
Tags.retrieve_by_user(id,parameters) gets tags that the user has participated in
|
92
|
-
|
93
|
-
[0.2.0-2]
|
94
|
-
Added support for query string, api key, other stack overflow sites
|
95
|
-
Added support for Tag retrieval
|
96
|
-
|
97
|
-
[0.1]
|
98
|
-
Initial Release, retrieves stack overflow statistics
|
2
|
+
Restarting rubyoverflow development, paths /sites and /users (only, no sub-paths) covered
|
data/Rakefile
CHANGED
@@ -1,52 +1,10 @@
|
|
1
|
-
require '
|
2
|
-
require 'rake'
|
3
|
-
require 'rspec'
|
4
|
-
begin
|
5
|
-
require 'jeweler'
|
6
|
-
Jeweler::Tasks.new do |gem|
|
7
|
-
gem.name = "rubyoverflow"
|
8
|
-
gem.summary = %Q{rubyoverflow is a library for querying the Stack Overflow API}
|
9
|
-
gem.description = %Q{rubyoverflow is a library for querying the Stack Overflow API}
|
10
|
-
gem.email = "phasor@phsr.org"
|
11
|
-
gem.homepage = "http://github.com/phsr/rubyoverflow"
|
12
|
-
gem.authors = ["phsr"]
|
13
|
-
gem.add_dependency 'httparty', '>=0'
|
14
|
-
gem.add_dependency 'hashie', '>=0'
|
15
|
-
gem.add_development_dependency "rspec", ">= 0"
|
16
|
-
gem.files.include FileList['lib/**/*.rb', 'bin/*', '[A-Z]*', 'test/**/*'].to_a
|
17
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
18
|
-
end
|
19
|
-
Jeweler::GemcutterTasks.new
|
20
|
-
rescue LoadError
|
21
|
-
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
22
|
-
end
|
23
|
-
|
1
|
+
require 'bundler/gem_tasks'
|
24
2
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
test.pattern = 'test/**/test_*.rb'
|
31
|
-
test.verbose = true
|
32
|
-
end
|
33
|
-
rescue LoadError
|
34
|
-
task :rcov do
|
35
|
-
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
36
|
-
end
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
|
5
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
6
|
+
t.pattern = 'spec/**/*_spec.rb'
|
7
|
+
t.rspec_opts = '--format progress'
|
37
8
|
end
|
38
9
|
|
39
|
-
|
40
|
-
task :default => :test
|
41
|
-
|
42
|
-
task :doc => :rdoc
|
43
|
-
|
44
|
-
require 'rake/rdoctask'
|
45
|
-
Rake::RDocTask.new do |rdoc|
|
46
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
47
|
-
|
48
|
-
rdoc.rdoc_dir = 'rdoc'
|
49
|
-
rdoc.title = "rubyoverflow #{version}"
|
50
|
-
rdoc.rdoc_files.include('README*')
|
51
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
52
|
-
end
|
10
|
+
task :default => :spec
|
data/lib/rubyoverflow.rb
CHANGED
@@ -1,119 +1,67 @@
|
|
1
1
|
path = File.expand_path(File.dirname(__FILE__))
|
2
2
|
$LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path)
|
3
3
|
|
4
|
-
require '
|
5
|
-
require 'zlib'
|
4
|
+
require 'faraday'
|
6
5
|
require 'ostruct'
|
7
|
-
require '
|
6
|
+
require 'zlib'
|
8
7
|
|
8
|
+
require 'hashie'
|
9
|
+
require 'json'
|
9
10
|
require 'rubyoverflow/base'
|
10
|
-
require 'rubyoverflow/
|
11
|
-
require 'rubyoverflow/
|
12
|
-
|
13
|
-
require 'rubyoverflow/apiVersion'
|
14
|
-
require 'rubyoverflow/badge'
|
15
|
-
require 'rubyoverflow/badges'
|
16
|
-
require 'rubyoverflow/comments'
|
17
|
-
require 'rubyoverflow/comment'
|
18
|
-
require 'rubyoverflow/badgeCounts'
|
19
|
-
require 'rubyoverflow/statistics'
|
20
|
-
require 'rubyoverflow/tag'
|
21
|
-
require 'rubyoverflow/tags'
|
22
|
-
require 'rubyoverflow/user'
|
11
|
+
require 'rubyoverflow/sites'
|
12
|
+
require 'rubyoverflow/stats'
|
23
13
|
require 'rubyoverflow/users'
|
24
|
-
|
25
|
-
require 'rubyoverflow/answer'
|
26
14
|
require 'rubyoverflow/answers'
|
27
|
-
|
28
|
-
require 'rubyoverflow/question'
|
29
15
|
require 'rubyoverflow/questions'
|
30
|
-
|
31
|
-
require 'rubyoverflow/repChange'
|
32
|
-
require 'rubyoverflow/repChanges'
|
33
|
-
|
34
|
-
require 'rubyoverflow/userTimelineEvent'
|
35
|
-
require 'rubyoverflow/userTimelineEvents'
|
36
|
-
|
37
|
-
require 'rubyoverflow/postTimelineEvent'
|
38
|
-
require 'rubyoverflow/postTimelineEvents'
|
39
|
-
|
40
|
-
require 'rubyoverflow/revision'
|
41
|
-
require 'rubyoverflow/revisions'
|
42
|
-
|
43
|
-
require 'rubyoverflow/errors'
|
44
|
-
|
45
|
-
require 'rubyoverflow/styling'
|
46
|
-
|
47
|
-
require 'rubyoverflow/apiSite'
|
48
|
-
require 'rubyoverflow/apiSites'
|
16
|
+
require "rubyoverflow/version"
|
49
17
|
|
50
18
|
module Rubyoverflow
|
51
19
|
class Client
|
52
|
-
include HTTParty
|
53
|
-
format :json
|
54
|
-
#Most of this class is borrowed from the Pilha (http://github.com/dlt/pilha) project because a) it works, b) a lot of this code would be the same regardless of implementation
|
55
|
-
# (especially the open => gzip code, query string, and normalize), and c) I'm new to ruby, so I'm going to skip pass some of the more 'boring' stuff and get to the
|
56
|
-
# interesting parts. I plan to re-examine this at a later point
|
57
20
|
HOST = 'http://api.stackoverflow.com'
|
58
21
|
VERSION = '1.1'
|
59
22
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
@host = options.host || HOST
|
66
|
-
@version = options.version || VERSION
|
67
|
-
@api_key = options.api_key if options.api_key
|
23
|
+
Rubyoverflow.constants.select {|c| Class === Rubyoverflow.const_get(c) and Rubyoverflow.const_get(c) < Rubyoverflow::Base}.each do |class_sym|
|
24
|
+
send :attr_reader, class_sym.downcase
|
25
|
+
send "define_method", class_sym.downcase do
|
26
|
+
instance_variable_set("@#{class_sym.downcase}", Rubyoverflow.const_get(class_sym).new(self)) unless instance_variable_get("@#{class_sym.downcase}")
|
27
|
+
instance_variable_get "@#{class_sym.downcase}"
|
68
28
|
end
|
69
|
-
|
70
|
-
|
71
29
|
end
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
end
|
81
|
-
|
82
|
-
def host_path
|
83
|
-
normalize(@host) + normalize(@version)
|
30
|
+
|
31
|
+
attr_accessor :host
|
32
|
+
attr_accessor :api_key
|
33
|
+
|
34
|
+
def initialize(options = {})
|
35
|
+
@host = options[:host] || HOST
|
36
|
+
@version = options[:version] || VERSION
|
37
|
+
@api_key = options[:api_key] if options[:api_key]
|
84
38
|
end
|
85
|
-
|
86
|
-
class << self
|
87
|
-
# this specifically works well, and I don't fully understand it, so I borrowed this from Pilha more than anything else
|
88
|
-
# If you want to explain why I only have to configure this once than forget about it, please do, because this stuff is currently over my head
|
89
|
-
def config &block
|
90
|
-
options = OpenStruct.new
|
91
|
-
yield options if block_given?
|
92
|
-
init_client! Client.new(options)
|
93
|
-
end
|
94
|
-
|
95
|
-
def change_end_point(val = nil)
|
96
|
-
options = OpenStruct.new
|
97
|
-
if val.kind_of? ApiSite
|
98
|
-
options.host = val.api_endpoint
|
99
|
-
end
|
100
39
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
init_client! Client.new(options)
|
40
|
+
def request(path, parameters = {})
|
41
|
+
conn = Faraday.new(:url => host_path) do |builder|
|
42
|
+
builder.request :url_encoded
|
43
|
+
builder.request :json
|
44
|
+
builder.adapter :net_http
|
107
45
|
end
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
@client = client
|
113
|
-
end
|
114
|
-
client
|
46
|
+
parameters[:key] = @api_key unless @api_key.nil? || @api_key.empty?
|
47
|
+
parameters['Accept-Encoding'] = 'gzip'
|
48
|
+
response = conn.get do |req|
|
49
|
+
req.url normalize(path), parameters
|
115
50
|
end
|
116
|
-
|
51
|
+
rep_string = response.body
|
52
|
+
begin
|
53
|
+
gz = Zlib::GzipReader.new(StringIO.new(response.body.to_s))
|
54
|
+
rep_string = gz.read
|
55
|
+
rescue Zlib::GzipFile::Error
|
56
|
+
end
|
57
|
+
return JSON.parse(rep_string), response.env[:url]
|
58
|
+
end
|
59
|
+
|
60
|
+
def host_path
|
61
|
+
"#{normalize(@host)}#{normalize(@version)}"
|
62
|
+
end
|
63
|
+
|
64
|
+
class << self
|
117
65
|
def stackauth_client(api_key = '')
|
118
66
|
options = OpenStruct.new
|
119
67
|
options.host = 'http://stackauth.com/'
|
@@ -123,19 +71,9 @@ module Rubyoverflow
|
|
123
71
|
end
|
124
72
|
|
125
73
|
private
|
74
|
+
|
126
75
|
def normalize(path)
|
127
|
-
path.end_with?('/') ? path : path+ '/'
|
76
|
+
path.end_with?('/') ? path : path + '/'
|
128
77
|
end
|
129
|
-
|
130
|
-
def query_string(parameters)
|
131
|
-
if !parameters.empty?
|
132
|
-
params = parameters.sort_by { |k, v| k.to_s }
|
133
|
-
pairs = params.map { |key, value| "#{key}=#{value}" }
|
134
|
-
|
135
|
-
'?' + pairs.join('&') + "&jsonp"
|
136
|
-
else
|
137
|
-
''
|
138
|
-
end
|
139
|
-
end
|
140
78
|
end
|
141
|
-
end
|
79
|
+
end
|