storify 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 054fc92b925bfaa5fe6f12055fb3edad0fc9edcf
4
- data.tar.gz: 6c797051ce7a0808ee903c1df1ba6589c2789581
3
+ metadata.gz: 1079798438c428ba6b4ef587746d20cfa36ab175
4
+ data.tar.gz: ad39c541755df5151b1af5c24724709466590657
5
5
  SHA512:
6
- metadata.gz: 305a38acf3661181cc9ef7884d4b4a38f6fdd44b16a76835f5f1fe838ccb85d08138795191c08111be064512b69777d871bb695c3079ee9929347f752634db51
7
- data.tar.gz: 0f16afc75eb29e7b1cf3f9e01e76b676d79393d67c47dd4d5d5db80a732b65017a8f8687e981d7cc3c9f8cb58ac4c8932ce96e3de8b6c9700eab4c54810690e9
6
+ metadata.gz: b9d4855d72e86d8415f82e2efeed524c6ee36500fe4fa1b92bd905332e67887fcf70dd5c43d76e36a6be0a0d45cdd64be7e23202563b34fdfc2113c5e3966350
7
+ data.tar.gz: a651172d7c64799ebc0f950ed471439fb3030f06f68037e283fda0a168f3a98f45027b4c760eb995839aab87e1c274442ebcb7988a0c63b62779ac08b4c90da6
@@ -3,7 +3,7 @@ require 'rest-client'
3
3
  #RestClient.log = './restclient.log'
4
4
 
5
5
  class Storify::Client
6
- attr_reader :api_key, :username, :token, :raw
6
+ attr_reader :api_key, :username, :token
7
7
 
8
8
  def initialize(api_key, username)
9
9
  @api_key = api_key
@@ -18,29 +18,62 @@ class Storify::Client
18
18
  self
19
19
  end
20
20
 
21
- def stories(slug: nil, world: false)
22
- # filter from general to specific
23
- endpoint = Storify::stories if world
24
- endpoint = Storify::userstories(@username) unless world
25
- endpoint = Storify::story(@username, slug) unless slug.nil?
26
- call(endpoint, :GET)
21
+ def userstories(username = @username)
22
+ endpoint = Storify::userstories(username)
23
+ pager = add_pagination
24
+ stories = []
27
25
 
28
- self
26
+ while data = call(endpoint, :GET, pager)
27
+ content = data['content']
28
+ break if content['stories'].length == 0
29
+
30
+ content['stories'].each do |s|
31
+ stories << Storify::Story.new(s)
32
+ end
33
+
34
+ pager[:page] += 1
35
+ end
36
+
37
+ stories
38
+ end
39
+
40
+ def story(slug, username = @username)
41
+ endpoint = Storify::story(username, slug)
42
+ pager = add_pagination
43
+ story = nil
44
+ elements = []
45
+
46
+ while data = call(endpoint, :GET, pager)
47
+ story = Storify::Story.new(data['content']) if story.nil?
48
+ break if data['content']['elements'].length == 0
49
+
50
+ # create elements
51
+ data['content']['elements'].each do |e|
52
+ story.add_element(Storify::Element.new(e))
53
+ end
54
+
55
+ pager[:page] += 1
56
+ end
57
+
58
+ story
29
59
  end
30
60
 
31
61
  def authenticated
32
62
  !@token.nil?
33
63
  end
34
64
 
35
- def deserialize
36
- JSON.parse(@raw)
65
+ def add_pagination(page = 1, per_page = 20)
66
+ params = {}
67
+ params[:page] = page
68
+ params[:per_page] = per_page
69
+ params
37
70
  end
38
71
 
39
72
 
40
- private
41
-
73
+ private
74
+
42
75
  def call(endpoint, verb, params = {}, opts = {})
43
- @raw = nil
76
+ raw = nil
44
77
 
45
78
  begin
46
79
  # inject auth params automatically (if available)
@@ -50,18 +83,18 @@ class Storify::Client
50
83
 
51
84
  case verb
52
85
  when :POST
53
- @raw = RestClient.post endpoint, params, {:accept => :json}
54
- else
55
- @raw = RestClient.get endpoint, {:params => params}
86
+ raw = RestClient.post endpoint, params, {:accept => :json}
87
+ when :GET
88
+ raw = RestClient.get endpoint, {:params => params}
56
89
  end
57
90
  rescue => e
58
- @raw = e.response
91
+ raw = e.response
59
92
 
60
93
  data = JSON.parse(e.response)
61
94
  error = data['error']
62
95
  raise Storify::ApiError.new(data['code'], error['message'], error['type'])
63
96
  end
64
97
 
65
- deserialize
98
+ JSON.parse(raw)
66
99
  end
67
100
  end
@@ -0,0 +1,52 @@
1
+ require 'date'
2
+ require 'nokogiri'
3
+
4
+ # todo: split logic into separate source types
5
+ class Storify::Element
6
+ attr_reader :type, :source, :link, :published, :author
7
+ attr_accessor :desc
8
+
9
+ def initialize(content)
10
+ @type = content['type']
11
+ @source = content['source']['name']
12
+ @link = content['permalink']
13
+ @published = DateTime.parse(content['posted_at'])
14
+
15
+ case @type
16
+ when 'image'
17
+ @desc = content['data'][@type]['caption']
18
+
19
+ if content['data'].has_key?('oembed')
20
+ @author = content['data']['oembed']['author_name']
21
+ else
22
+ @author = content['attribution']['name']
23
+ end
24
+ when 'text'
25
+ @desc = content['data']['text']
26
+
27
+ doc = Nokogiri::HTML(@desc)
28
+ @desc = doc.xpath("//text()").to_s
29
+ else
30
+ @desc = content['data'][@type]['description']
31
+ @author = content['source']['username']
32
+ @author = "@" + @author if @source.downcase == 'twitter'
33
+ end
34
+ end
35
+
36
+ def to_s
37
+ out = ''
38
+
39
+ case @source.downcase
40
+ when 'storify'
41
+ out << "\n#{@desc}\n"
42
+ out << ('-' * @desc.length) + "\n\n" if @desc.length < 50
43
+ when 'twitter'
44
+ out << "[#{@published.to_date.to_s}] #{@author}: #{@link}\n"
45
+ else
46
+
47
+ out << "#{@author} [#{@published.to_date.to_s}]: #{@link}\n"
48
+ end
49
+
50
+ out
51
+ end
52
+ end
@@ -0,0 +1,39 @@
1
+ require 'date'
2
+
3
+ class Storify::Story
4
+ attr_reader :slug, :title, :desc, :link, :published, :author, :elements
5
+
6
+ def initialize(content)
7
+ @slug = content['slug']
8
+ @title = content['title']
9
+ @desc = content['description']
10
+ @link = content['permalink']
11
+ @author = content['author']['username']
12
+
13
+ unless content['date']['published'].nil?
14
+ @published = DateTime.parse(content['date']['published'])
15
+ end
16
+
17
+ @elements = []
18
+ end
19
+
20
+ def add_element(element)
21
+ @elements << element
22
+ end
23
+
24
+ def to_s
25
+ published = @published.nil? ? 'unpublished' : @published.to_date.to_s
26
+
27
+ out = "\n#{@title}\n"
28
+ out << ('-' * @title.length.to_i) + "\n"
29
+ out << "Date: #{published}\n"
30
+ out << "Author: #{@author}\n"
31
+ out << "Link: #{@link}\n"
32
+ out << "\n#{@desc} \n"
33
+
34
+ # serialize elements
35
+ elements.each {|e| out << e.to_s }
36
+
37
+ out
38
+ end
39
+ end
data/lib/storify.rb CHANGED
@@ -26,5 +26,7 @@ module Storify
26
26
  end
27
27
  end
28
28
 
29
+ require 'storify/story'
29
30
  require 'storify/client'
31
+ require 'storify/element'
30
32
  require 'storify/apierror'
data/spec/client_spec.rb CHANGED
@@ -4,12 +4,22 @@ describe Storify::Client do
4
4
  before(:all) do
5
5
  @client = Storify::Client.new(@api_key, @username)
6
6
  @client.auth(get_password)
7
+
8
+ puts "Enter a Story Id for your Account:"
9
+ @story = STDIN.gets.chomp
7
10
  end
8
11
 
9
- it "should get the first page of a users stories" do
10
- @client.stories(:world => false).deserialize.should_not be_nil
12
+ it "should get all stories for a specific user" do
13
+ @client.userstories(@username).length.should == 2
11
14
  end
12
15
 
13
- it "should get a specific "
16
+ it "should get a specific story for a user (all pages)" do
17
+ @client.story(@story).elements.length.should == 3
18
+ end
14
19
 
20
+ it "should allow a story to be serialized as text" do
21
+ story = @client.story('austin-startup-digest-for-december-9-2014', 'joshuabaer')
22
+ story.should_not eql ""
23
+ puts story.to_s
24
+ end
15
25
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: storify
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rizwan Tejpar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-09 00:00:00.000000000 Z
11
+ date: 2013-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.7.7
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.7.7
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rest-client
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -25,19 +39,19 @@ dependencies:
25
39
  - !ruby/object:Gem::Version
26
40
  version: 1.6.7
27
41
  - !ruby/object:Gem::Dependency
28
- name: json
42
+ name: nokogiri
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - '>='
32
46
  - !ruby/object:Gem::Version
33
- version: 1.7.7
47
+ version: 1.6.0
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - '>='
39
53
  - !ruby/object:Gem::Version
40
- version: 1.7.7
54
+ version: 1.6.0
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rspec
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +66,20 @@ dependencies:
52
66
  - - '>='
53
67
  - !ruby/object:Gem::Version
54
68
  version: 2.14.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: io-console
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: 0.4.2
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: 0.4.2
55
83
  description: Ruby Wrapper of Storify REST API -- work-in-progress
56
84
  email: rtejpar@gmail.com
57
85
  executables: []
@@ -60,6 +88,8 @@ extra_rdoc_files: []
60
88
  files:
61
89
  - lib/storify/apierror.rb
62
90
  - lib/storify/client.rb
91
+ - lib/storify/element.rb
92
+ - lib/storify/story.rb
63
93
  - lib/storify.rb
64
94
  - spec/client_auth_spec.rb
65
95
  - spec/client_spec.rb