From 9f2f9648acc7c733838a6215221e56a8cc5fdcae Mon Sep 17 00:00:00 2001 From: stve Date: Tue, 10 Feb 2015 00:03:47 -0500 Subject: [PATCH] update folder implementation --- lib/instapaper/api/folder.rb | 11 +++++++---- lib/instapaper/api/utils.rb | 1 + lib/instapaper/folder.rb | 6 ++++++ spec/instapaper/api/folder_spec.rb | 24 +++++++++--------------- 4 files changed, 23 insertions(+), 19 deletions(-) create mode 100644 lib/instapaper/folder.rb diff --git a/lib/instapaper/api/folder.rb b/lib/instapaper/api/folder.rb index eedb645..1a28e9c 100644 --- a/lib/instapaper/api/folder.rb +++ b/lib/instapaper/api/folder.rb @@ -1,3 +1,5 @@ +require 'instapaper/folder' + module Instapaper module API # Defines methods related to folders @@ -5,19 +7,20 @@ module Instapaper # List the account's user-created folders. # @note This only includes organizational folders and does not include RSS-feed folders or starred-subscription folders def folders - post('/api/1/folders/list') + perform_post_with_objects('/api/1/folders/list', {}, Instapaper::Folder) end # Creates an organizational folder. # @param title [String] The title of the folder to create def add_folder(title) - post('/api/1/folders/add', title: title) + perform_post_with_object('/api/1/folders/add', {title: title}, Instapaper::Folder) end # Deletes the folder and moves any articles in it to the Archive. # @param folder_id [String] The id of the folder. def delete_folder(folder_id) - post('/api/1/folders/delete', folder_id: folder_id) + perform_post_with_empty_response('/api/1/folders/delete', folder_id: folder_id) + true end # Re-orders a user's folders. @@ -25,7 +28,7 @@ module Instapaper # @example Ordering folder_ids 100, 200, and 300 # Instapaper.set_order(['100:1','200:2','300:3']) def set_order(order = []) # rubocop:disable Style/AccessorMethodName - post('/api/1/folders/set_order', order: order.join(',')) + perform_post_with_objects('/api/1/folders/set_order', {order: order.join(',')}, Instapaper::Folder) end end end diff --git a/lib/instapaper/api/utils.rb b/lib/instapaper/api/utils.rb index e8211c8..dd98933 100644 --- a/lib/instapaper/api/utils.rb +++ b/lib/instapaper/api/utils.rb @@ -33,6 +33,7 @@ module Instapaper # @param klass [Class] def perform_request_with_object(request_method, path, options, klass) response = perform_request(request_method, path, options) + response = response.is_a?(Array) ? response.first : response klass.with(response) end diff --git a/lib/instapaper/folder.rb b/lib/instapaper/folder.rb new file mode 100644 index 0000000..c554375 --- /dev/null +++ b/lib/instapaper/folder.rb @@ -0,0 +1,6 @@ +require 'values' + +module Instapaper + class Folder < Value.new(:type, :folder_id, :title, :sync_to_mobile, :position) + end +end diff --git a/spec/instapaper/api/folder_spec.rb b/spec/instapaper/api/folder_spec.rb index 90af538..eb5166c 100644 --- a/spec/instapaper/api/folder_spec.rb +++ b/spec/instapaper/api/folder_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe Instapaper::Client::Folder do let(:client) { Instapaper::Client.new(consumer_key: 'CK', consumer_secret: 'CS', oauth_token: 'OT', oauth_token_secret: 'OS') } - describe '.folders' do + describe '#folders' do before do stub_post('/api/1/folders/list') .to_return(body: fixture('folders_list.json'), headers: {content_type: 'application/json; charset=utf-8'}) @@ -19,12 +19,11 @@ describe Instapaper::Client::Folder do folders = client.folders expect(folders).to be_an Array expect(folders.size).to eq(2) - expect(folders.first).to be_a Hashie::Rash - expect(folders.first['title']).to eq('Ruby') + expect(folders.first).to be_a Instapaper::Folder end end - describe '.add_folder' do + describe '#add_folder' do before do stub_post('/api/1/folders/add').with(body: {title: 'Ruby'}) .to_return(body: fixture('folders_add.json'), headers: {content_type: 'application/json; charset=utf-8'}) @@ -37,15 +36,12 @@ describe Instapaper::Client::Folder do end it 'should return an array containing the new folder on success' do - folders = client.add_folder('Ruby') - expect(folders).to be_an Array - expect(folders).not_to be_empty - expect(folders.first).to be_a Hashie::Rash - expect(folders.first['title']).to eq('Ruby') + folder = client.add_folder('Ruby') + expect(folder).to be_a Instapaper::Folder end end - describe '.delete_folder' do + describe '#delete_folder' do before do stub_post('/api/1/folders/delete'). with(body: {folder_id: '1'}) .to_return(body: fixture('folders_delete.json'), headers: {content_type: 'application/json; charset=utf-8'}) @@ -59,12 +55,11 @@ describe Instapaper::Client::Folder do it 'should return an empty array on success' do confirm = client.delete_folder('1') - expect(confirm).to be_an Array - expect(confirm).to be_empty + expect(confirm).to be true end end - describe '.set_order' do + describe '#set_order' do before do stub_post('/api/1/folders/set_order'). with(body: {order: '1121173:2,1121174:1'}) .to_return(body: fixture('folders_set_order.json'), headers: {content_type: 'application/json; charset=utf-8'}) @@ -79,8 +74,7 @@ describe Instapaper::Client::Folder do it 'should return an array reflecting the new order on success' do folders = client.set_order(['1121173:2', '1121174:1']) expect(folders).to be_an Array - expect(folders.first).to be_a Hashie::Rash - expect(folders.first['position']).to eq(1) + expect(folders.first).to be_a Instapaper::Folder end end end