hellotxt 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
+ doc/
1
2
  pkg/
2
3
  coverage/
@@ -1,3 +1,9 @@
1
+ == 1.0.2 / 2009-03-23
2
+
3
+ * maintenance release
4
+ * update 'user.services' call to reflect current API
5
+ * add support for 'user.latest' API call
6
+
1
7
  == 1.0.1 / 2009-01-03
2
8
 
3
9
  * bugfix release
data/Rakefile CHANGED
@@ -1,38 +1,33 @@
1
- # Look in the tasks/setup.rb file for the various options that can be
2
- # configured in this Rakefile. The .rake files in the tasks directory
3
- # are where the options are used.
4
-
5
1
  begin
6
2
  require 'bones'
7
- Bones.setup
8
3
  rescue LoadError
9
- load 'tasks/setup.rb'
4
+ abort '### Please install the "bones" gem ###'
10
5
  end
11
6
 
12
7
  ensure_in_path 'lib'
13
8
  require 'hellotxt'
14
9
 
15
10
  task :default => 'spec:run'
16
-
17
- PROJ.name = 'hellotxt'
18
- PROJ.authors = ['Kevin Williams']
19
- PROJ.email = ['kevwil@gmail.com']
20
- PROJ.url = 'http://kevwil.github.com/hellotxt'
21
- PROJ.version = ENV['VERSION'] || HelloTxt::VERSION
22
- PROJ.rubyforge.name = 'hellotxt'
23
- PROJ.readme_file = 'README'
24
-
25
- PROJ.gem.need_tar = false
26
-
27
- PROJ.spec.opts << '--color'
28
-
29
- namespace :gem do
30
- desc 'create a gemspec file to support github gems'
31
- task :gemspec => 'gem:prereqs' do
32
- File.open("#{PROJ.name}.gemspec", 'w+') do |f|
33
- f.write PROJ.gem._spec.to_ruby
34
- end
35
- end
36
- end
11
+ task 'gem:release' => 'spec:run'
12
+
13
+ Bones {
14
+ name 'hellotxt'
15
+ authors ['Kevin Williams']
16
+ email ['kevwil@gmail.com']
17
+ url 'http://kevwil.github.com/hellotxt'
18
+ version ENV['VERSION'] || HelloTxt::VERSION
19
+ # rubyforge.name 'hellotxt'
20
+ readme_file 'README'
21
+ ignore_file '.gitignore'
22
+ gem.need_tar false
23
+ depend_on 'bones', :development => true
24
+ depend_on 'rspec', :development => true
25
+ depend_on 'mocha', :development => true
26
+ ruby_opts << '-Ilib' << '-rubygems'
27
+ #spec_opts << '--color'# << '--format html:./spec_out.html'
28
+ #rcov_opts << ['--exclude', 'rcov']
29
+ #rcov_opts << ['--exclude', 'mocha']
30
+ # enable_sudo
31
+ }
37
32
 
38
33
  # EOF
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__))
3
3
  module HelloTxt
4
4
 
5
5
  # :stopdoc:
6
- VERSION = '1.0.1'
6
+ VERSION = '1.0.2'
7
7
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
8
8
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
9
9
  # :startdoc:
@@ -30,7 +30,7 @@ module HelloTxt
30
30
  args.empty? ? PATH : ::File.join(PATH, args.flatten)
31
31
  end
32
32
 
33
- # Utility method used to rquire all files ending in .rb that lie in the
33
+ # Utility method used to require all files ending in .rb that lie in the
34
34
  # directory below this file that has the same name as the filename passed
35
35
  # in. Optionally, a specific _directory_ name can be passed in such that
36
36
  # the _filename_ does not have to be equivalent to the directory.
@@ -38,7 +38,7 @@ module HelloTxt
38
38
  def self.require_all_libs_relative_to( fname, dir = nil )
39
39
  dir ||= ::File.basename(fname, '.*')
40
40
  search_me = ::File.expand_path(
41
- ::File.join(::File.dirname(fname), dir, '*', '*.rb'))
41
+ ::File.join(::File.dirname(fname), dir, '**', '*.rb'))
42
42
 
43
43
  Dir.glob(search_me).sort.each {|rb| require rb}
44
44
  end
@@ -30,12 +30,14 @@ module HelloTxt
30
30
  end
31
31
 
32
32
  # Returns a list of services the user has set up through HelloTxt
33
+ # Optional arguments:
34
+ # group = service group type; either 'inhome', 'friend', 'colleague', 'all'
33
35
  # if successful returns:
34
36
  # {'status' => 'OK', 'services' => [{'id' => 'serviceid', 'name' => 'servicename', 'code' => 'servicecode', 'inhome' => 'checked', 'friend' => 'checked', 'collegue' => 'checked'}, ...]}
35
37
  # if unsuccessful returns:
36
38
  # {'status' => 'FAIL', 'message' => 'message what went wrong'}
37
- def user_services
38
- response = get_response('user.services')
39
+ def user_services(group = 'all')
40
+ response = get_response('user.services', 'group' => group)
39
41
  if response.elements['rsp'].attributes['status'] == 'OK'
40
42
  services = status_ok()
41
43
  services['services'] = []
@@ -76,6 +78,27 @@ module HelloTxt
76
78
  return status_fail(response)
77
79
  end
78
80
  end
81
+
82
+ # Returns a list of 20 status update sent through HelloTxt.
83
+ # if successful returns:
84
+ # {'status' => 'OK', 'messages' => [{'id' => 'messageid', 'title' => 'titletext', 'body' => 'bodytext'}, ...]}
85
+ # if unsuccessful returns:
86
+ # {'status' => 'FAIL', 'message' => 'message what went wrong'}
87
+ def latest
88
+ response = get_response('user.latest')
89
+ if response.elements['rsp'].attributes['status'] == 'OK'
90
+ messages = status_ok()
91
+ messages['messages'] = []
92
+ response.elements.each('rsp/messages/message') do |message|
93
+ messages['messages'].push({'id' => message.attributes['id'],
94
+ 'title' => message.elements['title'].text,
95
+ 'body' => message.elements['body'].text})
96
+ end
97
+ return messages
98
+ else
99
+ return status_fail(response)
100
+ end
101
+ end
79
102
 
80
103
  private
81
104
 
@@ -29,6 +29,7 @@ describe HelloTxt::Client, "with expected results" do
29
29
  init_service_response
30
30
 
31
31
  uri = URI.parse "#{HelloTxt::API_URL}/method/#{@service_type}"
32
+ @params.merge!('group' => 'all')
32
33
 
33
34
  # mock the http call
34
35
  http_resp = mock('response')
@@ -45,6 +46,28 @@ describe HelloTxt::Client, "with expected results" do
45
46
  result['services'].length.should eql(5)
46
47
  result['services'].first['name'].should eql('twitter')
47
48
  end
49
+
50
+ it "should list only jaiku in list of 'friend' services" do
51
+ init_friend_service_response
52
+
53
+ uri = URI.parse "#{HelloTxt::API_URL}/method/#{@service_type}"
54
+ @params.merge!('group' => 'friend')
55
+
56
+ # mock the http call
57
+ http_resp = mock('response')
58
+ http_resp.expects(:body).returns(@response)
59
+ Net::HTTP.expects(:post_form).with(uri, @params).returns(http_resp)
60
+
61
+ # call and verify
62
+ result = @client.user_services('friend')
63
+ result.should_not be_empty
64
+ result['status'].should_not be_nil
65
+ result['status'].should eql('OK')
66
+ result['services'].should_not be_nil
67
+ result['services'].should_not be_empty
68
+ result['services'].length.should eql(1)
69
+ result['services'].first['name'].should eql('jaiku')
70
+ end
48
71
 
49
72
  it "should post a message to the service" do
50
73
  init_ok_response 'user.post'
@@ -65,6 +88,27 @@ describe HelloTxt::Client, "with expected results" do
65
88
  result['status'].should_not be_nil
66
89
  result['status'].should eql('OK')
67
90
  end
91
+
92
+ it "should retrieve user's 20 latest status messages" do
93
+ init_user_latest_response
94
+
95
+ uri = URI.parse "#{HelloTxt::API_URL}/method/#{@service_type}"
96
+
97
+ # mock the http call
98
+ http_resp = mock('response')
99
+ http_resp.expects(:body).returns(@response)
100
+ Net::HTTP.expects(:post_form).with(uri, @params).returns(http_resp)
101
+
102
+ # call and verify
103
+ result = @client.latest
104
+ result.should_not be_empty
105
+ result['status'].should_not be_nil
106
+ result['status'].should eql('OK')
107
+ result['messages'].should_not be_nil
108
+ result['messages'].should_not be_empty
109
+ result['messages'].length.should eql(2)
110
+ result['messages'].first['body'].should eql('this is a test message')
111
+ end
68
112
 
69
113
  end
70
114
 
@@ -96,6 +140,7 @@ describe HelloTxt::Client, "with error messages" do
96
140
  init_fail_response 'user.services'
97
141
 
98
142
  uri = URI.parse "#{HelloTxt::API_URL}/method/#{@service_type}"
143
+ @params.merge!('group' => 'all')
99
144
 
100
145
  # mock the http call
101
146
  http_resp = mock('response')
@@ -130,4 +175,21 @@ describe HelloTxt::Client, "with error messages" do
130
175
  result['message'].should_not be_nil
131
176
  end
132
177
 
178
+ it "should handle a failed user.latest call cleanly" do
179
+ init_fail_response 'user.latest'
180
+
181
+ uri = URI.parse "#{HelloTxt::API_URL}/method/#{@service_type}"
182
+
183
+ # mock the http call
184
+ http_resp = mock('response')
185
+ http_resp.expects(:body).returns(@response)
186
+ Net::HTTP.expects(:post_form).with(uri, @params).returns(http_resp)
187
+
188
+ # call and verify
189
+ result = @client.latest
190
+ result.should_not be_empty
191
+ result['status'].should_not be_nil
192
+ result['status'].should eql('FAIL')
193
+ result['message'].should_not be_nil
194
+ end
133
195
  end
@@ -23,7 +23,7 @@ end
23
23
  def init_service_response
24
24
  @service_type = 'user.services'
25
25
  @response = <<EOXML
26
- <?xml version="1.0"?>
26
+ <?xml version="1.0"?>
27
27
  <rsp status="OK">
28
28
  <services>
29
29
  <service id="tw" name="twitter">
@@ -41,7 +41,7 @@ def init_service_response
41
41
  <service id="jk" name="jaiku">
42
42
  <code>OK38</code>
43
43
  <inhome>checked</inhome>
44
- <friend>unchecked</friend>
44
+ <friend>checked</friend>
45
45
  <collegue>unchecked</collegue>
46
46
  </service>
47
47
  <service id="id" name="identica">
@@ -60,3 +60,39 @@ def init_service_response
60
60
  </rsp>
61
61
  EOXML
62
62
  end
63
+
64
+ def init_friend_service_response
65
+ @service_type = 'user.services'
66
+ @response = <<EOXML
67
+ <?xml version="1.0"?>
68
+ <rsp status="OK">
69
+ <services>
70
+ <service id="jk" name="jaiku">
71
+ <code>OK38</code>
72
+ <inhome>checked</inhome>
73
+ <friend>checked</friend>
74
+ <collegue>unchecked</collegue>
75
+ </service>
76
+ </services>
77
+ </rsp>
78
+ EOXML
79
+ end
80
+
81
+ def init_user_latest_response
82
+ @service_type = 'user.latest'
83
+ @response = <<EOXML
84
+ <?xml version="1.0"?>
85
+ <rsp status="OK">
86
+ <messages>
87
+ <message id="1234">
88
+ <title></title>
89
+ <body>this is a test message</body>
90
+ </message>
91
+ <message id="5678">
92
+ <title></title>
93
+ <body>Desperately trying not to be bored</body>
94
+ </message>
95
+ </messages>
96
+ </rsp>
97
+ EOXML
98
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hellotxt
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Williams
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-03 00:00:00 -07:00
12
+ date: 2009-11-22 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,37 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 2.2.0
23
+ version: 3.1.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.9
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: mocha
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.9.8
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: bones
47
+ type: :development
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 3.1.0
24
54
  version:
25
55
  description: HelloTxt (http://hellotxt.com) is a simple service that makes updating your social networks a snap, and this is it's Ruby library.
26
56
  email:
@@ -31,6 +61,7 @@ extensions: []
31
61
 
32
62
  extra_rdoc_files:
33
63
  - History.txt
64
+ - Manifest.txt
34
65
  - bin/hellotxt
35
66
  files:
36
67
  - .gitignore
@@ -47,21 +78,10 @@ files:
47
78
  - spec/keyloader_spec.rb
48
79
  - spec/spec_helper.rb
49
80
  - spec/spec_responses.rb
50
- - tasks/ann.rake
51
- - tasks/bones.rake
52
- - tasks/gem.rake
53
- - tasks/git.rake
54
- - tasks/manifest.rake
55
- - tasks/notes.rake
56
- - tasks/post_load.rake
57
- - tasks/rdoc.rake
58
- - tasks/rubyforge.rake
59
- - tasks/setup.rb
60
- - tasks/spec.rake
61
- - tasks/svn.rake
62
- - tasks/test.rake
63
81
  has_rdoc: true
64
82
  homepage: http://kevwil.github.com/hellotxt
83
+ licenses: []
84
+
65
85
  post_install_message:
66
86
  rdoc_options:
67
87
  - --main
@@ -83,9 +103,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
103
  requirements: []
84
104
 
85
105
  rubyforge_project: hellotxt
86
- rubygems_version: 1.3.1
106
+ rubygems_version: 1.3.5
87
107
  signing_key:
88
- specification_version: 2
108
+ specification_version: 3
89
109
  summary: HelloTxt (http://hellotxt
90
110
  test_files: []
91
111
 
@@ -1,80 +0,0 @@
1
-
2
- begin
3
- require 'bones/smtp_tls'
4
- rescue LoadError
5
- require 'net/smtp'
6
- end
7
- require 'time'
8
-
9
- namespace :ann do
10
-
11
- # A prerequisites task that all other tasks depend upon
12
- task :prereqs
13
-
14
- file PROJ.ann.file do
15
- ann = PROJ.ann
16
- puts "Generating #{ann.file}"
17
- File.open(ann.file,'w') do |fd|
18
- fd.puts("#{PROJ.name} version #{PROJ.version}")
19
- fd.puts(" by #{Array(PROJ.authors).first}") if PROJ.authors
20
- fd.puts(" #{PROJ.url}") if PROJ.url.valid?
21
- fd.puts(" (the \"#{PROJ.release_name}\" release)") if PROJ.release_name
22
- fd.puts
23
- fd.puts("== DESCRIPTION")
24
- fd.puts
25
- fd.puts(PROJ.description)
26
- fd.puts
27
- fd.puts(PROJ.changes.sub(%r/^.*$/, '== CHANGES'))
28
- fd.puts
29
- ann.paragraphs.each do |p|
30
- fd.puts "== #{p.upcase}"
31
- fd.puts
32
- fd.puts paragraphs_of(PROJ.readme_file, p).join("\n\n")
33
- fd.puts
34
- end
35
- fd.puts ann.text if ann.text
36
- end
37
- end
38
-
39
- desc "Create an announcement file"
40
- task :announcement => ['ann:prereqs', PROJ.ann.file]
41
-
42
- desc "Send an email announcement"
43
- task :email => ['ann:prereqs', PROJ.ann.file] do
44
- ann = PROJ.ann
45
- from = ann.email[:from] || Array(PROJ.authors).first || PROJ.email
46
- to = Array(ann.email[:to])
47
-
48
- ### build a mail header for RFC 822
49
- rfc822msg = "From: #{from}\n"
50
- rfc822msg << "To: #{to.join(',')}\n"
51
- rfc822msg << "Subject: [ANN] #{PROJ.name} #{PROJ.version}"
52
- rfc822msg << " (#{PROJ.release_name})" if PROJ.release_name
53
- rfc822msg << "\n"
54
- rfc822msg << "Date: #{Time.new.rfc822}\n"
55
- rfc822msg << "Message-Id: "
56
- rfc822msg << "<#{"%.8f" % Time.now.to_f}@#{ann.email[:domain]}>\n\n"
57
- rfc822msg << File.read(ann.file)
58
-
59
- params = [:server, :port, :domain, :acct, :passwd, :authtype].map do |key|
60
- ann.email[key]
61
- end
62
-
63
- params[3] = PROJ.email if params[3].nil?
64
-
65
- if params[4].nil?
66
- STDOUT.write "Please enter your e-mail password (#{params[3]}): "
67
- params[4] = STDIN.gets.chomp
68
- end
69
-
70
- ### send email
71
- Net::SMTP.start(*params) {|smtp| smtp.sendmail(rfc822msg, from, to)}
72
- end
73
- end # namespace :ann
74
-
75
- desc 'Alias to ann:announcement'
76
- task :ann => 'ann:announcement'
77
-
78
- CLOBBER << PROJ.ann.file
79
-
80
- # EOF