vk 0.0.2 → 0.0.3

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.
@@ -0,0 +1,4 @@
1
+ --title 'Vk gem — vk.com API wrapper'
2
+ lib/**/*.rb
3
+ -
4
+ README.markdown
@@ -2,6 +2,12 @@
2
2
 
3
3
  Vk is a wrapper for vk.com API
4
4
 
5
+ * [Documentation](http://rubydoc.info/gems/vk)
6
+ * [Source](http://github.com/alsemyonov/vk)
7
+ * [Issues](http://github.com/alsemyonov/vk/issues)
8
+ * [Wiki](http://github.com/alsemyonov/vk/wiki)
9
+ * [Documentation for unreleased gem version](http://rubydoc.info/github/alsemyonov/vk)
10
+
5
11
  ## Installation
6
12
 
7
13
  $ gem install vk
@@ -32,7 +38,7 @@ View methods list at {Vk::DSL}.
32
38
 
33
39
  ### Usage with object oriented DSL
34
40
 
35
- Currently implemented classes: {Vk::User}, {Vk::City}, {Vk::Country}.
41
+ Currently implemented classes: {Vk::User}, {Vk::City}, {Vk::Country}, {Vk::Post}.
36
42
 
37
43
  user = Vk::User.find 12345
38
44
  user # #<Vk::User:12345 @attributes={first_name: 'Ivan', last_name: 'Ivanov', uid: 12345}>
@@ -43,6 +49,7 @@ Currently implemented classes: {Vk::User}, {Vk::City}, {Vk::Country}.
43
49
  user.country # #<Vk::Country:1 @attributes={name: 'Russia', cid: 1}>
44
50
  user.friends # [#<Vk::User:1 @attributes={first_name: "Pavel", last_name: "Durov", uid: 1}>, ...]
45
51
  user.friends.first.city # #<Vk::City:1 @attributes={name: 'Moscow', cid: 1}>
52
+ user.posts.first # #<Vk::Post:1_123 @attributes={text: 'Preved!11'}>
46
53
 
47
54
  ## License
48
55
 
data/lib/vk.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'active_support/core_ext/object/try'
2
+
1
3
  module Vk
2
4
  extend self
3
5
 
@@ -8,16 +10,28 @@ module Vk
8
10
  autoload :User, 'vk/user'
9
11
  autoload :City, 'vk/city'
10
12
  autoload :Country, 'vk/country'
13
+ autoload :Post, 'vk/post'
11
14
 
12
15
  class << self
13
- attr_accessor :app_id, :app_secret
16
+ attr_accessor :app_id, :app_secret, :logger
14
17
  end
15
18
 
19
+ # Request to vk.com API
20
+ # @return [Vk::Request] Request object
16
21
  def request
17
22
  @request ||= Request.new
18
23
  end
19
24
 
25
+ def log(text, severity = :debug)
26
+ Vk.logger.try(severity, text)
27
+ end
28
+
20
29
  def dsl!
21
30
  Request.dsl!
22
31
  end
32
+
33
+ def log!
34
+ require 'logger'
35
+ self.logger = Logger.new STDOUT
36
+ end
23
37
  end
@@ -3,11 +3,14 @@ require 'vk'
3
3
  require 'active_support/core_ext/class/attribute'
4
4
  require 'active_support/core_ext/array/extract_options'
5
5
  require 'active_support/hash_with_indifferent_access'
6
+ require 'active_support/memoizable'
6
7
 
7
8
  module Vk
8
9
  dsl! # require DSL methods in Vk::Request
9
10
 
10
11
  class Base
12
+ extend ActiveSupport::Memoizable
13
+
11
14
  class_attribute :identity_map, :loader, :key_field, :fields
12
15
  self.loader = Vk.request
13
16
 
@@ -26,6 +29,7 @@ module Vk
26
29
  end
27
30
  end
28
31
  end
32
+ alias [] find
29
33
 
30
34
  def method_missing(method, *args)
31
35
  if identity_map.respond_to?(method)
@@ -59,7 +63,7 @@ module Vk
59
63
  end
60
64
 
61
65
  def id
62
- @attributes[key_field]
66
+ @attributes[key_field].to_i
63
67
  end
64
68
 
65
69
  def read_attribute(name)
@@ -71,7 +75,9 @@ module Vk
71
75
 
72
76
  def method_missing(method, *args)
73
77
  if @attributes.key?(method)
74
- @attributes[method.to_s]
78
+ @attributes[method]
79
+ elsif self.class.fields.include?(name.to_sym)
80
+ read_attribute(name)
75
81
  else
76
82
  super
77
83
  end
@@ -80,7 +80,16 @@ module Vk
80
80
  # @option options [:owner, :others, :all] :filter (:all) what kind of statuses to request
81
81
  # @return [Array<Fixnum, *Hash>] count of statuses and each status in hash
82
82
  def get_wall(uid, options = {})
83
+ options[:filter] ||= :all
83
84
  request('wall.get', options.merge(owner_id: uid))
84
85
  end
86
+
87
+ def get_wall_statuses(posts)
88
+ request('wall.getById', posts: posts)
89
+ end
90
+
91
+ def get_wall_status(id)
92
+ get_wall_statuses(id)[0]
93
+ end
85
94
  end
86
95
  end
@@ -0,0 +1,86 @@
1
+ require 'vk/base'
2
+
3
+ module Vk
4
+ class Post < Base
5
+ autoload :Wall, 'vk/post/wall'
6
+
7
+ self.key_field = :post_id
8
+ self.fields = [:id, :from_id, :to_id, :date, :text, :attachment, :comments, :likes, :copy_owner_id, :copy_post_id]
9
+
10
+ class << self
11
+ def find(*ids)
12
+ options = ids.extract_options!
13
+ if ids.count == 1
14
+ id = ids.first
15
+ identity_map[id] ||= new(id, options)
16
+ else
17
+ loaded_ids = ids & identity_map.keys
18
+ ids_to_load = ids - loaded_ids
19
+ identity_map.values_at(*loaded_ids).tap do |result|
20
+ if ids_to_load.any?
21
+ result << loader.get_wall_statuses(ids_to_load).map do |post|
22
+ new(id_for(post), data: post)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def id_for(post)
30
+ "#{post['to_id']}_#{post['id']}"
31
+ end
32
+ end
33
+
34
+ def id
35
+ @attributes[key_field]
36
+ end
37
+
38
+ def post_id
39
+ "#{to_id}_#{id}"
40
+ end
41
+ memoize :post_id
42
+
43
+ def to
44
+ Vk::User.find(read_attribute(:to_id))
45
+ end
46
+ memoize :to
47
+
48
+ def from
49
+ Vk::User.find(read_attribute(:from_id))
50
+ end
51
+ memoize :from
52
+
53
+ def date
54
+ Time.at(read_attribute(:date))
55
+ end
56
+ memoize :date
57
+
58
+ def copy_owner
59
+ Vk::User.find(read_attribute(:copy_owner_id))
60
+ end
61
+ memoize :copy_owner
62
+
63
+ def copy_post
64
+ Vk::Post.find(read_attribute(:copy_owner_id))
65
+ end
66
+ memoize :copy_post
67
+
68
+ def comments_count
69
+ read_attribute(:comments)['count']
70
+ end
71
+
72
+ def likes_count
73
+ read_attribute(:likes)['count']
74
+ end
75
+
76
+ def to_s
77
+ text
78
+ end
79
+
80
+ protected
81
+
82
+ def load_data(options = {})
83
+ @attributes = @attributes.merge(loader.get_wall_status(id))
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,67 @@
1
+ require 'vk/post'
2
+
3
+ require 'delegate'
4
+
5
+ module Vk
6
+ class Post
7
+ class Wall
8
+ extend ActiveSupport::Memoizable
9
+
10
+ attr_accessor :uid, :count, :posts
11
+
12
+ def initialize(uid, count, posts)
13
+ self.uid, self.count, self.posts = uid, count, posts
14
+ end
15
+
16
+ def user
17
+ Vk::User.find(uid)
18
+ end
19
+ memoize :user
20
+
21
+ def [](index)
22
+ raise "Post #{index} is not exist" if index > count + 1
23
+ load_posts_to(index) if index >= loaded_posts
24
+ if post = posts[index]
25
+ Vk::Post.find(Vk::Post.id_for(post), data: post)
26
+ end
27
+ end
28
+
29
+ def first; self[0]; end
30
+
31
+ def each(&block)
32
+ load_all_posts
33
+ 0.upto(count) do |index|
34
+ block.call(self[index])
35
+ end
36
+ end
37
+
38
+ def method_missing(method, *args)
39
+ if posts.respond_to?(method)
40
+ posts.send(method, *args)
41
+ else
42
+ super
43
+ end
44
+ end
45
+
46
+ protected
47
+
48
+ def load_post(index)
49
+ count, *new_posts = Vk::Base.loader.get_wall(uid, offset: loaded_posts, count: index - loaded_posts + 1)
50
+ self.posts += new_posts
51
+ posts[index]
52
+ end
53
+
54
+ def load_posts_to(count)
55
+ load_post(loaded_posts + 100) while loaded_posts < count
56
+ end
57
+
58
+ def load_all_posts
59
+ load_posts_to(count)
60
+ end
61
+
62
+ def loaded_posts
63
+ posts.size
64
+ end
65
+ end
66
+ end
67
+ end
@@ -42,10 +42,11 @@ module Vk
42
42
  method: method_name,
43
43
  v: VERSION
44
44
  )
45
+ Vk.log(data)
45
46
  url = URI.parse("#{SCHEME}://#{HOST}:#{PORT}#{PATH}?#{data.to_query}&sig=#{signature(data)}")
46
47
  http_response = Net::HTTP.get_response(url).body
47
48
  json_response = JSON.parse(http_response)
48
- puts(json_response)
49
+ Vk.log(json_response)
49
50
  json_response['response']
50
51
  end
51
52
 
@@ -11,7 +11,7 @@ module Vk
11
11
  ids_to_load = ids - loaded_ids
12
12
  identity_map.values_at(*loaded_ids).tap do |results|
13
13
  if ids_to_load.any?
14
- results << loader.get_profiles(ids - loaded_ids, options).map do |profile|
14
+ results += loader.get_profiles(ids_to_load, options).map do |profile|
15
15
  new(profile['uid'], data: profile)
16
16
  end
17
17
  end
@@ -19,9 +19,12 @@ module Vk
19
19
  end
20
20
  end
21
21
 
22
+ attr_accessor :posts_count
23
+
22
24
  def name
23
25
  "#{first_name} #{last_name}"
24
26
  end
27
+ memoize :name
25
28
 
26
29
  def city_id
27
30
  read_attribute(:city)
@@ -30,6 +33,7 @@ module Vk
30
33
  def city
31
34
  Vk::City.find(city_id)
32
35
  end
36
+ memoize :city
33
37
 
34
38
  def country_id
35
39
  read_attribute(:country)
@@ -38,20 +42,35 @@ module Vk
38
42
  def country
39
43
  Vk::Country.find(country_id)
40
44
  end
45
+ memoize :country
41
46
 
42
47
  def friend_ids
43
- @friend_ids ||= loader.get_friends(uid)
48
+ loader.get_friends(uid)
44
49
  end
50
+ memoize :friend_ids
45
51
 
46
52
  def friends(options = {})
47
- @friends ||= User.find_all(friend_ids, options)
53
+ User.find_all(friend_ids, options)
48
54
  end
55
+ memoize :friends
49
56
 
50
57
  def to_s
51
58
  name
52
59
  end
53
60
 
61
+ def wall(options = {})
62
+ count, *posts = loader.get_wall(id, options)
63
+ Vk::Post::Wall.new(id, count, posts)
64
+ end
65
+ memoize :wall
66
+ alias posts wall
67
+
68
+ def posts_count
69
+ wall.count
70
+ end
71
+
54
72
  protected
73
+
55
74
  def load_data(options = {})
56
75
  @attributes = @attributes.merge(loader.get_profile(id, options))
57
76
  end
@@ -1,3 +1,3 @@
1
1
  module Vk
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 2
9
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Alexander Semyonov
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-05-03 00:00:00 +06:00
17
+ date: 2011-05-05 00:00:00 +06:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -87,6 +87,7 @@ extra_rdoc_files: []
87
87
 
88
88
  files:
89
89
  - .gitignore
90
+ - .yardopts
90
91
  - Gemfile
91
92
  - README.markdown
92
93
  - Rakefile
@@ -95,6 +96,8 @@ files:
95
96
  - lib/vk/city.rb
96
97
  - lib/vk/country.rb
97
98
  - lib/vk/dsl.rb
99
+ - lib/vk/post.rb
100
+ - lib/vk/post/wall.rb
98
101
  - lib/vk/request.rb
99
102
  - lib/vk/user.rb
100
103
  - lib/vk/version.rb