populr 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.4
1
+ 0.1.5
@@ -6,8 +6,8 @@ class Asset < RestfulModel
6
6
  attr_accessor :title
7
7
 
8
8
  # as an alternative to calling Asset.new, you can call populr.images.build
9
- def initialize(api, file, title = nil, description = nil)
10
- super(api)
9
+ def initialize(parent, file, title = nil, description = nil)
10
+ super(parent)
11
11
 
12
12
  @file = file
13
13
  self.title = title
@@ -0,0 +1,21 @@
1
+ require 'asset'
2
+
3
+ class EmbedAsset < Asset
4
+
5
+ attr_accessor :source_html
6
+
7
+ def self.collection_name
8
+ "embeds"
9
+ end
10
+
11
+ # as an alternative to calling Asset.new, you can call populr.images.build
12
+ def initialize(parent, source_html, title = nil, description = nil)
13
+ super(parent, nil)
14
+
15
+ @source_html = source_html
16
+ self.title = title
17
+ self.description = description
18
+ end
19
+
20
+ end
21
+
data/lib/pop.rb CHANGED
@@ -21,36 +21,42 @@ class Pop < RestfulModel
21
21
  attr_reader :newly_populated_regions
22
22
  attr_reader :newly_populated_tags
23
23
 
24
- def initialize(api_or_template, template = nil)
25
- template = template || api_or_template
26
-
27
- if template.is_a?(Template)
28
- self.template_id = template._id
29
- self.unpopulated_api_regions = template.api_regions
30
- self.unpopulated_api_tags = template.api_tags
31
-
32
- @_api = template.instance_variable_get :@_api
24
+ def initialize(parent)
25
+ if parent.is_a?(Template)
26
+ @_api = parent.instance_variable_get :@_api
27
+ self.template_id = parent._id
28
+ self.title = parent.title
29
+ self.name = parent.name
30
+ self.unpopulated_api_regions = parent.api_regions
31
+ self.unpopulated_api_tags = parent.api_tags
32
+
33
+ elsif parent.is_a?(RestfulModelCollection)
34
+ @_api = parent.instance_variable_get :@_api
35
+
36
+ elsif parent.is_a?(Populr)
37
+ @_api = parent
33
38
  else
34
- @_api = api_or_template
39
+ raise "You must create a pop with a template, collection, or API model."
35
40
  end
36
41
 
42
+ # We could choose to make parent the restfulModelCollection that is passed to us,
43
+ # but that would result in PUTs and POSTs to /templates/:id/pops, which isn't
44
+ # how the API is currently set up. For now, all pop PUTS, POSTs, etc... go to /pops/
45
+ @_parent = @_api.pops
46
+
37
47
  @newly_populated_regions = {}
38
48
  @newly_populated_tags = {}
39
49
  end
40
50
 
41
51
  def inflate(json)
42
52
  super(json)
43
-
44
- collection = RestfulModelCollection.new(Tracer, @_api, self)
45
- collection.inflate_collection(self.tracers) if self.tracers
46
- self.tracers = collection
47
-
53
+ self.tracers = RestfulModelCollection.new(Tracer, @_api, self)
48
54
  @newly_populated_regions = {}
49
55
  @newly_populated_tags = {}
50
56
  end
51
57
 
52
58
  def as_json(options = {})
53
- raise TemplateRequired.new unless template_id
59
+ raise TemplateRequired.new if options[:api_representation] && !template_id
54
60
 
55
61
  if options[:api_representation]
56
62
  hash = {}
@@ -76,6 +82,11 @@ class Pop < RestfulModel
76
82
  self.unpopulated_api_regions.include?(region_identifier)
77
83
  end
78
84
 
85
+ def type_of_unpopulated_region(region_identifier)
86
+ return false unless self.has_unpopulated_region(region_identifier)
87
+ self.unpopulated_api_regions[region_identifier]['type']
88
+ end
89
+
79
90
  def populate_region(region_identifier, assets)
80
91
  assets = [assets] unless assets.is_a?(Array)
81
92
 
@@ -3,6 +3,7 @@ require 'restful_model_collection'
3
3
  require 'template'
4
4
  require 'document_asset'
5
5
  require 'image_asset'
6
+ require 'embed_asset'
6
7
  require 'json'
7
8
  require 'pop'
8
9
  require 'domain'
@@ -51,26 +52,40 @@ class Populr
51
52
  @api_server = api_server
52
53
  @api_version = 'v0'
53
54
  @api_key = api_key
55
+
56
+ RestClient.add_before_execution_proc do |req, params|
57
+ req.add_field('X-Populr-API-Wrapper', 'ruby')
58
+ end
54
59
  end
55
60
 
56
61
  def templates
57
- RestfulModelCollection.new(Template, self)
62
+ @templates ||= RestfulModelCollection.new(Template, self)
63
+ @templates
58
64
  end
59
65
 
60
66
  def pops
61
- RestfulModelCollection.new(Pop, self)
67
+ @pops ||= RestfulModelCollection.new(Pop, self)
68
+ @pops
62
69
  end
63
70
 
64
71
  def domains
65
- RestfulModelCollection.new(Domain, self)
72
+ @domains ||= RestfulModelCollection.new(Domain, self)
73
+ @domains
66
74
  end
67
75
 
68
76
  def documents
69
- RestfulModelCollection.new(DocumentAsset, self)
77
+ @documents ||= RestfulModelCollection.new(DocumentAsset, self)
78
+ @documents
70
79
  end
71
80
 
72
81
  def images
73
- RestfulModelCollection.new(ImageAsset, self)
82
+ @images ||= RestfulModelCollection.new(ImageAsset, self)
83
+ @images
84
+ end
85
+
86
+ def embeds
87
+ @embeds ||= RestfulModelCollection.new(EmbedAsset, self)
88
+ @embeds
74
89
  end
75
90
 
76
91
  def url_for_path(path)
@@ -8,8 +8,13 @@ class RestfulModel
8
8
  end
9
9
 
10
10
 
11
- def initialize(api)
12
- @_api = api
11
+ def initialize(parent)
12
+ if parent.is_a?(Populr)
13
+ @_api = parent
14
+ else
15
+ @_parent = parent
16
+ @_api = parent.instance_variable_get :@_api
17
+ end
13
18
  end
14
19
 
15
20
  def ==(comparison_object)
@@ -22,7 +27,7 @@ class RestfulModel
22
27
  property_name = setter.to_s[0..setter.to_s.index('=')-1]
23
28
  self.send(setter, json[property_name]) if json.has_key?(property_name)
24
29
  end
25
- self.created_at = Time.new(self.created_at) if self.created_at
30
+ self.created_at = Time.parse(self.created_at) if self.created_at
26
31
  end
27
32
 
28
33
  def save!
@@ -61,7 +66,7 @@ class RestfulModel
61
66
  def path(action = "")
62
67
  action = "/#{action}" unless action.empty?
63
68
  prefix = @_parent ? @_parent.path : ''
64
- "#{prefix}/#{self.class.collection_name}/#{_id}#{action}"
69
+ "#{prefix}#{_id}#{action}"
65
70
  end
66
71
 
67
72
 
@@ -5,17 +5,51 @@ class RestfulModelCollection
5
5
  def initialize(model_class, api, parent = nil)
6
6
  @model_class = model_class
7
7
  @_parent = parent
8
- @_collection = nil
9
8
  @_api = api
10
9
  end
11
10
 
12
- def all
13
- return @_collection if @_collection
14
- get_restful_model_collection
11
+ def each
12
+ offset = 0
13
+ finished = false
14
+ while (!finished) do
15
+ items = get_restful_model_collection(offset)
16
+ break if items.length == 0
17
+ items.each { |item|
18
+ yield item
19
+ }
20
+ offset += items.length
21
+ end
15
22
  end
16
23
 
17
24
  def first
18
- all.first
25
+ get_restful_model_collection.first
26
+ end
27
+
28
+ def all
29
+ range(0, Float::INFINITY)
30
+ end
31
+
32
+ def range(offset = 0, count = 50)
33
+ accumulated = []
34
+ finished = false
35
+ chunk_size = 50
36
+
37
+ while (!finished && accumulated.length < count) do
38
+ results = get_restful_model_collection(offset + accumulated.length, chunk_size)
39
+ accumulated = accumulated.concat(results)
40
+
41
+ # we're done if we have more than 'count' items, or if we asked for 50 and got less than 50...
42
+ finished = accumulated.length >= count || results.length == 0 || (results.length % chunk_size != 0)
43
+ end
44
+
45
+ accumulated = accumulated[0..count] if count < Float::INFINITY
46
+ accumulated
47
+ end
48
+
49
+ def delete(item_or_id)
50
+ item_or_id = item_or_id._id if item_or_id.is_a?(RestfulModel)
51
+ url = @_api.url_for_path(self.path(item_or_id))
52
+ RestClient.delete(url)
19
53
  end
20
54
 
21
55
  def find(id)
@@ -24,32 +58,23 @@ class RestfulModelCollection
24
58
  end
25
59
 
26
60
  def build(*args)
27
- @model_class.new(@_api, *args)
28
- end
29
-
30
- def as_json(options = {})
31
- objects = []
32
- for model in self.all
33
- objects.push(model.as_json(options))
34
- end
35
- objects
61
+ @model_class.new(self, *args)
36
62
  end
37
63
 
38
64
  def inflate_collection(items = [])
39
- @_collection = []
65
+ models = []
40
66
 
41
67
  return unless items.is_a?(Array)
42
68
  items.each do |json|
43
69
  if @model_class < RestfulModel
44
70
  model = @model_class.new(self)
45
- model.instance_variable_set(:@_parent, @_parent)
46
71
  model.inflate(json)
47
72
  else
48
73
  model = @model_class.new(json)
49
74
  end
50
- @_collection.push(model)
75
+ models.push(model)
51
76
  end
52
- @_collection
77
+ models
53
78
  end
54
79
 
55
80
  def path(id = "")
@@ -66,8 +91,7 @@ class RestfulModelCollection
66
91
  RestClient.get(url){ |response,request,result|
67
92
  json = Populr.interpret_response(result, {:expected_class => Object})
68
93
  if @model_class < RestfulModel
69
- model = @model_class.new(@_api)
70
- model.instance_variable_set(:@_parent, @_parent)
94
+ model = @model_class.new(self)
71
95
  model.inflate(json)
72
96
  else
73
97
  model = @model_class.new(json)
@@ -76,14 +100,15 @@ class RestfulModelCollection
76
100
  model
77
101
  end
78
102
 
79
- def get_restful_model_collection
80
- url = @_api.url_for_path(self.path)
103
+ def get_restful_model_collection(offset = 0, count = 50)
104
+ url = @_api.url_for_path("#{self.path}?offset=#{offset}&count=#{count}")
105
+ models = []
81
106
 
82
107
  RestClient.get(url){ |response,request,result|
83
108
  items = Populr.interpret_response(result, {:expected_class => Array})
84
- inflate_collection(items)
109
+ models = inflate_collection(items)
85
110
  }
86
- @_collection
111
+ models
87
112
  end
88
113
 
89
114
  end
@@ -2,9 +2,14 @@ require 'restful_model'
2
2
 
3
3
  class Template < RestfulModel
4
4
 
5
+ attr_accessor :title
5
6
  attr_accessor :name
6
7
  attr_accessor :label_names
7
8
  attr_accessor :api_tags
8
9
  attr_accessor :api_regions
9
10
 
11
+ def pops
12
+ @pops ||= RestfulModelCollection.new(Pop, @_api, self)
13
+ end
14
+
10
15
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "populr"
8
- s.version = "0.1.4"
8
+ s.version = "0.1.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ben Gotow"]
12
- s.date = "2013-04-18"
12
+ s.date = "2013-04-24"
13
13
  s.description = "Gem for interacting with the Populr.me API that allows you to create and publish one-page websites, subscribe to web hooks and receive events when those pages are interacted with. Visit http://www.populr.me/ for more information. "
14
14
  s.email = "ben@populr.me"
15
15
  s.extra_rdoc_files = [
@@ -27,6 +27,7 @@ Gem::Specification.new do |s|
27
27
  "lib/asset.rb",
28
28
  "lib/document_asset.rb",
29
29
  "lib/domain.rb",
30
+ "lib/embed_asset.rb",
30
31
  "lib/image_asset.rb",
31
32
  "lib/pop.rb",
32
33
  "lib/populr.rb",
@@ -12,29 +12,22 @@ describe 'Pop' do
12
12
  it "should accept an API connection followed by a template" do
13
13
  template = Template.new(@api)
14
14
  template._id = '123'
15
- pop = Pop.new(@api, template)
15
+ pop = Pop.new(template)
16
16
  pop.template_id.should == '123'
17
+ pop.instance_variable_get('@_api').should == @api
17
18
  end
18
19
 
19
- it "should accept just a template" do
20
- template = Template.new(@api)
21
- template._id = '123'
22
- pop = Pop.new(template)
23
- pop.template_id.should == '123'
20
+ it "should accept a RestfulModelCollection as a parent" do
21
+ pop = Pop.new(@api.pops)
22
+ pop.template_id.should == nil
23
+ pop.instance_variable_get('@_api').should == @api
24
24
  end
25
25
 
26
26
  end
27
27
 
28
28
  describe "#inflate" do
29
- it "should inflate tracers into embedded tracer objects" do
30
- pop = Pop.new(@api)
31
- pop.inflate(JSON.parse("{\"_id\":\"5107089add02dcaecc000003\",\"created_at\":\"2013-01-28T23:24:10Z\",\"domain\":\"generic\",\"name\":\"Untitled\",\"password\":null,\"slug\":\"\",\"tracers\":[{\"_id\":\"5109b5e0dd02dc5976000001\",\"created_at\":\"2013-01-31T00:08:00Z\",\"name\":\"Facebook\"},{\"_id\":\"5109b5f5dd02dc4c43000002\",\"created_at\":\"2013-01-31T00:08:21Z\",\"name\":\"Twitter\"}],\"published_pop_url\":\"http://group3.lvh.me\",\"unpopulated_api_tags\":[],\"unpopulated_api_regions\":[],\"label_names\":[]}"))
32
- pop.tracers.first.is_a?(Tracer).should == true
33
- pop.tracers.first.name.should == 'Facebook'
34
- end
35
-
36
- it "should set the tracer collection's _parent so the tracer's path returns the full nested path" do
37
- pop = Pop.new(@api)
29
+ it "should create a tracer collection whose _parent is set so the tracer's path returns the full nested path" do
30
+ pop = Pop.new(@api.pops)
38
31
  pop.inflate(JSON.parse("{\"_id\":\"5107089add02dcaecc000003\",\"created_at\":\"2013-01-28T23:24:10Z\",\"domain\":\"generic\",\"name\":\"Untitled\",\"password\":null,\"slug\":\"\",\"tracers\":[{\"_id\":\"5109b5e0dd02dc5976000001\",\"created_at\":\"2013-01-31T00:08:00Z\",\"name\":\"Facebook\"},{\"_id\":\"5109b5f5dd02dc4c43000002\",\"created_at\":\"2013-01-31T00:08:21Z\",\"name\":\"Twitter\"}],\"published_pop_url\":\"http://group3.lvh.me\",\"unpopulated_api_tags\":[],\"unpopulated_api_regions\":[],\"label_names\":[]}"))
39
32
  pop.tracers.path.should == "/pops/#{pop._id}/tracers/"
40
33
  end
@@ -11,51 +11,11 @@ describe 'RestfulModelCollection' do
11
11
  @collection = @populr.pops
12
12
  end
13
13
 
14
- describe "#all" do
15
- it "should call interpret_response to handle standard error cases" do
16
- Populr.should_receive(:interpret_response).and_return([])
17
- templates = @populr.templates.all
18
- end
19
-
20
- context "when the model class is a RestfulModel" do
21
- context "when the server responds correctly" do
22
- before (:each) do
23
- result = double('result')
24
- result.stub(:body).and_return("[{\"_id\":\"5107089add02dcaecc000003\",\"created_at\":\"2013-01-28T23:24:10Z\",\"domain\":\"generic\",\"name\":\"Untitled\",\"password\":null,\"slug\":\"\",\"tracers\":[{\"_id\":\"5109b5e0dd02dc5976000001\",\"created_at\":\"2013-01-31T00:08:00Z\",\"name\":\"Facebook\"},{\"_id\":\"5109b5f5dd02dc4c43000002\",\"created_at\":\"2013-01-31T00:08:21Z\",\"name\":\"Twitter\"}],\"published_pop_url\":\"http://group3.lvh.me\",\"unpopulated_api_tags\":[],\"unpopulated_api_regions\":[],\"label_names\":[]}]")
25
- result.stub(:code).and_return(200)
26
- RestClient.should_receive(:get).and_yield(nil, nil, result)
27
- end
28
-
29
- it "should return an array of model objects" do
30
- pops = @collection.all
31
- pops.count.should == 1
32
- pops.first.is_a?(RestfulModel).should == true
33
- end
34
-
35
- it "should call inflate on each model object" do
36
- Pop.any_instance.should_receive(:inflate)
37
- pops = @collection.all
38
- end
39
- end
40
- end
41
14
 
42
- context "when the model class is not a restfulModel" do
43
- it "should return the same data type in the JSON" do
44
- result = double('result')
45
- result.stub(:body).and_return("[\"a\",\"b\",\"c\"]")
46
- result.stub(:code).and_return(200)
47
- RestClient.should_receive(:get).and_yield(nil, nil, result)
48
- @populr.domains.all.should == ['a','b','c']
49
- end
50
- end
51
- end
52
15
 
53
16
  describe "#first" do
54
17
  it "should return the first item in the all collection" do
55
- result = double('result')
56
- result.stub(:body).and_return("[{\"_id\":\"5107089add02dcaecc000003\",\"created_at\":\"2013-01-28T23:24:10Z\",\"domain\":\"generic\",\"name\":\"Untitled\",\"password\":null,\"slug\":\"\",\"tracers\":[{\"_id\":\"5109b5e0dd02dc5976000001\",\"created_at\":\"2013-01-31T00:08:00Z\",\"name\":\"Facebook\"},{\"_id\":\"5109b5f5dd02dc4c43000002\",\"created_at\":\"2013-01-31T00:08:21Z\",\"name\":\"Twitter\"}],\"published_pop_url\":\"http://group3.lvh.me\",\"unpopulated_api_tags\":[],\"unpopulated_api_regions\":[],\"label_names\":[]}]")
57
- result.stub(:code).and_return(200)
58
- RestClient.should_receive(:get).and_yield(nil, nil, result)
18
+ @collection.stub(:get_restful_model_collection).and_return(['a','b'])
59
19
  @collection.first.should == @collection.all.first
60
20
  end
61
21
  end
@@ -80,6 +40,24 @@ describe 'RestfulModelCollection' do
80
40
  pop._id.should == '5107089add02dcaecc000003'
81
41
  end
82
42
  end
43
+
44
+ it "should return nil and not throw an exception if you fail to pass an ID" do
45
+ @populr.pops.find(nil).should == nil
46
+ end
47
+ end
48
+
49
+ describe "#delete" do
50
+ it "should accept a model to delete" do
51
+ RestClient.should_receive(:delete).with(@populr.url_for_path(@populr.images.path('123')))
52
+ a = ImageAsset.new(@api, nil)
53
+ a._id = '123'
54
+ @populr.images.delete(a)
55
+ end
56
+
57
+ it "should accept a string ID to delete" do
58
+ RestClient.should_receive(:delete).with(@populr.url_for_path(@populr.images.path('123')))
59
+ @populr.images.delete('123')
60
+ end
83
61
  end
84
62
 
85
63
  describe "#build" do
@@ -89,34 +67,95 @@ describe 'RestfulModelCollection' do
89
67
  image.is_a?(ImageAsset).should == true
90
68
  end
91
69
 
92
- it "should pass the api reference, and then any provided arguments" do
70
+ it "should pass the collection, and then any provided arguments" do
93
71
  parameter1 = double('parameter1')
94
- ImageAsset.any_instance.should_receive(:initialize).with(@populr, parameter1)
95
- @populr.images.build(parameter1)
72
+ images = @populr.images
73
+ ImageAsset.any_instance.should_receive(:initialize).with(images, parameter1)
74
+ images.build(parameter1)
75
+ end
76
+ end
77
+
78
+ describe "#all" do
79
+ it "should be a shorthand for requesting the entire range" do
80
+ @populr.images.should_receive(:range).with(0, Float::INFINITY)
81
+ @populr.images.all
96
82
  end
97
83
  end
98
84
 
99
- describe "#as_json" do
85
+ describe "#each" do
86
+ it "should yield each item, starting with the first one" do
87
+ @populr.images.should_receive(:get_restful_model_collection).with(0).and_return(['a','b','c'])
88
+ @populr.images.should_receive(:get_restful_model_collection).with(3).and_return(['d','e','f'])
89
+ @populr.images.should_receive(:get_restful_model_collection).with(6).and_return([])
90
+
91
+ yields = []
92
+ @populr.images.each do |item|
93
+ yields.push(item)
94
+ end
95
+ yields.should == ['a','b','c','d','e','f']
96
+ end
97
+ end
98
+
99
+ describe "#path" do
100
+ it "should prepend it's parent's path if one exists" do
101
+ parent = double('parent')
102
+ parent.stub('path').and_return('/parent/50')
103
+ @populr.images.instance_variable_set(:@_parent, parent)
104
+ @populr.images.path.should == '/parent/50/images/'
105
+ end
106
+
107
+ it "should generate the path using it's model class' collection name" do
108
+ ImageAsset.should_receive(:collection_name).and_return('collection')
109
+ @populr.images.path.should == '/collection/'
110
+ end
111
+
112
+ context "when provided with an ID" do
113
+ it "should append that ID to the end of the collection URL" do
114
+ @populr.images.path(5).should == '/images/5'
115
+ end
116
+ end
117
+ end
118
+
119
+ describe "#range" do
100
120
  before (:each) do
101
- result = double('result')
102
- result.stub(:body).and_return("[{\"_id\":\"5107089add02dcaecc000003\",\"template_id\":\"5107089add02dcaecc000001\",\"created_at\":\"2013-01-28T23:24:10Z\",\"domain\":\"generic\",\"name\":\"Untitled\",\"password\":null,\"slug\":\"\",\"tracers\":[{\"_id\":\"5109b5e0dd02dc5976000001\",\"created_at\":\"2013-01-31T00:08:00Z\",\"name\":\"Facebook\"},{\"_id\":\"5109b5f5dd02dc4c43000002\",\"created_at\":\"2013-01-31T00:08:21Z\",\"name\":\"Twitter\"}],\"published_pop_url\":\"http://group3.lvh.me\",\"unpopulated_api_tags\":[],\"unpopulated_api_regions\":[],\"label_names\":[]}]")
103
- result.stub(:code).and_return(200)
104
- RestClient.should_receive(:get).and_yield(nil, nil, result)
121
+ @items = []
122
+ 200.times do
123
+ @items.push((65 + rand(25)).chr)
124
+ end
105
125
  end
106
126
 
107
- it "should call as_json for each model in the collection" do
108
- Pop.any_instance.should_receive(:as_json)
109
- @collection.as_json
127
+ it "should return the first fifty rows by default" do
128
+ @populr.images.should_receive(:get_restful_model_collection).with(0,50).and_return(@items[0..49])
129
+ @populr.images.range.should == @items[0..49]
110
130
  end
111
131
 
112
- it "should return an array of hashes" do
113
- @collection.as_json.count.should == 1
114
- @collection.as_json.first['_id'].should == '5107089add02dcaecc000003'
132
+ context "when a count is provided" do
133
+ it "should fetch chunks until it has enough rows, and then return exactly the number requested" do
134
+ @populr.images.should_receive(:get_restful_model_collection).with(0,50).and_return(@items[0..49])
135
+ @populr.images.should_receive(:get_restful_model_collection).with(50,50).and_return(@items[50..99])
136
+ @populr.images.range(0,100).count.should == 100
137
+ end
138
+
139
+ it "should return early if a request for a chunk returns fewer rows than requested" do
140
+ @populr.images.should_receive(:get_restful_model_collection).with(0,50).and_return(@items[0..49])
141
+ @populr.images.should_receive(:get_restful_model_collection).with(50,50).and_return(@items[50..59])
142
+ @populr.images.range(0,100).count.should == 60
143
+ end
144
+
145
+ it "should return early if a request for a chunk returns 0 rows" do
146
+ @populr.images.should_receive(:get_restful_model_collection).with(0,50).and_return(@items[0..49])
147
+ @populr.images.should_receive(:get_restful_model_collection).with(50,50).and_return([])
148
+ @populr.images.range(0,100).count.should == 50
149
+ end
115
150
  end
116
151
 
117
- it "should forward options to each model" do
118
- Pop.any_instance.should_receive(:as_json).with(:bla => true)
119
- @collection.as_json(:bla => true)
152
+ context "when an offset is provided" do
153
+ it "should return results from that offset forward" do
154
+ @populr.images.should_receive(:get_restful_model_collection).with(100,50).and_return(@items[100..149])
155
+ @populr.images.should_receive(:get_restful_model_collection).with(150,50).and_return(@items[150..199])
156
+ @populr.images.should_receive(:get_restful_model_collection).with(200,50).and_return([])
157
+ @populr.images.range(100, 200).should == @items[100..200]
158
+ end
120
159
  end
121
160
  end
122
161
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: populr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-18 00:00:00.000000000 Z
12
+ date: 2013-04-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
16
- requirement: &70154768151180 !ruby/object:Gem::Requirement
16
+ requirement: &70343202086340 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '1.6'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70154768151180
24
+ version_requirements: *70343202086340
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: shoulda
27
- requirement: &70154768150640 !ruby/object:Gem::Requirement
27
+ requirement: &70343202085160 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70154768150640
35
+ version_requirements: *70343202085160
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rdoc
38
- requirement: &70154768150060 !ruby/object:Gem::Requirement
38
+ requirement: &70343202084200 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '3.12'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70154768150060
46
+ version_requirements: *70343202084200
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bundler
49
- requirement: &70154768149560 !ruby/object:Gem::Requirement
49
+ requirement: &70343202082840 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.3.5
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70154768149560
57
+ version_requirements: *70343202082840
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: jeweler
60
- requirement: &70154768148980 !ruby/object:Gem::Requirement
60
+ requirement: &70343202081860 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: 1.8.4
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70154768148980
68
+ version_requirements: *70343202081860
69
69
  description: ! 'Gem for interacting with the Populr.me API that allows you to create
70
70
  and publish one-page websites, subscribe to web hooks and receive events when those
71
71
  pages are interacted with. Visit http://www.populr.me/ for more information. '
@@ -86,6 +86,7 @@ files:
86
86
  - lib/asset.rb
87
87
  - lib/document_asset.rb
88
88
  - lib/domain.rb
89
+ - lib/embed_asset.rb
89
90
  - lib/image_asset.rb
90
91
  - lib/pop.rb
91
92
  - lib/populr.rb
@@ -115,7 +116,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
115
116
  version: '0'
116
117
  segments:
117
118
  - 0
118
- hash: -3561322991411093630
119
+ hash: -4567027092822148073
119
120
  required_rubygems_version: !ruby/object:Gem::Requirement
120
121
  none: false
121
122
  requirements: