hellotxt 1.0.1 → 1.0.2

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.
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