springnote_resources 0.2.1 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,16 @@
1
+ == 0.4
2
+ * ActiveResourceExtension added.
3
+ * query pages with multiple identifiers.
4
+ * CommonParameters added. Now you can configure domain.
5
+ with CommonParametersExtension.
6
+ * Attachment has source method.
7
+
8
+ == 0.3 / 2007-12-10
9
+ * Page get search, with_tags methods.
10
+ * protocol can be changed.
11
+ * Attachment resource added
12
+ * PageImport added
13
+
1
14
  == 0.2.1 / 2007-8-6
2
15
  * tiny naming fix for rubygems
3
16
 
data/Manifest.txt CHANGED
@@ -1,13 +1,19 @@
1
1
  History.txt
2
2
  Manifest.txt
3
3
  README.txt
4
+ README.korean.txt
4
5
  Rakefile
5
6
  Todo.txt
7
+ init.rb
6
8
  lib/springnote_resources.rb
9
+ lib/springnote/attachment.rb
7
10
  lib/springnote/base.rb
8
11
  lib/springnote/configuration.rb
9
12
  lib/springnote/lock.rb
10
13
  lib/springnote/page.rb
14
+ lib/springnote/page_import.rb
11
15
  lib/springnote/revision.rb
16
+ lib/exts/active_resource_extension.rb
17
+ lib/exts/common_parameters.rb
12
18
  spec/base_spec.rb
13
- spec/configuration_spec.rb
19
+ spec/configuration_spec.rb
data/README.korean.txt ADDED
@@ -0,0 +1,75 @@
1
+ = Springnote Resources
2
+
3
+ * 홈페이지: http://myruby.net/pages/391111
4
+ * 제작자: deepblue (http://myruby.net), Changshin Lee (http://www.iasandcb.pe.kr)
5
+
6
+ == 설명:
7
+
8
+ 스프링노트는 REST API를 제공하며, 레일스 프로젝트의 일부인 REST 클라이언트 '액티브리소스(ActiveResource)'를 통해
9
+ 매우 쉽게 접근할 수 있다. 이를 활용하면, 자신의 데이터베이스에서 ORM인 액티브레코드를 이용해 데이터를 읽고 쓰는 것처럼, 액티브리소스를
10
+ 이용해 스프링노트에 있는 데이터를 쉽게 다룰 수 있다.
11
+
12
+ == 요구사항:
13
+
14
+ * activesupport
15
+ * activeresource
16
+
17
+ == 설치:
18
+
19
+ * sudo gem install springnote_resources
20
+
21
+ == 개발자키와 사용자키 발급 및 설정:
22
+
23
+ 1. 스프링노트 매시업을 작성하기 위해서는 먼저 개발자키가 필요하다. 이 키는 오픈마루 API 센터에서 발급받을 수 있다.
24
+ 자세한 내용은 http://dev.springnote.com/pages/372760 에서 얻을 수 있다.
25
+
26
+ 2. 그리고 해당 개발자키에 대한 스프링노트 사용자키를 발급받아야 한다. 이 키 또한 API 센터에서 얻을 수 있다.
27
+ 자세한 내용은 http://dev.springnote.com/pages/372761에서 얻을 수 있다.
28
+
29
+ 3. 이렇게 받은 키를 스프링노트 리소스에서 사용하려면 아래처럼 설정한다.
30
+
31
+ Springnote::Base.configuration.set :app_key => '__개발자키__',
32
+ :user_openid => 'http://user-open-id-url/',
33
+ :user_key => '__사용자키__'
34
+
35
+ == 사용법:
36
+
37
+ # 페이지 불러오기
38
+ page = Springnote::Page.find(144)
39
+ puts page.source
40
+
41
+ # 페이지 수정하기
42
+ page = Springnote::Page.find(144)
43
+ page.source = '<p>New Contents</p>'
44
+ page.save
45
+
46
+ # 페이지 만들기
47
+ page = Springnote::Page.create :title => 'NewName', :source => 'NewContents'
48
+
49
+ # 페이지 지우기
50
+ Springnote::Page.find(144).destroy
51
+
52
+ == LICENSE:
53
+
54
+ (The MIT License)
55
+
56
+ Copyright (c) 2007 Bryan Kang and Changshin Lee
57
+
58
+ Permission is hereby granted, free of charge, to any person obtaining
59
+ a copy of this software and associated documentation files (the
60
+ "Software"), to deal in the Software without restriction, including
61
+ without limitation the rights to use, copy, modify, merge, publish,
62
+ distribute, sublicense, and/or sell copies of the Software, and to
63
+ permit persons to whom the Software is furnished to do so, subject to
64
+ the following conditions:
65
+
66
+ The above copyright notice and this permission notice shall be
67
+ included in all copies or substantial portions of the Software.
68
+
69
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
70
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
71
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
72
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
73
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
74
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
75
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  = Springnote Resources
2
2
 
3
- * Homepage: http://deepblue.springnote.com/pages/391111
4
- * Author: Bryan Kang (http://myruby.net)
3
+ * Homepage: http://myruby.net/pages/391111
4
+ * Author: Bryan Kang (http://myruby.net), Changshin Lee (http://www.iasandcb.pe.kr)
5
5
 
6
6
  == DESCRIPTIONS:
7
7
 
@@ -16,11 +16,44 @@ ActiveResource wrapper library for Springnote.com's REST API
16
16
 
17
17
  * sudo gem install springnote_resources
18
18
 
19
+ == How to get keys
20
+
21
+ 1. You need to register your application on Openmaru API Center and
22
+ get the application key. Read http://dev.springnote.com/pages/438963
23
+ for more details.
24
+
25
+ 2. Now you need to get the user key for the application you registered.
26
+ Read http://dev.springnote.com/pages/438944 for more details.
27
+
28
+ 3. You have user OpenID, user key, and application key. Configure SpringnoteResources
29
+ with the information like following code:
30
+
31
+ Springnote::Base.configuration.set :app_key => '__ApplicationKey_Here__',
32
+ :user_openid => 'http://user-open-id-url/',
33
+ :user_key => '__UserKey_Here__'
34
+
35
+ == USAGE:
36
+
37
+ # Load a page
38
+ page = Springnote::Page.find(144)
39
+ puts page.source
40
+
41
+ # Update the page
42
+ page = Springnote::Page.find(144)
43
+ page.source = '<p>New Contents</p>'
44
+ page.save
45
+
46
+ # Create a new page
47
+ page = Springnote::Page.create :title => 'NewName', :source => 'NewContents'
48
+
49
+ # Destroy the page
50
+ Springnote::Page.find(144).destroy
51
+
19
52
  == LICENSE:
20
53
 
21
54
  (The MIT License)
22
55
 
23
- Copyright (c) 2007 Bryan Kang
56
+ Copyright (c) 2007 Bryan Kang and Changshin Lee
24
57
 
25
58
  Permission is hereby granted, free of charge, to any person obtaining
26
59
  a copy of this software and associated documentation files (the
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'springnote_resources'
@@ -0,0 +1,25 @@
1
+ module ActiveResourceExtension
2
+ def find(*args)
3
+ if multiple_query?(args)
4
+ return super(:all, :params => { :identifiers => args.join(','), :detail => true })
5
+ end
6
+
7
+ scope = args.slice!(0)
8
+ options = convert_options(args.slice!(0) || {})
9
+ super(scope, options)
10
+
11
+ # empty elements result causes error in typecast_xml_value because of xmlns of springnote
12
+ rescue RuntimeError
13
+ []
14
+ end
15
+
16
+ protected
17
+ def multiple_query?(args)
18
+ args.size > 1 && args[0].respond_to?(:to_int) && args[1].respond_to?(:to_int)
19
+ end
20
+
21
+ def convert_options(args)
22
+ return args if args.empty? || args.include?(:from) || args.include?(:params)
23
+ {:params => args}
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ module CommonParameters
2
+ def self.included(mod)
3
+ mod.alias_method_chain :request, :commons
4
+ mod.send :cattr_accessor, :common_params
5
+ mod.common_params = {}
6
+ end
7
+
8
+ def request_with_commons(method, path, *arguments)
9
+ unless common_params.empty?
10
+ path += path.include?('?') ? '&' : '?'
11
+ path += common_params.to_query
12
+ end
13
+ request_without_commons(method, path, *arguments)
14
+ end
15
+
16
+ def common_params
17
+ self.class.common_params
18
+ end
19
+ end
20
+
21
+ ActiveResource::Connection.send :include, CommonParameters
@@ -0,0 +1,13 @@
1
+ module Springnote
2
+ class Attachment < Base
3
+ set_prefix '/pages/:relation_is_part_of/'
4
+
5
+ def source
6
+ http = Net::HTTP.new(Springnote::Configuration::SERVER_URL, 80)
7
+ req = Net::HTTP::Get.new(element_path[0..-5])
8
+ req.basic_auth(Springnote::Base.site.user, Springnote::Base.site.password)
9
+ response = http.request(req)
10
+ response.body
11
+ end
12
+ end
13
+ end # module Springnote
@@ -1,7 +1,9 @@
1
1
  module Springnote
2
- VERSION = "0.2.1"
2
+ VERSION = "0.4"
3
3
 
4
4
  class Base < ActiveResource::Base
5
+ extend ActiveResourceExtension
6
+
5
7
  set_primary_key 'identifier'
6
8
 
7
9
  def id
@@ -5,17 +5,20 @@ module Springnote
5
5
 
6
6
  class Configuration
7
7
  attr_writer :app_key, :user_key, :user_openid
8
+ attr_reader :domain
9
+
10
+ SERVER_PROTOCOL = 'https'
8
11
  SERVER_URL = "api.springnote.com"
9
12
 
10
13
  def site
11
- "https://#{username}:#{password}@#{SERVER_URL}/"
14
+ "#{SERVER_PROTOCOL}://#{username}:#{password}@#{SERVER_URL}/"
12
15
  end
13
16
 
14
17
  def load(file)
15
18
  set YAML.load(File.read(file))
16
19
  end
17
20
 
18
- def set(options)
21
+ def set(options = {})
19
22
  options.each{|k,v| self.send("#{k}=", v)}
20
23
  Springnote::Base.site = self.site
21
24
  self
@@ -32,5 +35,9 @@ module Springnote
32
35
  def app_key
33
36
  @app_key or raise MissingConfiguration
34
37
  end
38
+
39
+ def domain=(name = nil)
40
+ ActiveResource::Connection.common_params[:_domain] = name
41
+ end
35
42
  end
36
43
  end # module Springnote
@@ -1,5 +1,5 @@
1
1
  module Springnote
2
2
  class Lock < Base
3
- set_prefix '/pages/:page_id/'
3
+ set_prefix '/pages/:relation_is_part_of/'
4
4
  end
5
- end
5
+ end # module Springnote
@@ -1,7 +1,17 @@
1
- module Springnote
2
- class Page < Base
3
- def lock
4
- Lock.find(:page_id => self.id)
5
- end
1
+ class Springnote::Page < Springnote::Base
2
+ def self.with_tags(tags, params = {})
3
+ find(:all, :params => prarams.reverse_merge(:tags => tags))
4
+ end
5
+
6
+ def self.search(query, params = {})
7
+ find(:all, :params => params.reverse_merge(:q => query))
8
+ end
9
+
10
+ def lock
11
+ @lock ||= Lock.find(:relation_is_part_of => self.id)
12
+ end
13
+
14
+ def attachments
15
+ @attachments ||= Attachment.find(:all, :params => {:relation_is_part_of => self.id})
6
16
  end
7
17
  end
@@ -0,0 +1,59 @@
1
+ module Springnote::PageImport
2
+ BOUNDARY = 'AaB03x'
3
+
4
+ module ClassMethod
5
+ def import_file(path)
6
+ new.import_file(path)
7
+ end
8
+ end
9
+
10
+ def import_file(path)
11
+ body = File.open(path) do |f|
12
+ create_query_multipart_str({:Filedata => f}, BOUNDARY)
13
+ end
14
+ headers = self.class.headers.merge 'Content-Transfer-Encoding' => 'binary',
15
+ 'Content-Length' => body.length.to_s,
16
+ 'Content-Type' => "multipart/form-data; boundary=#{BOUNDARY}"
17
+
18
+ returning connection.post(collection_path, body, headers) do |response|
19
+ self.id = id_from_response(response)
20
+ load_attributes_from_response(response)
21
+ end
22
+ self
23
+ end
24
+
25
+ def self.included(base)
26
+ base.extend(ClassMethod)
27
+ end
28
+
29
+
30
+ protected
31
+ # COPY from ruby/facets 1.8.54
32
+ def create_query_multipart_str(query, boundary)
33
+ query.collect { |attr, value|
34
+ value ||= ''
35
+ if value.is_a? File
36
+ params = {
37
+ 'filename' => value.path,
38
+ # Creation time is not available from File::Stat
39
+ # 'creation-date' => value.ctime.rfc822,
40
+ 'modification-date' => value.mtime.rfc822,
41
+ 'read-date' => value.atime.rfc822,
42
+ }
43
+ param_str = params.to_a.collect { |k, v|
44
+ "#{k}=\"#{v}\""
45
+ }.join("; ")
46
+ "--#{boundary}\r\n" +
47
+ %{Content-Disposition: form-data; name="#{attr.to_s}"; #{param_str}\r\n} +
48
+ "Content-Transfer-Encoding: binary\r\n" +
49
+ "Content-Type: application/octet-stream\r\n\r\n#{value.read}\r\n"
50
+ else
51
+ "--#{boundary}\r\n" +
52
+ %{Content-Disposition: form-data; name="#{attr.to_s}"\r\n} +
53
+ "\r\n#{value.to_s}\r\n"
54
+ end
55
+ }.join('') + "--#{boundary}--\r\n"
56
+ end
57
+ end
58
+
59
+ Springnote::Page.send :include, Springnote::PageImport
@@ -1,5 +1,5 @@
1
1
  module Springnote
2
2
  class Revision < Base
3
- set_prefix '/pages/:page_id/'
3
+ set_prefix '/pages/:relation_is_part_of/'
4
4
  end
5
- end
5
+ end # module Springnote
@@ -7,12 +7,19 @@ unless defined?(ActiveResource)
7
7
  require 'active_resource'
8
8
  rescue LoadError
9
9
  require 'rubygems'
10
- gem 'activeresource'
10
+ require 'activeresource'
11
11
  end
12
12
  end
13
13
 
14
+ # extend activeresource
15
+ require 'exts/common_parameters'
16
+ require 'exts/active_resource_extension'
17
+
18
+ # Springnote's resources
14
19
  require 'springnote/configuration'
15
20
  require 'springnote/base'
16
21
  require 'springnote/page'
22
+ require 'springnote/attachment'
17
23
  require 'springnote/lock'
18
24
  require 'springnote/revision'
25
+
metadata CHANGED
@@ -1,70 +1,84 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
3
- specification_version: 1
4
2
  name: springnote_resources
5
3
  version: !ruby/object:Gem::Version
6
- version: 0.2.1
7
- date: 2007-08-06 00:00:00 +09:00
8
- summary: ActiveResource wrapper library for Springnote.com's REST API
9
- require_paths:
10
- - lib
11
- email: byblue@gmail.com
12
- homepage: http://deepblue.springnote.com/pages/391111
13
- rubyforge_project: springnote
14
- description: "== DESCRIPTIONS: ActiveResource wrapper library for Springnote.com's REST API == REQUIREMENTS: * activesupport * activeresource"
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: "0.4"
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
7
  - Bryan Kang
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-01-17 00:00:00 +09:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.4.0
23
+ version:
24
+ description: "== DESCRIPTIONS: ActiveResource wrapper library for Springnote.com's REST API == REQUIREMENTS: * activesupport * activeresource"
25
+ email: byblue@gmail.com
26
+ executables: []
27
+
28
+ extensions: []
29
+
30
+ extra_rdoc_files:
31
+ - History.txt
32
+ - Manifest.txt
33
+ - README.txt
34
+ - README.korean.txt
35
+ - Todo.txt
31
36
  files:
32
37
  - History.txt
33
38
  - Manifest.txt
34
39
  - README.txt
40
+ - README.korean.txt
35
41
  - Rakefile
36
42
  - Todo.txt
43
+ - init.rb
37
44
  - lib/springnote_resources.rb
45
+ - lib/springnote/attachment.rb
38
46
  - lib/springnote/base.rb
39
47
  - lib/springnote/configuration.rb
40
48
  - lib/springnote/lock.rb
41
49
  - lib/springnote/page.rb
50
+ - lib/springnote/page_import.rb
42
51
  - lib/springnote/revision.rb
52
+ - lib/exts/active_resource_extension.rb
53
+ - lib/exts/common_parameters.rb
43
54
  - spec/base_spec.rb
44
55
  - spec/configuration_spec.rb
45
- test_files: []
46
-
56
+ has_rdoc: true
57
+ homepage: http://myruby.net/pages/391111
58
+ post_install_message:
47
59
  rdoc_options:
48
60
  - --main
49
61
  - README.txt
50
- extra_rdoc_files:
51
- - History.txt
52
- - Manifest.txt
53
- - README.txt
54
- - Todo.txt
55
- executables: []
56
-
57
- extensions: []
58
-
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: "0"
75
+ version:
59
76
  requirements: []
60
77
 
61
- dependencies:
62
- - !ruby/object:Gem::Dependency
63
- name: hoe
64
- version_requirement:
65
- version_requirements: !ruby/object:Gem::Version::Requirement
66
- requirements:
67
- - - ">="
68
- - !ruby/object:Gem::Version
69
- version: 1.2.2
70
- version:
78
+ rubyforge_project: springnote
79
+ rubygems_version: 1.0.1
80
+ signing_key:
81
+ specification_version: 2
82
+ summary: ActiveResource wrapper library for Springnote.com's REST API
83
+ test_files: []
84
+