skyper 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,16 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ skyper (0.1.0)
5
+ rb-appscript (>= 0.3.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ rb-appscript (0.6.1)
11
+
12
+ PLATFORMS
13
+ ruby
14
+
15
+ DEPENDENCIES
16
+ skyper!
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Andriy Dmytrenko
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # Skyper
2
+
3
+ A ruby gem, implementing Skype public API.
4
+ https://developer.skype.com/public-api-reference
5
+
6
+ Currently works only on MacOS X, using AppleScript to connect to Skype.
7
+ Inspired by rb-skypemac.
8
+
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ gem 'skyper'
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install skyper
23
+
24
+ ## Usage
25
+
26
+ TODO: Write usage instructions here
27
+
28
+ ## Contributing
29
+
30
+ 1. Fork it
31
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
32
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
33
+ 4. Push to the branch (`git push origin my-new-feature`)
34
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
data/lib/skyper.rb ADDED
@@ -0,0 +1,8 @@
1
+ $:.unshift File.expand_path('../',__FILE__)
2
+ module Skyper
3
+ autoload :SkypeObject, 'skyper/skype_object'
4
+ autoload :User, 'skyper/user'
5
+ autoload :Chat, 'skyper/chat'
6
+ autoload :Group, 'skyper/group'
7
+ end
8
+ Dir[File.join(File.dirname(__FILE__), 'skyper/**/*.rb')].sort.each { |lib| require lib }
@@ -0,0 +1,50 @@
1
+ module Skyper
2
+ # Represents a Skype call. Developer is responsible for calling Call#hangup at the end of each call, whether it was placed
3
+ # by the caller or is an answered call.
4
+ class Call < SkypeObject
5
+ property_reader :TIMESTAMP => Time, :PARTNER_HANDLE => Skyper::User, :RATE => Integer
6
+ property_reader *%w[PARTNER_DISPNAME TARGET_IDENTITY CONF_ID TYPE STATUS VIDEO_STATUS VIDEO_SEND_STATUS FAILUREREASON SUBJECT
7
+ PSTN_NUMBER DURATION PSTN_STATUS CONF_PARTICIPANTS_COUNT VM_DURATION VM_ALLOWED_DURATION RATE_CURRENCY RATE_PRECISION INPUT OUTPUT CAPTURE_MIC VAA_INPUT_STATUS
8
+ FORWARDED_BY TRANSFER_ACTIVE TRANSFER_STATUS TRANSFERRED_BY TRANSFERRED_TO]
9
+ self.object_name = "CALL"
10
+ class << self
11
+ def active_call_ids
12
+ r = Skype.send_command "SEARCH ACTIVECALLS"
13
+ r.gsub(/CALLS /, "").split(", ")
14
+ end
15
+
16
+ def active_calls
17
+ Call.active_call_ids.map { |id| Call.new id unless id == "COMMAND_PENDING"}
18
+ end
19
+
20
+ def create(*users)
21
+ user_handles = users.map { |u| (u.is_a? User) ? u.handle : u }
22
+ status = Skype.send_command "CALL #{user_handles.join(', ')}"
23
+ if status =~ /CALL (\d+) STATUS/
24
+ call = Call.new($1)
25
+ else
26
+ raise RuntimeError.new("Call failed. Skype returned '#{status}'")
27
+ end
28
+ end
29
+ end
30
+
31
+ # Attempts to hang up a call. <b>Note</b>: If Skype hangs while placing the call, this method could hang indefinitely.
32
+ # <u>Use Skype#Call instead of this method unless you like memory leaks</u>.
33
+ # Raises SkypeError if an error is reported from the Skype API
34
+ def hangup
35
+ self.status = "FINISHED"
36
+ end
37
+
38
+ def send_video(toggle_flag)
39
+ alter("#{bool_to_flag(toggle_flag)}_VIDEO_SEND")
40
+ end
41
+
42
+ def rcv_video(toggle_flag)
43
+ alter("#{bool_to_flag(toggle_flag)}_VIDEO_RECEIVE")
44
+ end
45
+ protected
46
+ def bool_to_flag(bool)
47
+ bool ? "START" : "STOP"
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,42 @@
1
+ module Skyper
2
+ class Chat < SkypeObject
3
+ property_accessor *%w[NAME TIMESTAMP ADDER POSTERS TOPIC TOPICXML ACTIVEMEMBERS FRIENDLYNAME BOOKMARKED MEMBEROBJECTS PASSWORDHINT GUIDELINES
4
+ OPTIONS DESCRIPTION DIALOG_PARTNER ACTIVITY_TIMESTAMP TYPE MYSTATUS MYROLE BLOB APPLICANTS]
5
+ property_reader :RECENTCHATMESSAGES => Array
6
+ property_reader :STATUS, :MEMBERS, :CHATMESSAGES
7
+ self.object_name = "CHAT"
8
+ attr_reader :id
9
+
10
+ class << self
11
+ # create by user_handle
12
+ def create(user_handle)
13
+ r = Skype.send_command "CHAT CREATE #{user_handle}"
14
+ Chat.parse_from r
15
+ end
16
+
17
+ # Returns an array of your Skype recent chats
18
+ def recent_chats
19
+ r = Skype.send_command "SEARCH RECENTCHATS"
20
+ chat_ids = parse_type(r.sub(/^CHATS\s+/, ""), Array)
21
+ chat_ids.map do |id|
22
+ Chat.new(id)
23
+ end
24
+ end
25
+ end
26
+
27
+ # chat message to chat
28
+ def chat_message(message)
29
+ r = Skype.send_command "CHATMESSAGE #{id} #{message}"
30
+ ChatMessage.parse_from(r)
31
+ end
32
+
33
+ def recent_chat_messages
34
+ self.recentchatmessages.map {|id| ChatMessage.new(id)}
35
+ end
36
+
37
+ def set_topic(topic)
38
+ alter('SETTOPIC', topic)
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,7 @@
1
+ module Skyper
2
+ class ChatMessage < Skyper::SkypeObject
3
+ property_accessor :BODY, :FROM_DISPNAME, :TYPE, :STATUS, :LEAVEREASON, :CHATNAME, :IS_EDITABLE, :EDITED_BY, :EDITED_TIMESTAMP, :OPTIONS, :ROLE
4
+ property_reader :TIMESTAMP => Time, :FROM_HANDLE => Skyper::User, :USERS => Array
5
+ self.object_name = "CHATMESSAGE"
6
+ end
7
+ end
@@ -0,0 +1,31 @@
1
+ module Skyper
2
+ class Group < SkypeObject
3
+ #TYPE: {ALL | CUSTOM | HARDWIRED | SHARED_GROUP | PROPOSED_SHARED_GROUP}
4
+ property_reader :TYPE, :CUSTOM_GROUP_ID, :NROFUSERS, :NROFUSERS_ONLINE, :USERS
5
+ property_accessor :DISPLAYNAME
6
+ self.object_name = "GROUP"
7
+
8
+ class << self
9
+ # Returns hash of symols (group types) => Group objects
10
+ def groups
11
+ r = Skype.send_command "SEARCH GROUPS ALL"
12
+ r.gsub!(/^\D+/, "")
13
+ group_ids = r.split /,\s*/
14
+ group_ids.map do |id|
15
+ Group.new(id)
16
+ end
17
+ end
18
+ end
19
+
20
+ # Returns array of skype names of users in this group
21
+ def member_user_names
22
+ r = users
23
+ r && r.sub(/^.*USERS /, "").split(", ") or []
24
+ end
25
+
26
+ # Returns array of Users in this Group
27
+ def user_objects
28
+ member_user_names.map { |h| User.new h }
29
+ end
30
+ end
31
+ end
data/lib/skyper/iam.rb ADDED
@@ -0,0 +1,18 @@
1
+ module Skyper
2
+
3
+ # Singleton for managing Skype user status
4
+ class Iam
5
+ @@STATUSES = [:ONLINE, :OFFLINE, :SKYPEME, :AWAY, :NA, :DND, :INVISIBLE]
6
+
7
+ def Iam.set_user_status(status)
8
+ raise NoMethodError.new("#{status} in #{Iam.to_s}") if not @@STATUSES.index status.upcase.to_sym
9
+ Skype.send_command "SET USERSTATUS #{status}"
10
+ end
11
+
12
+ # Handles all of the user status permutations accepted by Skype otherwise Errors.
13
+ # For example, <i>Iam.away</i> is legal.
14
+ def Iam.method_missing(id)
15
+ Iam.set_user_status(id.id2name)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,26 @@
1
+ module Skyper
2
+ module Mac
3
+ class Connection
4
+ attr_accessor :logger
5
+ attr_reader :options
6
+
7
+ def initialize(options={})
8
+ @options = options
9
+ @logger ||= Logger.new(STDOUT).tap do |logger|
10
+ logger.level = Logger::ERROR
11
+ end
12
+ end
13
+
14
+ # @param[String] command Skype command
15
+ def send_command(command)
16
+ params = {:script_name => options[:script_name].to_s, :command => command}
17
+ logger.debug "#{self.class}##{__method__} params: #{params.inspect}"
18
+ response = Appscript::app('Skype').send_ params
19
+ response.tap do
20
+ logger.debug "#{self.class}##{__method__} response: #{response}"
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ module Skyper
2
+ class Profile < SkypeObject
3
+ property_reader *%w[PSTN_BALANCE PSTN_BALANCE_CURRENCY SMS_VALIDATED_NUMBERS]
4
+ property_accessor *%w[FULLNAME SEX LANGUAGES COUNTRY IPCOUNTRY PROVINCE CITY PHONE_HOME PHONE_OFFICE PHONE_MOBILE HOMEPAGE ABOUT MOOD_TEXT RICH_MOOD_TEXT TIMEZONE
5
+ CALL_APPLY_CF CALL_NOANSWER_TIMEOUT CALL_FORWARD_RULES CALL_SEND_TO_VM]
6
+ property_accessor :BIRTHDAY => Time
7
+ self.object_name = "PROFILE"
8
+ end
9
+ end
@@ -0,0 +1,95 @@
1
+ require 'appscript'
2
+ require 'logger'
3
+ require 'singleton'
4
+ require 'forwardable'
5
+
6
+ module Skyper
7
+
8
+ # Singleton for interfacing with Skype
9
+ class Skype
10
+ include Singleton
11
+ attr_accessor :script_name
12
+ attr_reader :connection
13
+
14
+ def initialize
15
+ @connection = Skyper::Mac::Connection.new
16
+ send_command("PROTOCOL 8")
17
+ end
18
+
19
+ # @param[String] command Skype command
20
+ def send_command(command)
21
+ @connection.send_command(command)
22
+ end
23
+
24
+ def profile
25
+ @profile ||= Profile.new(nil)
26
+ end
27
+
28
+ # Initiates a Skype call
29
+ def call(*users)
30
+ Call.create(*users)
31
+ end
32
+
33
+ # Returns an Array of Call IDs if there is an incoming Skype call otherwise nil
34
+ def incoming_calls
35
+ Call.active_calls
36
+ end
37
+
38
+ # Answers a call given a skype Call ID. Returns an Array of Call objects.
39
+ def answer(call)
40
+ cmd = "ALTER CALL #{call.call_id} ANSWER"
41
+ r = Skype.send_command cmd
42
+ raise RuntimeError("Failed to answer call. Skype returned '#{r}'") unless r == cmd
43
+ end
44
+
45
+ # Returns an Array of Group
46
+ def groups
47
+ @groups ||= Group.groups
48
+ end
49
+
50
+ # Returns Array of all User in a particular Group type. Accepts types as defined by Group.types
51
+ def find_users_of_type(group_type)
52
+ groups.find { |g| g.type == group_type}.users
53
+ end
54
+
55
+ # Returns an array of users online friends as User objects
56
+ def online_friends
57
+ find_users_of_type "ONLINE_FRIENDS"
58
+ end
59
+
60
+ # Array of all User that are friends of the current user
61
+ def all_friends
62
+ find_users_of_type "ALL_FRIENDS"
63
+ end
64
+
65
+ # Array of all User defined as Skype Out users
66
+ def skypeout_friends
67
+ find_users_of_type "SKYPEOUT_FRIENDS"
68
+ end
69
+
70
+ # Array of all User that the user knows
71
+ def all_users
72
+ find_users_of_type "ALL_USERS"
73
+ end
74
+
75
+ # Array of User recently contacted by the user, friends or not
76
+ def recently_contacted_users
77
+ find_users_of_type "RECENTLY_CONTACTED_USERS"
78
+ end
79
+
80
+ # Array of User waiting for authorization
81
+ def users_waiting_for_authorization
82
+ find_users_of_type "USERS_WAITING_MY_AUTHORIZATION"
83
+ end
84
+
85
+ # Array of User blocked
86
+ def blocked_users
87
+ find_users_of_type "USERS_BLOCKED_BY_ME"
88
+ end
89
+ class << self
90
+ extend Forwardable
91
+ def_delegators :instance, *Skyper::Skype.instance_methods(false)
92
+ end
93
+ end
94
+
95
+ end
@@ -0,0 +1,4 @@
1
+ module Skyper
2
+ class SkypeError<StandardError
3
+ end
4
+ end
@@ -0,0 +1,133 @@
1
+ module Skyper
2
+ # Represents skype object with id and properties, such as:
3
+ # USER, PROFILE, CALL, CHATMESSAGE, CHAT, etc.
4
+ # see: https://developer.skype.com/public-api-reference#OBJECTS
5
+ class SkypeObject
6
+ attr_reader :id
7
+
8
+ # @param[Object] id Integer or String
9
+ def initialize(id)
10
+ @id = id
11
+ end
12
+
13
+ # Invokes GET command for a given object, with id and property
14
+ # @param[String] property Property to retreive
15
+ def get_property(property)
16
+ cmd = ["GET", self.class.object_name, id, property].compact.join(" ")
17
+ response = Skyper::Skype.send_command(cmd)
18
+ raise Skyper::SkypeError, response if response =~ /ERROR/
19
+ reply = %r/(#{self.class.object_name})\s+([\S]+)?\s*(#{property})\s+(.*)/.match(response)
20
+ reply && reply[4]
21
+ end
22
+
23
+ # Invokes SET command for a given object with id, property and value
24
+ # @param[String] property Property to be set
25
+ # @param[String] value Property value
26
+ def set_property(property, value)
27
+ cmd = ["SET",self.class.object_name, id, property, value].compact.join(" ")
28
+ Skyper::Skype.send_command(cmd)
29
+ end
30
+
31
+ # Invokes ALTER command for an object
32
+ # @param[String] command Command to be sent
33
+ # @param[String] args (optional) Arguments for a command
34
+ # @example usage:
35
+ # sms = Skyper::SMS.create("+380998887766")
36
+ # sms.body = "Test"
37
+ # sms.alter("SEND")
38
+ def alter(command, args=nil)
39
+ cmd = "#{command} #{args}".strip
40
+ Skyper::Skype.send_command("ALTER #{self.class.object_name} #{id} #{cmd}")
41
+ end
42
+
43
+ def ==(other)
44
+ @id == other.id
45
+ end
46
+
47
+ class << self
48
+
49
+ # Defines Skype object name.
50
+ # see https://developer.skype.com/public-api-reference#OBJECTS
51
+ # @param[String] name Object name, usually in UPCASE
52
+ def object_name=(name)
53
+ @object_name = name
54
+ end
55
+
56
+ # Returns object name, which class represents
57
+ # @return[String] object_name
58
+ def object_name
59
+ @object_name
60
+ end
61
+
62
+ # Defines rw property for an object
63
+ # @param[Symbol,..] props Properties
64
+ def property_accessor(*props)
65
+ property_reader(*props)
66
+ property_writer(*props)
67
+ end
68
+
69
+ # Defines write-only property for an object
70
+ def property_writer(*props)
71
+ opts = extract_options!(props)
72
+ opts.each do |prop,type|
73
+ define_method(:"#{prop.downcase}=") do |value|
74
+ set_property(prop, value)
75
+ end
76
+ end
77
+ end
78
+ # Defines read-only property for an object
79
+ def property_reader(*props)
80
+ opts = extract_options!(props)
81
+ opts.each do |prop,type|
82
+ define_method(prop.downcase) do
83
+ self.class.parse_type get_property(prop), type
84
+ end
85
+ end
86
+ end
87
+
88
+ # Parses object_id from a response and creates a new object with that ID.
89
+ # @param[String] response Response from Skype
90
+ # @example usage:
91
+ # Skyper::SMS.parse_from 'SMS 3025 STATUS COMPOSING'
92
+ # => #<Skyper::SMS:0x007ff24b1194b0 @id=3025>
93
+ def parse_from(response)
94
+ match_data = response.match %r/^#{@object_name} ([^\ ]+)/
95
+ raise SkypeError, "Can not parse response: '#{response}'" unless match_data
96
+ self.new(match_data[1])
97
+ end
98
+
99
+ def parse_type(value, type)
100
+ return value unless value && type
101
+ return type.call(value) if type.is_a? Proc
102
+ case type.to_s
103
+ when "Integer" || "Fixnum"
104
+ value.to_i
105
+ when "Array"
106
+ value.split(/,\s*/)
107
+ when "Time"
108
+ Time.at(value.to_i)
109
+ when "bool"
110
+ value == "TRUE"
111
+ else
112
+ if type.superclass == Skyper::SkypeObject
113
+ type.new(value)
114
+ else
115
+ value
116
+ end
117
+ end
118
+ end
119
+
120
+ protected
121
+ def extract_options!(array)
122
+ opts = if array.last.is_a? Hash
123
+ array.pop
124
+ else
125
+ {}
126
+ end
127
+ opts.merge! Hash[array.zip(Array.new(array.size))]
128
+ end
129
+
130
+ end # class << self
131
+
132
+ end
133
+ end
data/lib/skyper/sms.rb ADDED
@@ -0,0 +1,21 @@
1
+ module Skyper
2
+ class SMS < SkypeObject
3
+ property_accessor *%w[BODY TYPE REPLY_TO_NUMBER TARGET_NUMBERS]
4
+ property_reader *%w[STATUS FAILUREREASON IS_FAILED_UNSEEN PRICE_CURRENCY TARGET_STATUSES]
5
+ property_reader :TIMESTAMP => Time, :PRICE => Integer, :PRICE_PERICISION => Integer
6
+ self.object_name = "SMS"
7
+
8
+ class << self
9
+ # @params [Symbol] type one of following: OUTGOING CONFIRMATION_CODE_REQUEST CONFIRMATION_CODE_SUBMIT
10
+ def create(target, type=:OUTGOING)
11
+ r = Skyper::Skype.send_command("CREATE SMS #{type.to_s.upcase} #{target}") #"SMS 354924 STATUS COMPOSING"
12
+ self.parse_from(r)
13
+ end
14
+ end
15
+
16
+ def send_sms
17
+ alter("SEND")
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ module Skyper
2
+ class User < SkypeObject
3
+ property_reader :IS_VIDEO_CAPABLE => :bool, :IS_VOICEMAIL_CAPABLE => :bool, :IS_CF_ACTIVE => :bool, :HASCALLEQUIPMENT => :bool, :LASTONLINETIMESTAMP => Time
4
+ property_reader *%w[HANDLE FULLNAME BIRTHDAY SEX LANGUAGE COUNTRY PROVINCE CITY PHONE_HOME PHONE_OFFICE PHONE_MOBILE HOMEPAGE ABOUT
5
+ ONLINESTATUS SkypeOut SKYPEME CAN_LEAVE_VM RECEIVEDAUTHREQUEST MOOD_TEXT
6
+ RICH_MOOD_TEXT ALIASES TIMEZONE NROF_AUTHED_BUDDIES]
7
+ property_accessor *%w[BUDDYSTATUS ISBLOCKED ISAUTHORIZED SPEEDDIAL DISPLAYNAME]
8
+ self.object_name = "USER"
9
+
10
+ def chat
11
+ Chat.create id
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ module Skyper
2
+ VERSION = "0.1.0"
3
+ end
data/skyper.gemspec ADDED
@@ -0,0 +1,18 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/skyper/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Andriy Dmytrenko"]
6
+ gem.email = ["refresh.xss@gmail.com"]
7
+ gem.description = %q{Ruby interface to Skype on Mac OS X}
8
+ gem.summary = %q{Ruby interface to Skype on Mac OS X}
9
+ gem.homepage = ""
10
+
11
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
+ gem.files = `git ls-files`.split("\n")
13
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ gem.name = "skyper"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Skyper::VERSION
17
+ gem.add_runtime_dependency 'rb-appscript', '>=0.3.0'
18
+ end
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: skyper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Andriy Dmytrenko
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-05-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rb-appscript
16
+ requirement: &70156233682640 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.3.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70156233682640
25
+ description: Ruby interface to Skype on Mac OS X
26
+ email:
27
+ - refresh.xss@gmail.com
28
+ executables: []
29
+ extensions: []
30
+ extra_rdoc_files: []
31
+ files:
32
+ - .gitignore
33
+ - Gemfile
34
+ - Gemfile.lock
35
+ - LICENSE
36
+ - README.md
37
+ - Rakefile
38
+ - lib/skyper.rb
39
+ - lib/skyper/call.rb
40
+ - lib/skyper/chat.rb
41
+ - lib/skyper/chat_message.rb
42
+ - lib/skyper/group.rb
43
+ - lib/skyper/iam.rb
44
+ - lib/skyper/platform/mac.rb
45
+ - lib/skyper/profile.rb
46
+ - lib/skyper/skype.rb
47
+ - lib/skyper/skype_error.rb
48
+ - lib/skyper/skype_object.rb
49
+ - lib/skyper/sms.rb
50
+ - lib/skyper/user.rb
51
+ - lib/skyper/version.rb
52
+ - skyper.gemspec
53
+ homepage: ''
54
+ licenses: []
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ segments:
66
+ - 0
67
+ hash: -3050657956737270811
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ! '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ segments:
75
+ - 0
76
+ hash: -3050657956737270811
77
+ requirements: []
78
+ rubyforge_project:
79
+ rubygems_version: 1.8.11
80
+ signing_key:
81
+ specification_version: 3
82
+ summary: Ruby interface to Skype on Mac OS X
83
+ test_files: []