cloudapp 1.1.0 → 2.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. data/CHANGELOG.md +3 -0
  2. data/Gemfile.lock +18 -34
  3. data/README.md +2 -1
  4. data/Rakefile +5 -1
  5. data/cloudapp.gemspec +50 -41
  6. data/lib/cloudapp/account.rb +111 -0
  7. data/lib/cloudapp/authorized_representation.rb +17 -0
  8. data/lib/cloudapp/collection_json/item.rb +20 -0
  9. data/lib/cloudapp/collection_json/representation.rb +74 -0
  10. data/lib/cloudapp/collection_json/template.rb +17 -0
  11. data/lib/cloudapp/collection_json/tint.rb +11 -0
  12. data/lib/cloudapp/collection_json.rb +3 -0
  13. data/lib/cloudapp/drop.rb +22 -6
  14. data/lib/cloudapp/drop_collection.rb +22 -0
  15. data/lib/cloudapp/service.rb +172 -0
  16. data/lib/cloudapp/token.rb +27 -0
  17. data/lib/cloudapp.rb +5 -1
  18. data/man/cloudapp.1 +202 -45
  19. data/man/cloudapp.1.html +114 -42
  20. data/man/cloudapp.1.ronn +125 -45
  21. data/spec/cassettes/create_bookmark.yml +255 -0
  22. data/spec/cassettes/create_bookmark_with_name.yml +266 -0
  23. data/spec/cassettes/create_bookmark_with_privacy.yml +277 -0
  24. data/spec/cassettes/delete_drop.yml +383 -0
  25. data/spec/cassettes/list_drops.yml +139 -0
  26. data/spec/cassettes/list_drops_with_bad_token.yml +57 -0
  27. data/spec/cassettes/list_drops_with_filter.yml +209 -0
  28. data/spec/cassettes/list_drops_with_href.yml +287 -0
  29. data/spec/cassettes/list_drops_with_href_and_filter.yml +287 -0
  30. data/spec/cassettes/list_drops_with_href_and_limit.yml +287 -0
  31. data/spec/cassettes/list_drops_with_limit.yml +211 -0
  32. data/spec/cassettes/list_drops_with_nil_href.yml +139 -0
  33. data/spec/cassettes/purge_drops.yml +1103 -0
  34. data/spec/cassettes/recover_drop.yml +628 -0
  35. data/spec/cassettes/rename_drop.yml +367 -0
  36. data/spec/cassettes/setup_drops.yml +968 -0
  37. data/spec/cassettes/token_for_account.yml +127 -0
  38. data/spec/cassettes/token_for_account_with_bad_credentials.yml +115 -0
  39. data/spec/cassettes/trash_drop.yml +478 -0
  40. data/spec/cassettes/update_drop_bookmark_url.yml +379 -0
  41. data/spec/cassettes/update_file.yml +573 -0
  42. data/spec/cassettes/upload_file.yml +470 -0
  43. data/spec/cassettes/upload_file_with_name.yml +484 -0
  44. data/spec/cassettes/upload_file_with_privacy.yml +495 -0
  45. data/spec/cassettes/view_drop.yml +73 -0
  46. data/spec/cloudapp/account_spec.rb +166 -0
  47. data/spec/cloudapp/authorized_representation_spec.rb +32 -0
  48. data/spec/cloudapp/collection_json/item_spec.rb +45 -0
  49. data/spec/cloudapp/collection_json/representation_spec.rb +118 -0
  50. data/spec/cloudapp/collection_json/template_spec.rb +53 -0
  51. data/spec/cloudapp/drop_collection_spec.rb +63 -0
  52. data/spec/cloudapp/drop_spec.rb +81 -51
  53. data/spec/cloudapp/service_spec.rb +357 -0
  54. data/spec/cloudapp/token_spec.rb +33 -0
  55. data/spec/integration_spec.rb +100 -0
  56. data/spec/support/stub_class_or_module.rb +6 -3
  57. data/spec/support/vcr.rb +21 -5
  58. metadata +84 -106
  59. data/bin/cloudapp +0 -184
  60. data/lib/cloudapp/config.rb +0 -39
  61. data/lib/cloudapp/drop_content.rb +0 -34
  62. data/lib/cloudapp/drop_presenter.rb +0 -80
  63. data/lib/cloudapp/drop_service.rb +0 -255
  64. data/lib/cloudapp/identity.rb +0 -14
  65. data/spec/cassettes/DropContent/download.yml +0 -116
  66. data/spec/cassettes/DropService/create_bookmark.yml +0 -105
  67. data/spec/cassettes/DropService/create_bookmark_with_bad_credentials.yml +0 -39
  68. data/spec/cassettes/DropService/create_bookmark_with_name.yml +0 -105
  69. data/spec/cassettes/DropService/create_private_bookmark.yml +0 -105
  70. data/spec/cassettes/DropService/create_public_bookmark.yml +0 -105
  71. data/spec/cassettes/DropService/drop.yml +0 -81
  72. data/spec/cassettes/DropService/list_drops.yml +0 -135
  73. data/spec/cassettes/DropService/list_drops_with_bad_credentials.yml +0 -39
  74. data/spec/cassettes/DropService/list_drops_with_limit.yml +0 -117
  75. data/spec/cassettes/DropService/list_trash.yml +0 -111
  76. data/spec/cassettes/DropService/list_trash_with_bad_credentials.yml +0 -39
  77. data/spec/cassettes/DropService/retrieve_token.yml +0 -42
  78. data/spec/cassettes/DropService/retrieve_token_with_bad_credentials.yml +0 -43
  79. data/spec/cassettes/DropService/upload_file.yml +0 -291
  80. data/spec/cassettes/DropService/upload_public_file.yml +0 -293
  81. data/spec/cloudapp/config_spec.rb +0 -59
  82. data/spec/cloudapp/drop_content_spec.rb +0 -21
  83. data/spec/cloudapp/drop_presenter_spec.rb +0 -120
  84. data/spec/cloudapp/drop_service_spec.rb +0 -400
  85. data/spec/cloudapp/identity_spec.rb +0 -27
  86. data/spec/support/fakefs_rspec.rb +0 -5
  87. data/spec/support/vcr_rspec.rb +0 -9
data/CHANGELOG.md CHANGED
@@ -4,6 +4,9 @@ Below is a complete listing of changes for each revision of `cloudapp`.
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## 1.1.0
8
+
9
+ - Add `download` command
7
10
  - General housecleaning in `bin/cloudapp`
8
11
  - Fix typo ([#22][] by [Mark Mulder][bittersweet])
9
12
  - Extract Config class
data/Gemfile.lock CHANGED
@@ -1,30 +1,22 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cloudapp (1.1.0)
5
- addressable
6
- faraday (~> 0.8.0.rc2)
7
- gli
8
- highline
9
- leadlight (~> 0.0.5)
10
- typhoeus
4
+ cloudapp (2.0.0.beta.1)
5
+ leadlight (= 0.0.5)
6
+ typhoeus (~> 0.3.3)
11
7
 
12
8
  GEM
13
9
  remote: http://rubygems.org/
14
10
  specs:
15
- addressable (2.2.7)
11
+ addressable (2.3.2)
16
12
  crack (0.3.1)
17
13
  diff-lcs (1.1.3)
18
14
  fail-fast (1.0.0)
19
- fakefs (0.4.0)
20
- faraday (0.8.0.rc2)
15
+ faraday (0.8.4)
21
16
  multipart-post (~> 1.1)
22
17
  fattr (2.2.1)
23
- gli (1.5.1)
24
- highline (1.6.11)
25
18
  hookr (1.1.1)
26
19
  fail-fast (= 1.0.0)
27
- hpricot (0.8.6)
28
20
  leadlight (0.0.5)
29
21
  addressable
30
22
  faraday
@@ -34,29 +26,23 @@ GEM
34
26
  mime-types
35
27
  multi_json (~> 1.0.4)
36
28
  link_header (0.0.5)
37
- mime-types (1.17.2)
29
+ mime-types (1.19)
38
30
  multi_json (1.0.4)
39
31
  multipart-post (1.1.5)
40
- mustache (0.99.4)
41
32
  rake (0.9.2.2)
42
- rdiscount (1.6.8)
43
- ronn (0.7.3)
44
- hpricot (>= 0.8.2)
45
- mustache (>= 0.7.0)
46
- rdiscount (>= 1.5.8)
47
- rspec (2.8.0)
48
- rspec-core (~> 2.8.0)
49
- rspec-expectations (~> 2.8.0)
50
- rspec-mocks (~> 2.8.0)
51
- rspec-core (2.8.0)
52
- rspec-expectations (2.8.0)
53
- diff-lcs (~> 1.1.2)
54
- rspec-mocks (2.8.0)
33
+ rspec (2.11.0)
34
+ rspec-core (~> 2.11.0)
35
+ rspec-expectations (~> 2.11.0)
36
+ rspec-mocks (~> 2.11.0)
37
+ rspec-core (2.11.1)
38
+ rspec-expectations (2.11.2)
39
+ diff-lcs (~> 1.1.3)
40
+ rspec-mocks (2.11.2)
55
41
  typhoeus (0.3.3)
56
42
  mime-types
57
- vcr (2.0.0.rc1)
58
- webmock (1.7.10)
59
- addressable (~> 2.2, > 2.2.5)
43
+ vcr (2.0.1)
44
+ webmock (1.8.9)
45
+ addressable (>= 2.2.7)
60
46
  crack (>= 0.1.7)
61
47
 
62
48
  PLATFORMS
@@ -64,9 +50,7 @@ PLATFORMS
64
50
 
65
51
  DEPENDENCIES
66
52
  cloudapp!
67
- fakefs
68
53
  rake
69
- ronn
70
54
  rspec
71
- vcr (~> 2.0.0.rc1)
55
+ vcr (~> 2.0.0)
72
56
  webmock
data/README.md CHANGED
@@ -26,6 +26,7 @@ goal of `cloudapp` is to be simple and Unix-friendly.
26
26
  cloudapp list
27
27
  cloudapp bookmark http://douglasadams.com
28
28
  cloudapp upload ~/Desktop/screenshot.png
29
+ cloudapp download http://cl.ly/abc123
29
30
 
30
31
  ### Examples
31
32
 
@@ -36,6 +37,7 @@ goal of `cloudapp` is to be simple and Unix-friendly.
36
37
  - List newest drops: `cloudapp list [--count=5]`
37
38
  - Copy a new drop's link (OS X): `cloudapp bookmark http://douglasadams.com | pbcopy`
38
39
  - Output drops in CSV: `cloudapp --format=csv list`
40
+ - Download a drop: `cloudapp download http://cl.ly/abc123`
39
41
 
40
42
  More examples can be found on [the man page][man-page].
41
43
 
@@ -45,7 +47,6 @@ More examples can be found on [the man page][man-page].
45
47
 
46
48
  `cloudapp` could be awesome with a little more flare.
47
49
 
48
- - Download a drop: `cloudapp download http://cl.ly/abc123`
49
50
  - Output specific columns: `cloudapp list --columns=name,views,link`
50
51
  - Handle bookmarks from STDIN: `pbpaste | cloudapp bookmark`
51
52
  - Handle files from STDIN: `find *.png | cloudapp upload`
data/Rakefile CHANGED
@@ -48,9 +48,13 @@ require 'rspec/core/rake_task'
48
48
 
49
49
  desc "Run all specs"
50
50
  task RSpec::Core::RakeTask.new('spec')
51
-
52
51
  task :default => "spec"
53
52
 
53
+ desc 'Run non-integration specs'
54
+ RSpec::Core::RakeTask.new('spec:unit') do |t|
55
+ t.rspec_opts = "--tag ~integration"
56
+ end
57
+
54
58
  #############################################################################
55
59
  #
56
60
  # Custom tasks (add your own tasks here)
data/cloudapp.gemspec CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
13
13
  ## If your rubyforge_project name is different, then edit it and comment out
14
14
  ## the sub! line in the Rakefile
15
15
  s.name = 'cloudapp'
16
- s.version = '1.1.0'
17
- s.date = '2012-02-18'
16
+ s.version = '2.0.0.beta.1'
17
+ s.date = '2012-08-17'
18
18
  s.rubyforge_project = 'cloudapp'
19
19
 
20
20
  ## Make sure your summary is short. The description may be as long
@@ -34,7 +34,7 @@ Gem::Specification.new do |s|
34
34
  s.require_paths = %w[lib]
35
35
 
36
36
  ## If your gem includes any executables, list them here.
37
- s.executables = ["cloudapp"]
37
+ # s.executables = ["cloudapp"]
38
38
 
39
39
  ## Specify any RDoc options here. You'll want to add your README and
40
40
  ## LICENSE files to the extra_rdoc_files list.
@@ -43,20 +43,14 @@ Gem::Specification.new do |s|
43
43
 
44
44
  ## List your runtime dependencies here. Runtime dependencies are those
45
45
  ## that are needed for an end user to actually USE your code.
46
- s.add_dependency 'addressable'
47
- s.add_dependency 'faraday', '~> 0.8.0.rc2'
48
- s.add_dependency 'gli'
49
- s.add_dependency 'highline'
50
- s.add_dependency 'leadlight', '~> 0.0.5'
51
- s.add_dependency 'typhoeus'
46
+ s.add_dependency 'leadlight', '= 0.0.5'
47
+ s.add_dependency 'typhoeus', '~> 0.3.3'
52
48
 
53
49
  ## List your development dependencies here. Development dependencies are
54
50
  ## those that are only needed during development
55
- s.add_development_dependency 'fakefs'
56
51
  s.add_development_dependency 'rake'
57
- s.add_development_dependency 'ronn'
58
52
  s.add_development_dependency 'rspec'
59
- s.add_development_dependency 'vcr', '~> 2.0.0.rc1'
53
+ s.add_development_dependency 'vcr', '~> 2.0.0'
60
54
  s.add_development_dependency 'webmock'
61
55
 
62
56
  ## Leave this section as-is. It will be automatically generated from the
@@ -70,46 +64,61 @@ Gem::Specification.new do |s|
70
64
  MIT-LICENSE
71
65
  README.md
72
66
  Rakefile
73
- bin/cloudapp
74
67
  cloudapp.gemspec
75
68
  lib/cloudapp.rb
76
- lib/cloudapp/config.rb
69
+ lib/cloudapp/account.rb
70
+ lib/cloudapp/authorized_representation.rb
71
+ lib/cloudapp/collection_json.rb
72
+ lib/cloudapp/collection_json/item.rb
73
+ lib/cloudapp/collection_json/representation.rb
74
+ lib/cloudapp/collection_json/template.rb
75
+ lib/cloudapp/collection_json/tint.rb
77
76
  lib/cloudapp/drop.rb
78
- lib/cloudapp/drop_content.rb
79
- lib/cloudapp/drop_presenter.rb
80
- lib/cloudapp/drop_service.rb
81
- lib/cloudapp/identity.rb
77
+ lib/cloudapp/drop_collection.rb
78
+ lib/cloudapp/service.rb
79
+ lib/cloudapp/token.rb
82
80
  man/cloudapp.1
83
81
  man/cloudapp.1.html
84
82
  man/cloudapp.1.ronn
85
- spec/cassettes/DropContent/download.yml
86
- spec/cassettes/DropService/create_bookmark.yml
87
- spec/cassettes/DropService/create_bookmark_with_bad_credentials.yml
88
- spec/cassettes/DropService/create_bookmark_with_name.yml
89
- spec/cassettes/DropService/create_private_bookmark.yml
90
- spec/cassettes/DropService/create_public_bookmark.yml
91
- spec/cassettes/DropService/drop.yml
92
- spec/cassettes/DropService/list_drops.yml
93
- spec/cassettes/DropService/list_drops_with_bad_credentials.yml
94
- spec/cassettes/DropService/list_drops_with_limit.yml
95
- spec/cassettes/DropService/list_trash.yml
96
- spec/cassettes/DropService/list_trash_with_bad_credentials.yml
97
- spec/cassettes/DropService/retrieve_token.yml
98
- spec/cassettes/DropService/retrieve_token_with_bad_credentials.yml
99
- spec/cassettes/DropService/upload_file.yml
100
- spec/cassettes/DropService/upload_public_file.yml
101
- spec/cloudapp/config_spec.rb
102
- spec/cloudapp/drop_content_spec.rb
103
- spec/cloudapp/drop_presenter_spec.rb
104
- spec/cloudapp/drop_service_spec.rb
83
+ spec/cassettes/create_bookmark.yml
84
+ spec/cassettes/create_bookmark_with_name.yml
85
+ spec/cassettes/create_bookmark_with_privacy.yml
86
+ spec/cassettes/delete_drop.yml
87
+ spec/cassettes/list_drops.yml
88
+ spec/cassettes/list_drops_with_bad_token.yml
89
+ spec/cassettes/list_drops_with_filter.yml
90
+ spec/cassettes/list_drops_with_href.yml
91
+ spec/cassettes/list_drops_with_href_and_filter.yml
92
+ spec/cassettes/list_drops_with_href_and_limit.yml
93
+ spec/cassettes/list_drops_with_limit.yml
94
+ spec/cassettes/list_drops_with_nil_href.yml
95
+ spec/cassettes/purge_drops.yml
96
+ spec/cassettes/recover_drop.yml
97
+ spec/cassettes/rename_drop.yml
98
+ spec/cassettes/setup_drops.yml
99
+ spec/cassettes/token_for_account.yml
100
+ spec/cassettes/token_for_account_with_bad_credentials.yml
101
+ spec/cassettes/trash_drop.yml
102
+ spec/cassettes/update_drop_bookmark_url.yml
103
+ spec/cassettes/update_file.yml
104
+ spec/cassettes/upload_file.yml
105
+ spec/cassettes/upload_file_with_name.yml
106
+ spec/cassettes/upload_file_with_privacy.yml
107
+ spec/cassettes/view_drop.yml
108
+ spec/cloudapp/account_spec.rb
109
+ spec/cloudapp/authorized_representation_spec.rb
110
+ spec/cloudapp/collection_json/item_spec.rb
111
+ spec/cloudapp/collection_json/representation_spec.rb
112
+ spec/cloudapp/collection_json/template_spec.rb
113
+ spec/cloudapp/drop_collection_spec.rb
105
114
  spec/cloudapp/drop_spec.rb
106
- spec/cloudapp/identity_spec.rb
115
+ spec/cloudapp/service_spec.rb
116
+ spec/cloudapp/token_spec.rb
107
117
  spec/helper.rb
108
- spec/support/fakefs_rspec.rb
118
+ spec/integration_spec.rb
109
119
  spec/support/files/favicon.ico
110
120
  spec/support/stub_class_or_module.rb
111
121
  spec/support/vcr.rb
112
- spec/support/vcr_rspec.rb
113
122
  ]
114
123
  # = MANIFEST =
115
124
 
@@ -0,0 +1,111 @@
1
+ require 'forwardable'
2
+ require 'cloudapp/drop'
3
+ require 'cloudapp/drop_collection'
4
+
5
+ # Usage:
6
+ #
7
+ # # Create a new service passing CloudApp account token:
8
+ # account = CloudApp::Account.using_token token
9
+ #
10
+ # # Newest drops
11
+ # account.drops #=> Active drops
12
+ # account.drops filter: :active #=> Active drops
13
+ # account.drops filter: :trash #=> Trashed drops
14
+ # account.drops filter: :all #=> All active and trashed drops
15
+ #
16
+ # # List specific page of drops:
17
+ # page1 = account.drops
18
+ # page2 = account.drops href: page1.link('next') # Advance to page 2
19
+ # page1 = account.drops href: page2.link('previous') # Go back to page 1
20
+ #
21
+ # # Newest 5 drops
22
+ # account.drops limit: 5
23
+ #
24
+ # # View specific drop:
25
+ # account.drop_at drop.href
26
+ #
27
+ # # Create a bookmark:
28
+ # account.bookmark 'http://getcloudapp.com'
29
+ # account.bookmark 'http://getcloudapp.com', name: 'CloudApp'
30
+ # account.bookmark 'http://getcloudapp.com', private: false
31
+ #
32
+ # # Upload a file:
33
+ # account.upload #<Pathname>
34
+ # account.upload #<Pathname>, name: 'Screen shot'
35
+ # account.upload #<Pathname>, private: false
36
+ #
37
+ # # Update a drop:
38
+ # account.update drop.href, name: 'CloudApp'
39
+ # account.update drop.href, private: false
40
+ #
41
+ # # Trash a drop:
42
+ # account.trash_drop 42
43
+ #
44
+ # # Recover a drop from the trash:
45
+ # account.recover_drop 42
46
+ #
47
+ # # Delete a drop:
48
+ # account.delete_drop 42
49
+ #
50
+ module CloudApp
51
+ class Account
52
+ extend Forwardable
53
+ def_delegators :service, :delete_drop
54
+
55
+ class << self
56
+ attr_writer :service_source
57
+ end
58
+
59
+ def self.service_source
60
+ @service_source ||= CloudApp::Service.public_method(:new)
61
+ end
62
+
63
+ def self.service
64
+ service_source.call
65
+ end
66
+
67
+ def initialize(token = nil)
68
+ @token = token
69
+ end
70
+
71
+ def self.using_token(token)
72
+ CloudApp::Account.new token
73
+ end
74
+
75
+ def drops(*args)
76
+ DropCollection.new service.drops(*args)
77
+ end
78
+
79
+ def drop_at(*args)
80
+ DropCollection.new service.drop_at(*args)
81
+ end
82
+
83
+ def bookmark(*args)
84
+ DropCollection.new service.bookmark(*args)
85
+ end
86
+
87
+ def upload(*args)
88
+ DropCollection.new service.upload(*args)
89
+ end
90
+
91
+ def update(*args)
92
+ DropCollection.new service.update(*args)
93
+ end
94
+
95
+ def trash_drop(*args)
96
+ DropCollection.new service.trash_drop(*args)
97
+ end
98
+
99
+ def recover_drop(*args)
100
+ DropCollection.new service.recover_drop(*args)
101
+ end
102
+
103
+ protected
104
+
105
+ def service
106
+ @service ||= self.class.service.tap do |service|
107
+ service.token = @token if @token
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,17 @@
1
+ require 'leadlight'
2
+
3
+ module CloudApp
4
+ module AuthorizedRepresentation
5
+ Tint = Leadlight::Tint.new 'authorized', status: [ :success, 401 ] do
6
+ extend AuthorizedRepresentation
7
+ end
8
+
9
+ def authorized?
10
+ not unauthorized?
11
+ end
12
+
13
+ def unauthorized?
14
+ __response__.status == 401
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ require 'ostruct'
2
+
3
+ module CloudApp
4
+ module CollectionJson
5
+ class Item
6
+ attr_reader :href, :links, :data
7
+ def initialize(item_data)
8
+ @href = item_data.fetch('href', nil)
9
+ @links = item_data.fetch('links', []).map {|link| OpenStruct.new(link) }
10
+ @data = DataCollection.hash_from(item_data.fetch('data'))
11
+ end
12
+ end
13
+
14
+ class DataCollection
15
+ def self.hash_from(data)
16
+ Hash[data.map {|datum| [ datum['name'], datum['value'] ]}]
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,74 @@
1
+ require 'ostruct'
2
+
3
+ module CloudApp
4
+ module CollectionJson
5
+ module Representation
6
+ def href
7
+ collection.fetch('href')
8
+ end
9
+
10
+ def collection_links
11
+ return [] unless collection.has_key?('links')
12
+ collection.fetch('links').map {|link| OpenStruct.new(link) }
13
+ end
14
+
15
+ def items(item_source = default_item_source)
16
+ collection.fetch('items').map {|item|
17
+ item_source.call(item)
18
+ }
19
+ end
20
+
21
+ # Ultimately this API would be nice:
22
+ #
23
+ # root.template(email: email, password: password).
24
+ # post do |response|
25
+ # return response
26
+ # end
27
+ #
28
+ # The Command Pattern could be nice as well. Template#[] may be a better
29
+ # solution than faux methods.
30
+ #
31
+ # root.create do |template|
32
+ # template.email = email
33
+ # template.password = password
34
+ # end
35
+ #
36
+ # Updates also use the template.
37
+ #
38
+ # root.items.first.update do |template|
39
+ # template.name.reverse!
40
+ # end
41
+ def template(template_source = default_template_source)
42
+ return unless collection.has_key?('template')
43
+ template_source.call collection.fetch('template')
44
+ end
45
+
46
+ def queries(query_source = default_query_source)
47
+ return unless collection.has_key?('queries')
48
+ collection.fetch('queries').map {|query| query_source.call(query) }
49
+ end
50
+
51
+ def query(rel, query_source = default_query_source)
52
+ Array(queries(query_source)).find {|query| query.rel == rel }
53
+ end
54
+
55
+ protected
56
+
57
+ def default_item_source
58
+ CloudApp::CollectionJson::Item.public_method(:new)
59
+ end
60
+
61
+ def default_template_source
62
+ CloudApp::CollectionJson::Template.public_method(:new)
63
+ end
64
+
65
+ def default_query_source
66
+ CloudApp::CollectionJson::Template.public_method(:new)
67
+ end
68
+
69
+ def collection
70
+ self.fetch('collection')
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,17 @@
1
+ module CloudApp
2
+ module CollectionJson
3
+ class Template < Item
4
+ attr_reader :rel, :enctype
5
+ def initialize(template_data)
6
+ super
7
+ @rel = template_data.fetch('rel', nil)
8
+ @enctype = template_data.fetch('enctype', nil)
9
+ end
10
+
11
+ def fill(template_data)
12
+ template_data = template_data.select {|key| data.has_key?(key) }
13
+ data.merge template_data
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ module CloudApp
2
+ module CollectionJson
3
+ Tint = Leadlight::Tint.new 'collection+json', status: [ :success, 401 ] do
4
+ match_content_type 'application/vnd.collection+json'
5
+ extend CollectionJson::Representation
6
+ collection_links.each do |link|
7
+ add_link link.href, link.rel
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ require 'cloudapp/collection_json/item'
2
+ require 'cloudapp/collection_json/representation'
3
+ require 'cloudapp/collection_json/template'
data/lib/cloudapp/drop.rb CHANGED
@@ -1,16 +1,32 @@
1
+ require 'date'
1
2
  require 'ostruct'
2
3
 
3
4
  module CloudApp
4
5
  class Drop < OpenStruct
5
- def private?() private == true end
6
- def public? () !private? end
6
+ attr_accessor :href, :data
7
7
 
8
- def display_name
9
- name || redirect_url || url
8
+ def initialize(collection_item)
9
+ @href = collection_item.href
10
+ @links = collection_item.links
11
+ @data = collection_item.data
12
+ super @data
10
13
  end
11
14
 
12
- def has_content?
13
- item_type != 'bookmark'
15
+ def name() super || share_url end
16
+ def private?() private == true end
17
+ def public?() !private? end
18
+ def created() DateTime.parse(super) end
19
+
20
+ def share_url() link_for_relation('canonical') end
21
+ def thumbnail_url() link_for_relation('icon') end
22
+ def embed_url() link_for_relation('embed') end
23
+ def download_url() link_for_relation('download') end
24
+
25
+ protected
26
+
27
+ def link_for_relation(relation)
28
+ link = @links.find {|link| link.rel == relation }
29
+ link and link.href
14
30
  end
15
31
  end
16
32
  end
@@ -0,0 +1,22 @@
1
+ require 'delegate'
2
+ require 'forwardable'
3
+
4
+ module CloudApp
5
+ class DropCollection < SimpleDelegator
6
+ extend Forwardable
7
+ def_delegators :@representation, :authorized?, :unauthorized?, :link, :links
8
+
9
+ def initialize(representation, drop_class = Drop)
10
+ @representation = representation
11
+ @drop_class = drop_class
12
+ super drops
13
+ end
14
+
15
+ protected
16
+
17
+ def drops
18
+ return [] if unauthorized?
19
+ @drops ||= @representation.items.map {|drop| @drop_class.new(drop) }
20
+ end
21
+ end
22
+ end