rsimpy 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/.document +5 -0
  2. data/.gitignore +7 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +21 -0
  5. data/Rakefile +96 -0
  6. data/VERSION.yml +4 -0
  7. data/bin/simp +68 -0
  8. data/features/links/adding_a_link.feature +47 -0
  9. data/features/links/querying_links.feature +46 -0
  10. data/features/links/steps/link_steps.rb +39 -0
  11. data/features/notes/query_note.feature +27 -0
  12. data/features/notes/remove_note.feature +11 -0
  13. data/features/notes/save_note.feature +36 -0
  14. data/features/notes/steps/note_steps.rb +46 -0
  15. data/features/support/env.rb +22 -0
  16. data/features/tags/merge_tags.feature +13 -0
  17. data/features/tags/querying_tags.feature +19 -0
  18. data/features/tags/remove_tag.feature +11 -0
  19. data/features/tags/rename_tag.feature +12 -0
  20. data/features/tags/split_tag.feature +13 -0
  21. data/features/tags/steps/tag_steps.rb +49 -0
  22. data/lib/base_service.rb +28 -0
  23. data/lib/client.rb +45 -0
  24. data/lib/configuration.rb +21 -0
  25. data/lib/errors/connection_error.rb +6 -0
  26. data/lib/errors/required_field_missing_error.rb +9 -0
  27. data/lib/errors/user_not_provided_error.rb +4 -0
  28. data/lib/links.rb +62 -0
  29. data/lib/parameters.rb +120 -0
  30. data/lib/posting_service.rb +27 -0
  31. data/lib/profile_storage_service.rb +47 -0
  32. data/lib/querying_service.rb +31 -0
  33. data/lib/rsimpy.rb +62 -0
  34. data/lib/user.rb +31 -0
  35. data/rsimpy.gemspec +128 -0
  36. data/test/client_test.rb +40 -0
  37. data/test/configuration_test.rb +27 -0
  38. data/test/deleting_service_test.rb +51 -0
  39. data/test/fixtures/test +5 -0
  40. data/test/fixtures/user_pass +5 -0
  41. data/test/links_test.rb +47 -0
  42. data/test/parameters_test.rb +61 -0
  43. data/test/posting_service_test.rb +45 -0
  44. data/test/profile_storage_service_test.rb +34 -0
  45. data/test/querying_service_test.rb +31 -0
  46. data/test/r_simpy_test.rb +74 -0
  47. data/test/required_field_missing_error_test.rb +11 -0
  48. data/test/responsive.rb +154 -0
  49. data/test/storage_builder.rb +16 -0
  50. data/test/storage_service_mock.rb +16 -0
  51. data/test/test_helper.rb +18 -0
  52. data/test/user_not_provided_error_test.rb +7 -0
  53. data/test/user_test.rb +34 -0
  54. metadata +182 -0
@@ -0,0 +1,27 @@
1
+ require 'base_service'
2
+
3
+ module RSimpy
4
+ MERGE_TAGS = 'MergeTags'
5
+ SPLIT_TAG = 'SplitTag'
6
+ RENAME_TAG = "RenameTag"
7
+ REMOVE_TAG = 'RemoveTag'
8
+ DELETE_LINK = 'DeleteLink'
9
+ SAVE_LINK = 'SaveLink'
10
+ DELETE_NOTE = 'DeleteNote'
11
+ SAVE_NOTE = 'SaveNote'
12
+
13
+ class PostingService < RSimpy::BaseService
14
+ def initialize command, client
15
+ @command = command
16
+ @client = client
17
+ end
18
+
19
+ def execute params
20
+ execute_using :post, params
21
+ end
22
+
23
+ def build_link params
24
+ "/#{@command}.do?" << params.to_querystring
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,47 @@
1
+ module RSimpy
2
+ class ProfileStorageService
3
+ def initialize location=nil
4
+ @location = location || default_location
5
+ end
6
+
7
+ def default_location
8
+ File.expand_path(File.join(['~','.rsimpy']))
9
+ end
10
+
11
+ def stored?
12
+ File.exists? @location
13
+ end
14
+
15
+ def save user
16
+ require 'khayyam'
17
+
18
+ topic = Khayyam::Topic.new "rsimpy"
19
+ topic.regarding "user" do |items|
20
+ login, pass = user.credentials
21
+ items["login"] = login
22
+ items["pass"] = pass
23
+ end
24
+
25
+ output = topic.export
26
+
27
+ file = File.open(@location, 'w+')
28
+ file.write(output)
29
+ file.close
30
+ end
31
+
32
+ def get
33
+ file = File.read(@location)
34
+ data = {}
35
+ require 'khayyam'
36
+ login, pass = nil
37
+
38
+ topic = Khayyam::Topic.import file
39
+ topic.regarding "user" do |items|
40
+ login = items["login"]
41
+ pass = items["pass"]
42
+ end
43
+
44
+ return RSimpy::User.new(login, pass)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,31 @@
1
+ require 'base_service'
2
+
3
+ module RSimpy
4
+ GET_TAGS = "GetTags"
5
+ GET_LINKS = "GetLinks"
6
+ GET_NOTES = "GetNotes"
7
+
8
+ class QueryingService < RSimpy::BaseService
9
+
10
+ def initialize command, client
11
+ @client = client
12
+ @command = command
13
+ end
14
+
15
+ def execute params
16
+ params = RSimpy::Parameters.new unless params
17
+
18
+ reset
19
+ response = @client.get build_link params
20
+
21
+ @success = (response.code == 200)
22
+
23
+ response
24
+ end
25
+
26
+ def build_link params
27
+ params.add(:src, 'rsimpy')
28
+ "/#{@command}.do?" << params.to_querystring
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,62 @@
1
+
2
+ require 'client'
3
+ require 'user'
4
+ require 'parameters'
5
+ require 'configuration'
6
+ require 'profile_storage_service'
7
+ require 'posting_service'
8
+ require 'querying_service'
9
+ require 'links'
10
+ require 'errors/user_not_provided_error'
11
+
12
+ module RSimpy
13
+ def get_links param_hash={}
14
+ user = build_user param_hash
15
+ params = build_params param_hash
16
+
17
+ client = RSimpy::Client.new(user)
18
+ service = RSimpy::QueryingService.new RSimpy::GET_LINKS, client
19
+
20
+ result = service.execute params
21
+ result[:success] = service.success
22
+ result
23
+ end
24
+
25
+ def delete_link param_hash={}
26
+ user = build_user param_hash
27
+
28
+ client = RSimpy::Client.new(user)
29
+ service = RSimpy::PostingService.new RSimpy::DELETE_LINK, client
30
+
31
+ service.execute param_hash[:params]
32
+ end
33
+
34
+ private
35
+ def build_user param_hash
36
+ login = param_hash[:login] if param_hash.has_key? :login
37
+ pass = param_hash[:pass] if param_hash.has_key? :pass
38
+
39
+ if login && pass
40
+ return RSimpy::User.new login, pass
41
+ end
42
+
43
+ build_user_from_configuration param_hash
44
+ end
45
+
46
+ def build_params param_hash
47
+ param_hash[:params] || RSimpy::Parameters.new
48
+ end
49
+
50
+ def build_user_from_configuration param_hash
51
+ storage_service = RSimpy::ProfileStorageService.new(param_hash[:config_file])
52
+ config = RSimpy::Configuration.new storage_service
53
+
54
+ if !config.stored?
55
+ raise RSimpy::UserNotProvidedError "Please configure RSimpy or supply username and password"
56
+ end
57
+
58
+ config.get
59
+ end
60
+ end
61
+
62
+
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+
3
+ # user.rb : Encapsulates Simpy user account information
4
+ #
5
+ # Copyright April 2009, Jamal Hansen. All Rights Reserved.
6
+ #
7
+ # This is free software. Please see the LICENSE files for details.
8
+ module RSimpy
9
+ # The RSimpy::User class encapsulates user information.
10
+ #
11
+ # You can instanciate it with a hash containing login and password
12
+ #
13
+ # For example:
14
+ #
15
+ # user = RSimpy::User.new 'login', 'password'
16
+
17
+ class User
18
+ def initialize login, pass
19
+ @login = login
20
+ @pass = pass
21
+ end
22
+
23
+ def credentials
24
+ [@login, @pass]
25
+ end
26
+
27
+ def valid?
28
+ @login && @pass
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,128 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{rsimpy}
8
+ s.version = "0.1.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jamal Hansen"]
12
+ s.date = %q{2009-12-22}
13
+ s.default_executable = %q{simp}
14
+ s.email = %q{jamal.hansen@gmail.com}
15
+ s.executables = ["simp"]
16
+ s.extra_rdoc_files = [
17
+ "LICENSE",
18
+ "README.rdoc"
19
+ ]
20
+ s.files = [
21
+ ".document",
22
+ ".gitignore",
23
+ "LICENSE",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION.yml",
27
+ "bin/simp",
28
+ "features/links/adding_a_link.feature",
29
+ "features/links/querying_links.feature",
30
+ "features/links/steps/link_steps.rb",
31
+ "features/notes/query_note.feature",
32
+ "features/notes/remove_note.feature",
33
+ "features/notes/save_note.feature",
34
+ "features/notes/steps/note_steps.rb",
35
+ "features/support/env.rb",
36
+ "features/tags/merge_tags.feature",
37
+ "features/tags/querying_tags.feature",
38
+ "features/tags/remove_tag.feature",
39
+ "features/tags/rename_tag.feature",
40
+ "features/tags/split_tag.feature",
41
+ "features/tags/steps/tag_steps.rb",
42
+ "lib/base_service.rb",
43
+ "lib/client.rb",
44
+ "lib/configuration.rb",
45
+ "lib/errors/connection_error.rb",
46
+ "lib/errors/required_field_missing_error.rb",
47
+ "lib/errors/user_not_provided_error.rb",
48
+ "lib/links.rb",
49
+ "lib/parameters.rb",
50
+ "lib/posting_service.rb",
51
+ "lib/profile_storage_service.rb",
52
+ "lib/querying_service.rb",
53
+ "lib/rsimpy.rb",
54
+ "lib/user.rb",
55
+ "rsimpy.gemspec",
56
+ "test/client_test.rb",
57
+ "test/configuration_test.rb",
58
+ "test/deleting_service_test.rb",
59
+ "test/fixtures/test",
60
+ "test/fixtures/user_pass",
61
+ "test/links_test.rb",
62
+ "test/parameters_test.rb",
63
+ "test/posting_service_test.rb",
64
+ "test/profile_storage_service_test.rb",
65
+ "test/querying_service_test.rb",
66
+ "test/r_simpy_test.rb",
67
+ "test/required_field_missing_error_test.rb",
68
+ "test/responsive.rb",
69
+ "test/storage_builder.rb",
70
+ "test/storage_service_mock.rb",
71
+ "test/test_helper.rb",
72
+ "test/user_not_provided_error_test.rb",
73
+ "test/user_test.rb"
74
+ ]
75
+ s.homepage = %q{http://github.com/rubyyot/rsimpy}
76
+ s.rdoc_options = ["--charset=UTF-8"]
77
+ s.require_paths = ["lib"]
78
+ s.rubyforge_project = %q{rsimpy}
79
+ s.rubygems_version = %q{1.3.5}
80
+ s.summary = %q{API Wrapper for simpy.com}
81
+ s.test_files = [
82
+ "test/storage_service_mock.rb",
83
+ "test/parameters_test.rb",
84
+ "test/posting_service_test.rb",
85
+ "test/deleting_service_test.rb",
86
+ "test/test_helper.rb",
87
+ "test/storage_builder.rb",
88
+ "test/user_test.rb",
89
+ "test/links_test.rb",
90
+ "test/responsive.rb",
91
+ "test/client_test.rb",
92
+ "test/configuration_test.rb",
93
+ "test/user_not_provided_error_test.rb",
94
+ "test/required_field_missing_error_test.rb",
95
+ "test/querying_service_test.rb",
96
+ "test/profile_storage_service_test.rb",
97
+ "test/r_simpy_test.rb"
98
+ ]
99
+
100
+ if s.respond_to? :specification_version then
101
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
102
+ s.specification_version = 3
103
+
104
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
105
+ s.add_runtime_dependency(%q<httparty>, [">= 0.4.2"])
106
+ s.add_runtime_dependency(%q<khayyam>, [">= 0.0.1"])
107
+ s.add_development_dependency(%q<cucumber>, [">= 0.3.11"])
108
+ s.add_development_dependency(%q<fakeweb>, [">= 1.2.3"])
109
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
110
+ s.add_development_dependency(%q<technicalpickles-jeweler>, [">= 0"])
111
+ else
112
+ s.add_dependency(%q<httparty>, [">= 0.4.2"])
113
+ s.add_dependency(%q<khayyam>, [">= 0.0.1"])
114
+ s.add_dependency(%q<cucumber>, [">= 0.3.11"])
115
+ s.add_dependency(%q<fakeweb>, [">= 1.2.3"])
116
+ s.add_dependency(%q<shoulda>, [">= 0"])
117
+ s.add_dependency(%q<technicalpickles-jeweler>, [">= 0"])
118
+ end
119
+ else
120
+ s.add_dependency(%q<httparty>, [">= 0.4.2"])
121
+ s.add_dependency(%q<khayyam>, [">= 0.0.1"])
122
+ s.add_dependency(%q<cucumber>, [">= 0.3.11"])
123
+ s.add_dependency(%q<fakeweb>, [">= 1.2.3"])
124
+ s.add_dependency(%q<shoulda>, [">= 0"])
125
+ s.add_dependency(%q<technicalpickles-jeweler>, [">= 0"])
126
+ end
127
+ end
128
+
@@ -0,0 +1,40 @@
1
+ require 'test_helper'
2
+ require 'fakeweb'
3
+ require 'errors/user_not_provided_error'
4
+
5
+
6
+ class ClientTest < Test::Unit::TestCase
7
+ should "get" do
8
+ FakeWeb.allow_net_connect = false
9
+ FakeWeb.register_uri("http://USERNAME:PASSWORD@www.simpy.com:80/simpy/api/rest/GetLinks.do", :string => get_response)
10
+
11
+ response = RSimpy::Client.new(RSimpy::User.new('USERNAME', 'PASSWORD')).get("/GetLinks.do")
12
+
13
+ assert response != nil
14
+ assert_equal Hash, response['links'].class
15
+ end
16
+
17
+ should "throw user not provided if user !valid?" do
18
+ begin
19
+ client = RSimpy::Client.new(InvalidUser.new)
20
+ flunk "should have thrown UserNotProvidedError"
21
+ rescue RSimpy::UserNotProvidedError => e
22
+ assert_equal RSimpy::UserNotProvidedError, e.class
23
+ end
24
+ end
25
+
26
+ should "throw user not provided if user nil" do
27
+ begin
28
+ client = RSimpy::Client.new(nil)
29
+ flunk "should have thrown UserNotProvidedError"
30
+ rescue RSimpy::UserNotProvidedError => e
31
+ assert_equal RSimpy::UserNotProvidedError, e.class
32
+ end
33
+ end
34
+ end
35
+
36
+ class InvalidUser
37
+ def valid?
38
+ false
39
+ end
40
+ end
@@ -0,0 +1,27 @@
1
+ require 'test_helper'
2
+ require 'storage_builder'
3
+ require 'storage_service_mock'
4
+
5
+ class ConfigurationTest < Test::Unit::TestCase
6
+ should "detect stored configuration" do
7
+ config = RSimpy::Configuration.new StorageBuilder.new.with_stored_configuration('foo', 'bar').build
8
+ assert config.stored?
9
+ end
10
+
11
+ should "detect missing configuration" do
12
+ config = RSimpy::Configuration.new StorageBuilder.new.without_stored_configuration.build
13
+ assert !config.stored?
14
+ end
15
+
16
+ should "save user info" do
17
+ storage_service = StorageBuilder.new.without_stored_configuration.build
18
+ config = RSimpy::Configuration.new storage_service
19
+ config.user = RSimpy::User.new('foo', 'bar')
20
+
21
+ assert config.save
22
+ login, pass = storage_service.user.credentials
23
+ assert_equal 'foo', login
24
+ assert_equal 'bar', pass
25
+ end
26
+ end
27
+
@@ -0,0 +1,51 @@
1
+ require 'test_helper'
2
+ require 'cgi'
3
+ require 'errors/required_field_missing_error'
4
+
5
+ class LinkDeletingServiceCanDelete < Test::Unit::TestCase
6
+ context "deleting" do
7
+ setup do
8
+ FakeWeb.clean_registry
9
+ FakeWeb.allow_net_connect = false
10
+
11
+ @client = RSimpy::Client.new(RSimpy::User.new("USERNAME","PASSWORD"))
12
+ @action = "/DeleteLink.do?"
13
+ end
14
+
15
+ should "build basic link" do
16
+ params = RSimpy::Parameters.new(:href => "http://www.example.com")
17
+ link = RSimpy::PostingService.new(RSimpy::DELETE_LINK,
18
+ @client).build_link(params)
19
+ assert(/#{@action}/ =~ link)
20
+ end
21
+
22
+ should "delete" do
23
+ FakeWeb.register_uri(:post, "http://USERNAME:PASSWORD@www.simpy.com:80/simpy/api/rest/DeleteLink.do?href=http%3A%2F%2Fwww.example.com&src=rsimpy", :string => delete_response)
24
+
25
+ service = RSimpy::PostingService.new(RSimpy::DELETE_LINK, @client)
26
+ response = service.execute RSimpy::Parameters.new(:href => "http://www.example.com")
27
+ assert service.success
28
+ assert_equal Hash, response.class
29
+ end
30
+
31
+ should "set src" do
32
+ params = RSimpy::Parameters.new(:href => "http://www.example.com")
33
+ link = RSimpy::PostingService.new(RSimpy::DELETE_LINK, @client).build_link(params)
34
+ assert(/src=rsimpy/ =~ link)
35
+ end
36
+ end
37
+
38
+ context "link deleting service responses" do
39
+ should "have a successful response" do
40
+ FakeWeb.register_uri(:post, "http://USERNAME:PASSWORD@www.simpy.com:80/simpy/api/rest/DeleteLink.do?href=http%3A%2F%2Fexample.com&src=rsimpy", :string => delete_response)
41
+
42
+ client = RSimpy::Client.new(RSimpy::User.new("USERNAME","PASSWORD"))
43
+ service = RSimpy::PostingService.new(RSimpy::DELETE_LINK, client)
44
+
45
+ response = service.execute RSimpy::Parameters.new :href => "http://example.com"
46
+ assert service.success
47
+ assert_equal "0", service.status_code
48
+ assert_equal "Link deleted successfully.", service.status_message
49
+ end
50
+ end
51
+ end