supplejack_client 1.0.5 → 1.0.7

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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -2
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +2 -2
  5. data/Gemfile +4 -2
  6. data/README.md +3 -3
  7. data/lib/generators/locales/en.yml +5 -3
  8. data/lib/generators/supplejack/install_generator.rb +5 -3
  9. data/lib/generators/templates/supplejack_client.rb +5 -3
  10. data/lib/supplejack/concept.rb +5 -3
  11. data/lib/supplejack/config.rb +5 -3
  12. data/lib/supplejack/controllers/helpers.rb +5 -3
  13. data/lib/supplejack/engine.rb +5 -3
  14. data/lib/supplejack/exceptions.rb +8 -3
  15. data/lib/supplejack/facet.rb +5 -3
  16. data/lib/supplejack/item.rb +7 -5
  17. data/lib/supplejack/item_relation.rb +7 -4
  18. data/lib/supplejack/log_subscriber.rb +5 -3
  19. data/lib/supplejack/paginated_collection.rb +5 -3
  20. data/lib/supplejack/record.rb +5 -3
  21. data/lib/supplejack/request.rb +18 -4
  22. data/lib/supplejack/search.rb +5 -3
  23. data/lib/supplejack/story.rb +232 -0
  24. data/lib/supplejack/story_item.rb +149 -0
  25. data/lib/supplejack/story_item_relation.rb +81 -0
  26. data/lib/supplejack/url_formats/item_hash.rb +5 -3
  27. data/lib/supplejack/user.rb +9 -3
  28. data/lib/supplejack/user_set.rb +28 -26
  29. data/lib/supplejack/user_set_relation.rb +5 -3
  30. data/lib/supplejack/user_story_relation.rb +141 -0
  31. data/lib/supplejack/util.rb +5 -3
  32. data/lib/supplejack/version.rb +7 -5
  33. data/lib/supplejack_client.rb +14 -3
  34. data/spec/spec_helper.rb +7 -5
  35. data/spec/supplejack/concept_spec.rb +5 -3
  36. data/spec/supplejack/facet_spec.rb +5 -3
  37. data/spec/supplejack/item_relation_spec.rb +5 -3
  38. data/spec/supplejack/item_spec.rb +7 -5
  39. data/spec/supplejack/log_subscriber_spec.rb +5 -3
  40. data/spec/supplejack/paginated_collection_spec.rb +5 -3
  41. data/spec/supplejack/record_spec.rb +5 -3
  42. data/spec/supplejack/request_spec.rb +5 -3
  43. data/spec/supplejack/search_spec.rb +5 -3
  44. data/spec/supplejack/story_item_relation_spec.rb +149 -0
  45. data/spec/supplejack/story_item_spec.rb +114 -0
  46. data/spec/supplejack/story_spec.rb +401 -0
  47. data/spec/supplejack/user_set_relation_spec.rb +5 -3
  48. data/spec/supplejack/user_set_spec.rb +9 -7
  49. data/spec/supplejack/user_spec.rb +5 -3
  50. data/spec/supplejack/user_story_relation_spec.rb +157 -0
  51. data/stories_integration_test.rb +97 -0
  52. data/supplejack_client.gemspec +9 -3
  53. metadata +32 -10
@@ -0,0 +1,149 @@
1
+ # The Supplejack Common code is
2
+ # Crown copyright (C) 2014, New Zealand Government,
3
+ # and is licensed under the GNU General Public License, version 3.
4
+ # See https://github.com/DigitalNZ/supplejack_client for details.
5
+ #
6
+ # Supplejack was created by DigitalNZ at the
7
+ # National Library of NZ and the Department of Internal Affairs.
8
+ # http://digitalnz.org/supplejack
9
+
10
+ module Supplejack
11
+
12
+ # The +StoryItem+ class represents a StoryItem on the Supplejack API
13
+ #
14
+ # A StoryItem always belongs to a Story. represents.
15
+ #
16
+ # A StoryItem object has the following values:
17
+ # - id
18
+ # - type
19
+ # - sub_type
20
+ # - position
21
+ # - meta [Hash]
22
+ # - content [Hash]
23
+ class StoryItem
24
+ include Supplejack::Request
25
+
26
+ MODIFIABLE_ATTRIBUTES = [:position, :meta, :content, :type, :sub_type].freeze
27
+ UNMODIFIABLE_ATTRIBUTES = [:id, :story_id].freeze
28
+ ATTRIBUTES = (MODIFIABLE_ATTRIBUTES + UNMODIFIABLE_ATTRIBUTES).freeze
29
+
30
+ attr_accessor *ATTRIBUTES
31
+ attr_accessor :errors
32
+ attr_reader :api_key
33
+
34
+ def initialize(attributes={})
35
+ @attributes = attributes.try(:deep_symbolize_keys) || {}
36
+ @api_key = @attributes[:api_key]
37
+
38
+ self.meta ||= {}
39
+ self.attributes = @attributes
40
+ end
41
+
42
+ # Assigns the provided attributes to the StoryItem object
43
+ #
44
+ def attributes=(attributes)
45
+ attributes = attributes.try(:deep_symbolize_keys) || {}
46
+
47
+ attributes.each do |attr, value|
48
+ self.send("#{attr}=", value) if ATTRIBUTES.include?(attr)
49
+ end
50
+ end
51
+
52
+ def attributes
53
+ retrieve_attributes(ATTRIBUTES)
54
+ end
55
+
56
+ def api_attributes
57
+ retrieve_attributes(MODIFIABLE_ATTRIBUTES)
58
+ end
59
+
60
+ def new_record?
61
+ id.nil?
62
+ end
63
+
64
+ # Executes a POST request when the StoryItem hasn't been persisted to
65
+ # the API, otherwise it execute a PATCH request.
66
+ #
67
+ # When the API returns a error response, the errors are available through the Story#errors
68
+ # virtual attribute.
69
+ #
70
+ # @return [ true, false ] True if the API response was successful, false if not.
71
+ #
72
+ def save
73
+ begin
74
+ if self.new_record?
75
+ self.attributes = post(
76
+ "/stories/#{story_id}/items",
77
+ {api_key: api_key},
78
+ {item: self.api_attributes}
79
+ )
80
+ else
81
+ self.attributes = patch(
82
+ "/stories/#{story_id}/items/#{id}",
83
+ params: {api_key: api_key},
84
+ payload: {item: self.api_attributes}
85
+ )
86
+ end
87
+
88
+ Rails.cache.delete("/users/#{self.api_key}/stories") if Supplejack.enable_caching
89
+
90
+ true
91
+ rescue StandardError => e
92
+ self.errors = e.message
93
+
94
+ false
95
+ end
96
+ end
97
+
98
+ # Executes a DELETE request to the API with the StoryItem ID and the stories api_key
99
+ #
100
+ # When the API returns an error response, the errors are available through the StoryItem#errors
101
+ # virtual attribute.
102
+ #
103
+ # @return [ true, false ] True if the API response was successful, false if not.
104
+ #
105
+ def destroy
106
+ return false if self.new_record?
107
+
108
+ begin
109
+ delete("/stories/#{story_id}/items/#{id}", {api_key: api_key})
110
+
111
+ Rails.cache.delete("/users/#{api_key}/stories") if Supplejack.enable_caching
112
+
113
+ true
114
+ rescue StandardError => e
115
+ self.errors = e.message
116
+
117
+ false
118
+ end
119
+ end
120
+
121
+ # Updates the StoryItems attributes and persists it to the API
122
+ #
123
+ # @return [ true, false ] True if the API response was successful, false if not.
124
+ #
125
+ def update_attributes(attributes={})
126
+ self.attributes = attributes
127
+
128
+ self.save
129
+ end
130
+
131
+ def to_json
132
+ attributes.to_json
133
+ end
134
+
135
+ private
136
+
137
+ def retrieve_attributes(attributes_list)
138
+ attributes = {}
139
+
140
+ attributes_list.each do |attribute|
141
+ value = self.send(attribute)
142
+
143
+ attributes[attribute] = value unless value.nil?
144
+ end
145
+
146
+ attributes
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,81 @@
1
+ # The Supplejack Common code is
2
+ # Crown copyright (C) 2014, New Zealand Government,
3
+ # and is licensed under the GNU General Public License, version 3.
4
+ # See https://github.com/DigitalNZ/supplejack_client for details.
5
+ #
6
+ # Supplejack was created by DigitalNZ at the
7
+ # National Library of NZ and the Department of Internal Affairs.
8
+ # http://digitalnz.org/supplejack
9
+
10
+ module Supplejack
11
+ class StoryItemRelation
12
+ include Request
13
+
14
+ attr_reader :story, :errors
15
+
16
+ def initialize(story)
17
+ @story = story
18
+ items = story.attributes.try(:fetch, :contents, nil) || []
19
+ build_items(items)
20
+ end
21
+
22
+ def all
23
+ @items
24
+ end
25
+
26
+ def build(attributes = {})
27
+ story_item = Supplejack::StoryItem.new(attributes.merge(story_id: story.id, api_key: story.api_key))
28
+
29
+ @items << story_item
30
+
31
+ story_item
32
+ end
33
+
34
+ def create(attributes = {})
35
+ story_item = build(attributes)
36
+
37
+ story_item.save
38
+ end
39
+
40
+ def move_item(item_id, position)
41
+ begin
42
+ response = post("/stories/#{story.id}/items/#{item_id}/moves", {api_key: story.api_key}, {item_id: item_id, position: position})
43
+
44
+ build_items(response)
45
+
46
+ true
47
+ rescue StandardError => e
48
+ @errors = e.inspect
49
+
50
+ false
51
+ end
52
+ end
53
+
54
+ def find(id)
55
+ @items.detect{|i| i.id == id.to_i}
56
+ end
57
+
58
+ def to_json
59
+ all.to_json
60
+ end
61
+
62
+ # Any method missing on this class is delegated to the StoryItems objects array
63
+ # so that the developer can easily execute any Array method on the StoryItemRelation
64
+ #
65
+ # @example
66
+ # story.each .... => Iterate through the StoryItem objects array
67
+ # story.size => Get the size of the StoryItem objects array
68
+ #
69
+ def method_missing(method, *args, &block)
70
+ all.send(method, *args, &block)
71
+ end
72
+
73
+ private
74
+
75
+ def build_items(items)
76
+ @items = items.map do |hash|
77
+ Supplejack::StoryItem.new(hash.merge(story_id: story.id, api_key: story.api_key))
78
+ end.sort_by(&:position)
79
+ end
80
+ end
81
+ end
@@ -1,9 +1,11 @@
1
- # The Supplejack Client code is Crown copyright (C) 2014, New Zealand Government,
1
+ # The Supplejack Common code is
2
+ # Crown copyright (C) 2014, New Zealand Government,
2
3
  # and is licensed under the GNU General Public License, version 3.
3
4
  # See https://github.com/DigitalNZ/supplejack_client for details.
4
5
  #
5
- # Supplejack was created by DigitalNZ at the National Library of NZ
6
- # and the Department of Internal Affairs. http://digitalnz.org/supplejack
6
+ # Supplejack was created by DigitalNZ at the
7
+ # National Library of NZ and the Department of Internal Affairs.
8
+ # http://digitalnz.org/supplejack
7
9
 
8
10
  module Supplejack
9
11
  module UrlFormats
@@ -1,9 +1,11 @@
1
- # The Supplejack Client code is Crown copyright (C) 2014, New Zealand Government,
1
+ # The Supplejack Common code is
2
+ # Crown copyright (C) 2014, New Zealand Government,
2
3
  # and is licensed under the GNU General Public License, version 3.
3
4
  # See https://github.com/DigitalNZ/supplejack_client for details.
4
5
  #
5
- # Supplejack was created by DigitalNZ at the National Library of NZ
6
- # and the Department of Internal Affairs. http://digitalnz.org/supplejack
6
+ # Supplejack was created by DigitalNZ at the
7
+ # National Library of NZ and the Department of Internal Affairs.
8
+ # http://digitalnz.org/supplejack
7
9
 
8
10
  module Supplejack
9
11
 
@@ -44,6 +46,10 @@ module Supplejack
44
46
  @sets ||= UserSetRelation.new(self)
45
47
  end
46
48
 
49
+ def stories
50
+ @stories ||= UserStoryRelation.new(self)
51
+ end
52
+
47
53
  # Initializes a UserSetRelation class which adds behaviour to build, create
48
54
  # find and order sets related to this particular User instance
49
55
  #
@@ -1,9 +1,11 @@
1
- # The Supplejack Client code is Crown copyright (C) 2014, New Zealand Government,
1
+ # The Supplejack Common code is
2
+ # Crown copyright (C) 2014, New Zealand Government,
2
3
  # and is licensed under the GNU General Public License, version 3.
3
4
  # See https://github.com/DigitalNZ/supplejack_client for details.
4
5
  #
5
- # Supplejack was created by DigitalNZ at the National Library of NZ
6
- # and the Department of Internal Affairs. http://digitalnz.org/supplejack
6
+ # Supplejack was created by DigitalNZ at the
7
+ # National Library of NZ and the Department of Internal Affairs.
8
+ # http://digitalnz.org/supplejack
7
9
 
8
10
  module Supplejack
9
11
 
@@ -21,19 +23,19 @@ module Supplejack
21
23
  # - priority
22
24
  # - count
23
25
  # - tags
24
- #
26
+ #
25
27
  class UserSet
26
28
  extend Supplejack::Request
27
29
  include ActiveModel::Conversion
28
30
  extend ActiveModel::Naming
29
31
 
30
- ATTRIBUTES = [:id, :name, :description, :privacy, :url, :priority, :count, :tags, :tag_list,
32
+ ATTRIBUTES = [:id, :name, :description, :privacy, :url, :priority, :count, :tags, :tag_list,
31
33
  :featured, :records, :created_at, :updated_at, :approved, :record]
32
34
  attr_accessor *ATTRIBUTES
33
35
  attr_accessor :api_key, :errors, :user
34
36
 
35
37
  PRIVACY_STATES = ['public', 'hidden', 'private']
36
-
38
+
37
39
  def initialize(attributes={})
38
40
  @attributes = attributes.try(:symbolize_keys) || {}
39
41
  @user = Supplejack::User.new(@attributes[:user])
@@ -72,7 +74,7 @@ module Supplejack
72
74
  #
73
75
  def api_records
74
76
  records = self.records.is_a?(Array) ? self.records : []
75
- records.map do |record_hash|
77
+ records.map do |record_hash|
76
78
  record_hash = record_hash.try(:symbolize_keys) || {}
77
79
  if record_hash[:record_id]
78
80
  {record_id: record_hash[:record_id], position: record_hash[:position] }
@@ -98,7 +100,7 @@ module Supplejack
98
100
  end
99
101
 
100
102
  # Returns the api_key from the UserSet or from the User which this set belongs to.
101
- #
103
+ #
102
104
  def api_key
103
105
  @api_key || @user.try(:api_key)
104
106
  end
@@ -146,11 +148,11 @@ module Supplejack
146
148
  # Executes a POST request when the UserSet hasn't been persisted to the API, otherwise it executes
147
149
  # a PUT request.
148
150
  #
149
- # When the API returns a error response, the errors are available through the UserSet#errors
151
+ # When the API returns a error response, the errors are available through the UserSet#errors
150
152
  # virtual attribute.
151
153
  #
152
154
  # @return [ true, false ] True if the API response was successful, false if not.
153
- #
155
+ #
154
156
  def save
155
157
  begin
156
158
  if self.new_record?
@@ -162,7 +164,7 @@ module Supplejack
162
164
  Rails.cache.delete("/users/#{self.api_key}/sets") if Supplejack.enable_caching
163
165
  return true
164
166
  rescue StandardError => e
165
- self.errors = e.inspect
167
+ self.errors = e.message
166
168
  return false
167
169
  end
168
170
  end
@@ -177,7 +179,7 @@ module Supplejack
177
179
  end
178
180
 
179
181
  # Assigns the provided attributes to the UserSet object
180
- #
182
+ #
181
183
  def attributes=(attributes)
182
184
  attributes = attributes.try(:symbolize_keys) || {}
183
185
  attributes.each do |attr, value|
@@ -188,7 +190,7 @@ module Supplejack
188
190
 
189
191
  # Define setter methods for both created_at and updated_at so that
190
192
  # they always return a Time object.
191
- #
193
+ #
192
194
  [:created_at, :updated_at].each do |attribute|
193
195
  define_method("#{attribute}=") do |time|
194
196
  self.instance_variable_set("@#{attribute}", Util.time(time))
@@ -223,9 +225,9 @@ module Supplejack
223
225
  end
224
226
 
225
227
  # Executes a DELETE request to the API with the UserSet ID and the user's api_key
226
- #
228
+ #
227
229
  # @return [ true, false ] True if the API response was successful, false if not.
228
- #
230
+ #
229
231
  def destroy
230
232
  if self.new_record?
231
233
  return false
@@ -235,7 +237,7 @@ module Supplejack
235
237
  Rails.cache.delete("/users/#{self.api_key}/sets") if Supplejack.enable_caching
236
238
  return true
237
239
  rescue StandardError => e
238
- self.errors = e.inspect
240
+ self.errors = e.message
239
241
  return false
240
242
  end
241
243
  end
@@ -248,7 +250,7 @@ module Supplejack
248
250
  # Fetches the UserSet information from the API again, in case it had changed.
249
251
  # This can be useful if they items for a UserSet changed and you want the relation
250
252
  # to have the most up to date items.
251
- #
253
+ #
252
254
  def reload
253
255
  begin
254
256
  self.instance_variable_set("@items", nil)
@@ -264,7 +266,7 @@ module Supplejack
264
266
  # @param [ Supplejack::User ] A Supplejack::User object
265
267
  #
266
268
  # @return [ true, false ] True if the user can view the current UserSet, false if not.
267
- #
269
+ #
268
270
  def viewable_by?(user)
269
271
  return true if self.public? || self.hidden?
270
272
  self.owned_by?(user)
@@ -286,10 +288,10 @@ module Supplejack
286
288
  # a UserSet object with the response from the API.
287
289
  #
288
290
  # @return [ UserSet ] A UserSet object
289
- #
290
- def self.find(id, api_key=nil)
291
+ #
292
+ def self.find(id, api_key=nil, params={})
291
293
  begin
292
- response = get("/sets/#{id}")
294
+ response = get("/sets/#{id}", params)
293
295
  attributes = response["set"] || {}
294
296
  user_set = new(attributes)
295
297
  user_set.api_key = api_key if api_key.present?
@@ -308,15 +310,15 @@ module Supplejack
308
310
  # @option options [ Integer ] :per_page The per_page number to select the number of UserSet objects per page.
309
311
  #
310
312
  # @return [ Array ] A array of Supplejack::UserSet objects
311
- #
313
+ #
312
314
  def self.public_sets(options={})
313
315
  options.reverse_merge!(page: 1, per_page: 100)
314
316
  response = get("/sets/public", options)
315
317
  sets_array = response["sets"] || []
316
318
  user_sets = sets_array.map {|attrs| new(attrs) }
317
- Supplejack::PaginatedCollection.new(user_sets,
318
- options[:page].to_i,
319
- options[:per_page].to_i,
319
+ Supplejack::PaginatedCollection.new(user_sets,
320
+ options[:page].to_i,
321
+ options[:per_page].to_i,
320
322
  response["total"].to_i)
321
323
  end
322
324
 
@@ -345,7 +347,7 @@ module Supplejack
345
347
  # This is useful when using a Supplejack::UserSet object in the Rails provided routes helpers. Example:
346
348
  #
347
349
  # user_set_path(@user_set)
348
- #
350
+ #
349
351
  def self.model_name
350
352
  ActiveModel::Name.new(self, nil, "UserSet")
351
353
  end
@@ -1,9 +1,11 @@
1
- # The Supplejack Client code is Crown copyright (C) 2014, New Zealand Government,
1
+ # The Supplejack Common code is
2
+ # Crown copyright (C) 2014, New Zealand Government,
2
3
  # and is licensed under the GNU General Public License, version 3.
3
4
  # See https://github.com/DigitalNZ/supplejack_client for details.
4
5
  #
5
- # Supplejack was created by DigitalNZ at the National Library of NZ
6
- # and the Department of Internal Affairs. http://digitalnz.org/supplejack
6
+ # Supplejack was created by DigitalNZ at the
7
+ # National Library of NZ and the Department of Internal Affairs.
8
+ # http://digitalnz.org/supplejack
7
9
 
8
10
  module Supplejack
9
11