wonderfl 0.1.0 → 0.2.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.
@@ -27,6 +27,12 @@ Create a wonderfl API client using your api_key as follows:
27
27
  client = Wonderfl::Client.new
28
28
  client.api_key = 'your api_key'
29
29
 
30
+ if you want to cache the response from APIs
31
+
32
+ client = Wonderfl::Client.new('your api_key,
33
+ :cache_file => 'cache.db',
34
+ :expire => 60*10)
35
+
30
36
  You can then use that client to retrieve information about user or posted codes as so:
31
37
 
32
38
  client.get_user('user_name') #=> Wonderfl::User
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -2,13 +2,14 @@ $:.unshift(File.dirname(__FILE__) + "/wonderfl/")
2
2
 
3
3
  require 'net/http'
4
4
  require 'time'
5
+ require 'pstore'
5
6
  require 'rubygems'
6
7
  require 'json'
7
8
 
8
9
  Net::HTTP.version_1_2
9
10
 
10
11
  module Wonderfl
11
- VERSION = '0.0.1'
12
+ VERSION = '0.2.0'
12
13
  BASE_URL = 'http://api.wonderfl.net'
13
14
  class BadRequest < StandardError; end
14
15
  class Unauthorized < StandardError; end
@@ -1,14 +1,15 @@
1
- module Wonderfl
2
1
  # The main client object through which the Wonderfl service may be accessed.
2
+ module Wonderfl
3
3
  class Client
4
- # api key
5
4
  attr_accessor :api_key
6
5
 
7
6
  # Requires api key, get yours from your account page
8
7
  # (wonderfl.net/account/api_keys/create)
9
8
  #
10
- def initialize(api_key = nil)
9
+ def initialize(api_key = nil, options = {})
11
10
  @api_key = api_key
11
+ @cache = Wonderfl::Utils::Cache.new(options[:cache_file],
12
+ options[:expire])
12
13
  end
13
14
 
14
15
  # Returns a Wonderfl::User object detailing the user information.
@@ -16,7 +17,14 @@ module Wonderfl
16
17
  def get_user(user_name)
17
18
  _validate?(user_name)
18
19
  path = '/user/' + user_name
19
- User.new(_request(path)[:body]['user'])
20
+ @cache.transaction do
21
+ data = @cache[path]
22
+ if data.nil?
23
+ @cache[path] = User.new(_request(path)[:body]['user'])
24
+ else
25
+ data
26
+ end
27
+ end
20
28
  end
21
29
 
22
30
  # Returns a Wonderfl::UserCodes object (Wonderfl::Code collection)
@@ -25,7 +33,14 @@ module Wonderfl
25
33
  def get_user_codes(user_name)
26
34
  _validate?(user_name)
27
35
  path = '/user/' + user_name + '/codes'
28
- UserCodes.new(_request(path)[:body]['codes'])
36
+ @cache.transaction do
37
+ data = @cache[path]
38
+ if data.nil?
39
+ @cache[path] = UserCodes.new(_request(path)[:body]['codes'])
40
+ else
41
+ data
42
+ end
43
+ end
29
44
  end
30
45
 
31
46
  # Returns a Wonderfl::Code object detailing the code information.
@@ -33,7 +48,14 @@ module Wonderfl
33
48
  def get_code(code_id)
34
49
  _validate?(code_id)
35
50
  path = '/code/' + code_id
36
- Code.new(_request(path)[:body]['code'], code_id)
51
+ @cache.transaction do
52
+ data = @cache[path]
53
+ if data.nil?
54
+ @cache[path] = Code.new(_request(path)[:body]['code'], code_id)
55
+ else
56
+ data
57
+ end
58
+ end
37
59
  end
38
60
 
39
61
  # Returns a Wonderfl::CodeForks object (Wonderfl::Code collection)
@@ -42,10 +64,17 @@ module Wonderfl
42
64
  def get_code_forks(code_id)
43
65
  _validate?(code_id)
44
66
  path = '/code/' + code_id + '/forks'
45
- CodeForks.new(_request(path)[:body]['forks'])
67
+ @cache.transaction do
68
+ data = @cache[path]
69
+ if data.nil?
70
+ @cache[path] = CodeForks.new(_request(path)[:body]['forks'])
71
+ else
72
+ data
73
+ end
74
+ end
46
75
  end
47
76
 
48
- # Sends HTTP request and returns a parsed JSON response
77
+ # Private methods.
49
78
  #
50
79
  private
51
80
  def _request(path)
@@ -70,8 +99,7 @@ module Wonderfl
70
99
  end
71
100
  { :code => response.code, :body => parsed }
72
101
  end
73
- # Returns true, if argument is a String
74
- #
102
+
75
103
  def _validate?(arg)
76
104
  return true if arg.is_a? String
77
105
  method_name = caller.first.scan(/`(.*)'/).to_s
@@ -1,6 +1,5 @@
1
1
  class Wonderfl::Code
2
2
  include Wonderfl::Utils
3
-
4
3
  attr_reader :thumbnail, :as3, :parent, :modified_date, :compile_ok,
5
4
  :created_date, :forked_count, :license, :swf, :diff,
6
5
  :user_icon, :user_name, :title, :id, :favorite_count
@@ -10,4 +10,27 @@ module Wonderfl::Utils
10
10
  def parse_time(date)
11
11
  date ? Time.at(date) : nil
12
12
  end
13
+ # Caches response data from APIs
14
+ #
15
+ class Cache < PStore
16
+ def initialize(filename, expire)
17
+ @filename = filename || 'wonderfl_cache.db'
18
+ @expire = expire || 0
19
+ super(@filename)
20
+ end
21
+
22
+ def [](key)
23
+ value = super(key) || {}
24
+ expired = (value[:timestamp].nil? ||
25
+ value[:timestamp] + @expire < Time.now)
26
+ expired ? nil : value[:entity]
27
+ end
28
+
29
+ def []=(key, value)
30
+ super(key, {
31
+ :entity => value,
32
+ :timestamp => Time.now
33
+ })
34
+ end
35
+ end
13
36
  end
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
4
+
5
+ require 'wonderfl'
6
+
7
+ begin
8
+ client = Wonderfl::Client.new('588b655bbd16a987675d0b574078659e55e6119c',
9
+ # :cache_file => 'a.db',
10
+ :expire => 10)
11
+ #client = Wonderfl::Client.new
12
+ #client.api_key = '588b655bbd16a987675d0b574078659e55e6119c'
13
+ p client
14
+
15
+ puts "*** get_user ***\n"
16
+ user = client.get_user('nondelion')
17
+ puts user
18
+
19
+ puts "*** get_user_codes ***\n"
20
+ codes = client.get_user_codes('mari')
21
+ puts "codes count: " + codes.count.to_s
22
+ codes.each do |code|
23
+ puts code
24
+ end
25
+
26
+ puts "*** get_code ***\n"
27
+ code = client.get_code('4v7t')
28
+ puts code
29
+
30
+
31
+ puts "*** get_code_forks ***\n"
32
+ forks = client.get_code_forks('4v7t')
33
+ puts "forks count: " + forks.count.to_s
34
+ forks.each do |code|
35
+ puts code
36
+ end
37
+
38
+
39
+ rescue Wonderfl::Unauthorized => e
40
+ puts 'Authentication Error: ' + e
41
+
42
+ rescue Wonderfl::NotFound => e
43
+ puts 'NotFound Error: '+ e
44
+
45
+ rescue Wonderfl::BadRequest => e
46
+ puts 'BadRequest Error: ' + e
47
+ end
48
+
49
+ include Wonderfl::Utils
50
+ #puts dump('/user/mari/codes', '588b655bbd16a987675d0b574078659e55e6119c')
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/spec_helper.rb'
2
2
 
3
3
  describe Wonderfl::Client do
4
4
  before do
5
- @client = Wonderfl::Client.new
5
+ @client = Wonderfl::Client.new(nil, :expire => 0)
6
6
  @user_name = 'wellflat'
7
7
  @api_key = 'foo'
8
8
  @stub = WebMock.stub_request(:get, /http:\/\/api\.wonderfl\.net\/.*/)
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{wonderfl}
8
- s.version = "0.1.0"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["wellflat"]
12
- s.date = %q{2010-08-16}
12
+ s.date = %q{2010-09-04}
13
13
  s.description = %q{Ruby wrapper for the wonderfl API. See README for more details.}
14
14
  s.email = %q{wellflat@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -46,6 +46,7 @@ Gem::Specification.new do |s|
46
46
  s.summary = %q{Ruby wrapper for the wonderfl API}
47
47
  s.test_files = [
48
48
  "spec/spec_helper.rb",
49
+ "spec/test_client.rb",
49
50
  "spec/wonderfl_spec.rb"
50
51
  ]
51
52
 
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
7
+ - 2
8
8
  - 0
9
- version: 0.1.0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - wellflat
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-08-16 00:00:00 +09:00
17
+ date: 2010-09-04 00:00:00 +09:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -122,4 +122,5 @@ specification_version: 3
122
122
  summary: Ruby wrapper for the wonderfl API
123
123
  test_files:
124
124
  - spec/spec_helper.rb
125
+ - spec/test_client.rb
125
126
  - spec/wonderfl_spec.rb