leancloud-ruby-client 0.1.0

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 (99) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +9 -0
  3. data/Gemfile +16 -0
  4. data/Gemfile.lock +86 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.md +1177 -0
  7. data/Rakefile +45 -0
  8. data/VERSION +1 -0
  9. data/example.rb +35 -0
  10. data/features.md +1111 -0
  11. data/fixtures/vcr_cassettes/test_acls_arent_objects.yml +274 -0
  12. data/fixtures/vcr_cassettes/test_array_add.yml +213 -0
  13. data/fixtures/vcr_cassettes/test_array_add_pointerizing.yml +380 -0
  14. data/fixtures/vcr_cassettes/test_array_add_unique.yml +319 -0
  15. data/fixtures/vcr_cassettes/test_batch_create_object.yml +107 -0
  16. data/fixtures/vcr_cassettes/test_batch_delete_object.yml +637 -0
  17. data/fixtures/vcr_cassettes/test_batch_run.yml +109 -0
  18. data/fixtures/vcr_cassettes/test_batch_update_nils_delete_keys.yml +435 -0
  19. data/fixtures/vcr_cassettes/test_batch_update_object.yml +637 -0
  20. data/fixtures/vcr_cassettes/test_contains_all.yml +1143 -0
  21. data/fixtures/vcr_cassettes/test_cql.yml +99 -0
  22. data/fixtures/vcr_cassettes/test_created_at.yml +109 -0
  23. data/fixtures/vcr_cassettes/test_decrement.yml +213 -0
  24. data/fixtures/vcr_cassettes/test_deep_parse.yml +321 -0
  25. data/fixtures/vcr_cassettes/test_destroy.yml +213 -0
  26. data/fixtures/vcr_cassettes/test_empty_response.yml +1026 -0
  27. data/fixtures/vcr_cassettes/test_eq_pointerize.yml +427 -0
  28. data/fixtures/vcr_cassettes/test_equality.yml +321 -0
  29. data/fixtures/vcr_cassettes/test_get.yml +215 -0
  30. data/fixtures/vcr_cassettes/test_get_installation.yml +58 -0
  31. data/fixtures/vcr_cassettes/test_get_missing.yml +160 -0
  32. data/fixtures/vcr_cassettes/test_image_file_associate_with_object.yml +2089 -0
  33. data/fixtures/vcr_cassettes/test_image_file_save.yml +1928 -0
  34. data/fixtures/vcr_cassettes/test_include.yml +321 -0
  35. data/fixtures/vcr_cassettes/test_new_model.yml +109 -0
  36. data/fixtures/vcr_cassettes/test_new_object.yml +109 -0
  37. data/fixtures/vcr_cassettes/test_nils_delete_keys.yml +319 -0
  38. data/fixtures/vcr_cassettes/test_object_id.yml +56 -0
  39. data/fixtures/vcr_cassettes/test_parse_delete.yml +421 -0
  40. data/fixtures/vcr_cassettes/test_pointer.yml +109 -0
  41. data/fixtures/vcr_cassettes/test_request_sms.yml +48 -0
  42. data/fixtures/vcr_cassettes/test_reset_password.yml +109 -0
  43. data/fixtures/vcr_cassettes/test_retries.yml +4173 -0
  44. data/fixtures/vcr_cassettes/test_retries_404.yml +1026 -0
  45. data/fixtures/vcr_cassettes/test_retries_404_correct.yml +1026 -0
  46. data/fixtures/vcr_cassettes/test_retries_json_error.yml +2265 -0
  47. data/fixtures/vcr_cassettes/test_retries_server_error.yml +2265 -0
  48. data/fixtures/vcr_cassettes/test_save_installation.yml +58 -0
  49. data/fixtures/vcr_cassettes/test_save_with_sub_objects.yml +484 -0
  50. data/fixtures/vcr_cassettes/test_saving_boolean_values.yml +215 -0
  51. data/fixtures/vcr_cassettes/test_saving_nested_objects.yml +62 -0
  52. data/fixtures/vcr_cassettes/test_server_update.yml +586 -0
  53. data/fixtures/vcr_cassettes/test_simple_save.yml +109 -0
  54. data/fixtures/vcr_cassettes/test_text_file_save.yml +109 -0
  55. data/fixtures/vcr_cassettes/test_update.yml +213 -0
  56. data/fixtures/vcr_cassettes/test_updated_at.yml +213 -0
  57. data/fixtures/vcr_cassettes/test_user_login.yml +276 -0
  58. data/fixtures/vcr_cassettes/test_user_save.yml +109 -0
  59. data/fixtures/vcr_cassettes/test_xget.yml +603 -0
  60. data/leancloud-ruby-client.gemspec +166 -0
  61. data/lib/faraday/better_retry.rb +94 -0
  62. data/lib/faraday/extended_parse_json.rb +39 -0
  63. data/lib/faraday/get_method_override.rb +32 -0
  64. data/lib/leancloud-ruby-client.rb +34 -0
  65. data/lib/leancloud/application.rb +7 -0
  66. data/lib/leancloud/batch.rb +53 -0
  67. data/lib/leancloud/client.rb +149 -0
  68. data/lib/leancloud/cloud.rb +28 -0
  69. data/lib/leancloud/datatypes.rb +355 -0
  70. data/lib/leancloud/error.rb +42 -0
  71. data/lib/leancloud/installation.rb +57 -0
  72. data/lib/leancloud/model.rb +14 -0
  73. data/lib/leancloud/object.rb +252 -0
  74. data/lib/leancloud/protocol.rb +193 -0
  75. data/lib/leancloud/push.rb +48 -0
  76. data/lib/leancloud/query.rb +194 -0
  77. data/lib/leancloud/user.rb +38 -0
  78. data/lib/leancloud/util.rb +93 -0
  79. data/test/cloud_functions/MyCloudCode/cloud/main.js +4 -0
  80. data/test/config/global.json +14 -0
  81. data/test/helper.rb +108 -0
  82. data/test/middleware/better_retry_test.rb +57 -0
  83. data/test/middleware/extend_parse_json_test.rb +55 -0
  84. data/test/parsers.jpg +0 -0
  85. data/test/test_batch.rb +132 -0
  86. data/test/test_client.rb +183 -0
  87. data/test/test_cloud.rb +31 -0
  88. data/test/test_datatypes.rb +105 -0
  89. data/test/test_file.rb +67 -0
  90. data/test/test_init.rb +23 -0
  91. data/test/test_init_from_cloud_code.rb +8 -0
  92. data/test/test_installation.rb +49 -0
  93. data/test/test_model.rb +22 -0
  94. data/test/test_object.rb +295 -0
  95. data/test/test_push.rb +45 -0
  96. data/test/test_query.rb +198 -0
  97. data/test/test_throttle.rb +5 -0
  98. data/test/test_user.rb +60 -0
  99. metadata +298 -0
data/test/test_push.rb ADDED
@@ -0,0 +1,45 @@
1
+ require 'helper'
2
+
3
+ class TestPush < AVTestCase
4
+
5
+ def test_save_without_where
6
+ data = {:foo => 'bar',
7
+ :alert => 'message'}
8
+ pf_push = AV::Push.new(data, "some_chan")
9
+ pf_push.type = 'ios'
10
+
11
+ query = AV::Query.new(AV::Protocol::CLASS_INSTALLATION).eq('deviceToken', 'baz')
12
+
13
+ AV::Client.any_instance.expects(:request).with do |uri, method, body, query|
14
+ hash = JSON.parse(body)
15
+ assert_equal :post, method
16
+ assert has_entries('type' => 'ios', 'channel' => "some_chan").matches?([hash])
17
+ assert has_entries('foo' => 'bar', 'alert' => 'message').matches?([hash['data']])
18
+ assert_nil query
19
+ true
20
+ end.returns({}.to_json)
21
+
22
+ pf_push.save
23
+ end
24
+
25
+
26
+ def test_save_with_where_removes_channel
27
+ data = {:foo => 'bar',
28
+ :alert => 'message'}
29
+ pf_push = AV::Push.new(data, "some_chan")
30
+ pf_push.type = 'ios'
31
+
32
+ query = AV::Query.new(AV::Protocol::CLASS_INSTALLATION).eq('deviceToken', 'baz')
33
+ pf_push.where = query.where
34
+
35
+ AV::Client.any_instance.expects(:request).with do |uri, method, body, query|
36
+ hash = JSON.parse(body)
37
+ assert_false has_entries('channel' => "some_chan").matches?([hash])
38
+ assert has_entries('deviceToken' => 'baz').matches?([hash['where']])
39
+ true
40
+ end.returns({}.to_json)
41
+
42
+ pf_push.save
43
+ end
44
+
45
+ end
@@ -0,0 +1,198 @@
1
+ require 'helper'
2
+
3
+ class TestQuery < AVTestCase
4
+
5
+ EMPTY_QUERY_RESPONSE = {AV::Protocol::KEY_RESULTS => []}
6
+
7
+ def test_get
8
+ VCR.use_cassette('test_get', :record => :new_episodes) do
9
+ post = AV::Object.new "Post"
10
+ post["title"] = "foo"
11
+ post.save
12
+
13
+ q = AV.get("Post", post.id)
14
+
15
+ assert_equal q.id, post.id
16
+ assert_equal q["title"], post["title"]
17
+ end
18
+ end
19
+
20
+ def test_add_contraint
21
+ # I know this method *should* be private.
22
+ # But then it would be a PITA to test.
23
+ # I'd rather test this one method than pointlessly test many others.
24
+ # Thus is life.
25
+
26
+ q = AV::Query.new "TestQuery"
27
+ q.add_constraint("points", 5)
28
+ assert_equal q.where["points"], 5
29
+ q.add_constraint("player", { "$regex" => "regex voodoo"})
30
+ assert_equal q.where["player"], { "$regex" => "regex voodoo"}
31
+ end
32
+
33
+ def test_related_to
34
+ q = AV::Query.new "Comment"
35
+ pointer = AV::Pointer.new(class_name: "Post", parse_object_id: '1234')
36
+ q.related_to("comments", pointer)
37
+
38
+ assert_not_nil q.where["$relatedTo"]
39
+ assert_equal pointer, q.where["$relatedTo"]["object"]
40
+ assert_equal q.where["$relatedTo"]["key"], "comments"
41
+ end
42
+
43
+ def test_eq
44
+ q = AV::Query.new "TestQuery"
45
+ q.eq("points", 5)
46
+ assert_equal q.where, {"points" => 5}
47
+ q.eq("player", "michael@jordan.com")
48
+ assert_equal q.where, {"points" => 5, "player" => "michael@jordan.com"}
49
+ end
50
+
51
+ def test_eq_pointerize
52
+ VCR.use_cassette('test_eq_pointerize', :record => :new_episodes) do
53
+ foo = AV::Object.new("Foo")
54
+ foo.save
55
+ bar = AV::Object.new("Bar", "foo" => foo.pointer, "bar" => "bar")
56
+ bar.save
57
+
58
+ assert_equal "bar", AV::Query.new("Bar").eq("foo", foo.pointer).get.first["bar"]
59
+ assert_equal "bar", AV::Query.new("Bar").eq("foo", foo).get.first["bar"]
60
+ end
61
+ end
62
+
63
+ def test_limit_skip
64
+ VCR.use_cassette('test_limit_skip', :record => :new_episodes) do
65
+ q = AV::Query.new "TestQuery"
66
+ q.limit = 2
67
+ q.skip = 3
68
+ query_matcher = has_entries(:limit => 2, :skip => 3)
69
+ AV::Client.any_instance.expects(:request).with(anything, :get, nil, query_matcher).returns(EMPTY_QUERY_RESPONSE)
70
+ q.get
71
+ end
72
+ end
73
+
74
+ def test_count
75
+ VCR.use_cassette('test_count', :record => :new_episodes) do
76
+ q = AV::Query.new "TestQuery"
77
+ q.count = true
78
+ query_matcher = has_entries(:count => true)
79
+ AV::Client.any_instance.expects(:request).with(anything, :get, nil, query_matcher).returns(EMPTY_QUERY_RESPONSE.merge("count" => 1000))
80
+ results = q.get
81
+ assert_equal 1000, results['count']
82
+ end
83
+ end
84
+
85
+ def test_include
86
+ VCR.use_cassette('test_include', :record => :new_episodes) do
87
+ post_1 = AV::Object.new "Post"
88
+ post_1['title'] = 'foo'
89
+ post_1.save
90
+
91
+ post_2 = AV::Object.new "Post"
92
+ post_2['title'] = 'bar'
93
+ post_2['other'] = post_1.pointer
94
+ post_2.save
95
+
96
+ q = AV::Query.new "Post"
97
+ q.eq('objectId', post_2.parse_object_id)
98
+ q.include = 'other'
99
+
100
+ assert_equal 'foo', q.get.first['other']['title']
101
+ end
102
+ end
103
+
104
+ def test_or
105
+ #VCR.use_cassette('test_or', :record => :new_episodes) do
106
+ foo = AV::Object.new "Post"
107
+ foo["random"] = rand
108
+ foo.save
109
+ foo_query = AV::Query.new("Post").eq("random", foo["random"])
110
+ assert_equal 1, foo_query.get.size
111
+
112
+ bar = AV::Object.new "Post"
113
+ bar["random"] = rand
114
+ bar.save
115
+ bar_query = AV::Query.new("Post").eq("random", bar["random"])
116
+ assert_equal 1, foo_query.get.size
117
+
118
+ query = foo_query.or(bar_query)
119
+ assert_equal 2, query.get.size
120
+ #end
121
+ end
122
+
123
+ def test_in_query
124
+ outer_query = AV::Query.new "Outer"
125
+ inner_query = AV::Query.new "Inner"
126
+ inner_query.eq("foo", "bar")
127
+ outer_query.in_query("inner", inner_query)
128
+ assert_equal({"inner"=>{"$inQuery"=>{"className"=>"Inner", "where"=>{"foo"=>"bar"}}}}, outer_query.where)
129
+ end
130
+
131
+ def test_large_value_in_xget
132
+ VCR.use_cassette('test_xget', :record => :new_episodes) do
133
+ post = AV::Object.new("Post")
134
+ post['title']= 'foo'
135
+ post.save
136
+
137
+ other_post = AV::Object.new("Post")
138
+ other_post['title']= 'foo'
139
+ other_post.save
140
+
141
+ assert_equal [post], AV::Query.new("Post").value_in("objectId", [post.id] + 100.times.map { "x" }).get
142
+ end
143
+ end
144
+
145
+ def test_bad_response
146
+ VCR.use_cassette('test_bad_response', :record => :new_episodes) do
147
+ AV::Client.any_instance.expects(:request).returns("crap")
148
+ assert_raises do
149
+ AV::Query.new("Post").get
150
+ end
151
+ end
152
+ end
153
+
154
+ def test_contains_all
155
+ VCR.use_cassette('test_contains_all', :record => :new_episodes) do
156
+
157
+ #ensure cacti from the previous test to not hang around
158
+ q = AV::Query.new "Cactus"
159
+ cacti = q.get
160
+ cacti.each do |cactus|
161
+ cactus.parse_delete
162
+ end
163
+ #end ensure
164
+
165
+ cactus = AV::Object.new "Cactus"
166
+ cactus['array'] = [1, 2, 5, 6, 7]
167
+ cactus.save
168
+
169
+ second_cactus = AV::Object.new "Cactus"
170
+ second_cactus['array'] = [3, 4, 5, 6]
171
+ second_cactus.save
172
+
173
+ contains_query = AV::Query.new("Cactus").contains_all('array', [5, 6])
174
+ assert_equal 2, contains_query.get.size
175
+
176
+ with_one_query = AV::Query.new("Cactus").contains_all('array', [1,5,6])
177
+ assert_equal 1, with_one_query.get.size
178
+ assert_equal [cactus], with_one_query.get
179
+
180
+ with_four_query = AV::Query.new("Cactus").contains_all('array', [4,5,6])
181
+ assert_equal 1, with_four_query.get.size
182
+ assert_equal [second_cactus], with_four_query.get
183
+
184
+ with_nine_query = AV::Query.new("Cactus").contains_all('array', [9])
185
+ assert_equal 0, with_nine_query.get.size
186
+ end
187
+ end
188
+
189
+ def test_cql
190
+ VCR.use_cassette('test_cql', :record => :new_episodes) do
191
+ post = AV::Object.new 'Post',:title => 'foo'
192
+ post.save
193
+ ret = AV::Query.do_cloud_query('select *,count(*) from Post')
194
+ assert_true ret[:count] > 0
195
+ assert_true ret[:results].size>0
196
+ end
197
+ end
198
+ end
@@ -0,0 +1,5 @@
1
+ require 'helper'
2
+
3
+ class TestQuery < AVTestCase
4
+
5
+ end
data/test/test_user.rb ADDED
@@ -0,0 +1,60 @@
1
+ require 'helper'
2
+
3
+ class TestUser < AVTestCase
4
+
5
+ def test_user_save
6
+ VCR.use_cassette('test_user_save', :record => :new_episodes) do
7
+ username = rand.to_s
8
+ data = {
9
+ :username => username,
10
+ :password => "topsecret"
11
+ }
12
+ user = AV::User.new data
13
+ user.save
14
+ assert_equal user[AV::Protocol::KEY_OBJECT_ID].class, String
15
+ assert_equal user[AV::Protocol::KEY_CREATED_AT].class, String
16
+ end
17
+ end
18
+
19
+ def test_user_login
20
+ #VCR.use_cassette('test_user_login', :record => :new_episodes) do
21
+ u = "alan" + rand(10000000000000).to_s
22
+ data = {
23
+ :username => u,
24
+ :password => "secret"
25
+ }
26
+
27
+ user = AV::User.new(data)
28
+
29
+ user.save
30
+
31
+ assert_equal user["username"], u
32
+ assert_equal user[AV::Protocol::KEY_USER_SESSION_TOKEN].class, String
33
+
34
+ login = AV::User.authenticate(u, "secret")
35
+
36
+ assert_equal login["username"], user["username"]
37
+ assert_equal login["sessionToken"].class, String
38
+
39
+ user = user.pointer.get
40
+ user.save
41
+ #end
42
+ end
43
+
44
+ def test_reset_password
45
+ u = "alan" + rand(10000000000000).to_s + "@gmail.com"
46
+ data = {
47
+ :username => u,
48
+ :password => "secret"
49
+ }
50
+
51
+ user = AV::User.new(data)
52
+
53
+ user.save
54
+
55
+ reset_password = AV::User.reset_password(u)
56
+
57
+ assert_equal Hash.new, reset_password
58
+ end
59
+
60
+ end
metadata ADDED
@@ -0,0 +1,298 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: leancloud-ruby-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Alan deLevie
8
+ - Adam Alpern
9
+ - Dennis Zhuang
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2015-04-10 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: faraday
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - '>='
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: faraday_middleware
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: bundler
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: shoulda
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ - !ruby/object:Gem::Dependency
72
+ name: test-unit
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - '='
76
+ - !ruby/object:Gem::Version
77
+ version: 2.5.0
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - '='
83
+ - !ruby/object:Gem::Version
84
+ version: 2.5.0
85
+ - !ruby/object:Gem::Dependency
86
+ name: mocha
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - '='
90
+ - !ruby/object:Gem::Version
91
+ version: 0.12.0
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - '='
97
+ - !ruby/object:Gem::Version
98
+ version: 0.12.0
99
+ - !ruby/object:Gem::Dependency
100
+ name: jeweler
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ~>
104
+ - !ruby/object:Gem::Version
105
+ version: 1.8.5
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ~>
111
+ - !ruby/object:Gem::Version
112
+ version: 1.8.5
113
+ - !ruby/object:Gem::Dependency
114
+ name: simplecov
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ - !ruby/object:Gem::Dependency
128
+ name: webmock
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 1.9.0
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ~>
139
+ - !ruby/object:Gem::Version
140
+ version: 1.9.0
141
+ - !ruby/object:Gem::Dependency
142
+ name: vcr
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - '>='
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - '>='
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ - !ruby/object:Gem::Dependency
156
+ name: pry
157
+ requirement: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - '>='
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ type: :development
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - '>='
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ description: A simple Ruby client for the leancloud.cn REST API
170
+ email: killme2008@gmail.com
171
+ executables: []
172
+ extensions: []
173
+ extra_rdoc_files:
174
+ - LICENSE.txt
175
+ - README.md
176
+ files:
177
+ - .travis.yml
178
+ - Gemfile
179
+ - Gemfile.lock
180
+ - LICENSE.txt
181
+ - README.md
182
+ - Rakefile
183
+ - VERSION
184
+ - example.rb
185
+ - features.md
186
+ - fixtures/vcr_cassettes/test_acls_arent_objects.yml
187
+ - fixtures/vcr_cassettes/test_array_add.yml
188
+ - fixtures/vcr_cassettes/test_array_add_pointerizing.yml
189
+ - fixtures/vcr_cassettes/test_array_add_unique.yml
190
+ - fixtures/vcr_cassettes/test_batch_create_object.yml
191
+ - fixtures/vcr_cassettes/test_batch_delete_object.yml
192
+ - fixtures/vcr_cassettes/test_batch_run.yml
193
+ - fixtures/vcr_cassettes/test_batch_update_nils_delete_keys.yml
194
+ - fixtures/vcr_cassettes/test_batch_update_object.yml
195
+ - fixtures/vcr_cassettes/test_contains_all.yml
196
+ - fixtures/vcr_cassettes/test_cql.yml
197
+ - fixtures/vcr_cassettes/test_created_at.yml
198
+ - fixtures/vcr_cassettes/test_decrement.yml
199
+ - fixtures/vcr_cassettes/test_deep_parse.yml
200
+ - fixtures/vcr_cassettes/test_destroy.yml
201
+ - fixtures/vcr_cassettes/test_empty_response.yml
202
+ - fixtures/vcr_cassettes/test_eq_pointerize.yml
203
+ - fixtures/vcr_cassettes/test_equality.yml
204
+ - fixtures/vcr_cassettes/test_get.yml
205
+ - fixtures/vcr_cassettes/test_get_installation.yml
206
+ - fixtures/vcr_cassettes/test_get_missing.yml
207
+ - fixtures/vcr_cassettes/test_image_file_associate_with_object.yml
208
+ - fixtures/vcr_cassettes/test_image_file_save.yml
209
+ - fixtures/vcr_cassettes/test_include.yml
210
+ - fixtures/vcr_cassettes/test_new_model.yml
211
+ - fixtures/vcr_cassettes/test_new_object.yml
212
+ - fixtures/vcr_cassettes/test_nils_delete_keys.yml
213
+ - fixtures/vcr_cassettes/test_object_id.yml
214
+ - fixtures/vcr_cassettes/test_parse_delete.yml
215
+ - fixtures/vcr_cassettes/test_pointer.yml
216
+ - fixtures/vcr_cassettes/test_request_sms.yml
217
+ - fixtures/vcr_cassettes/test_reset_password.yml
218
+ - fixtures/vcr_cassettes/test_retries.yml
219
+ - fixtures/vcr_cassettes/test_retries_404.yml
220
+ - fixtures/vcr_cassettes/test_retries_404_correct.yml
221
+ - fixtures/vcr_cassettes/test_retries_json_error.yml
222
+ - fixtures/vcr_cassettes/test_retries_server_error.yml
223
+ - fixtures/vcr_cassettes/test_save_installation.yml
224
+ - fixtures/vcr_cassettes/test_save_with_sub_objects.yml
225
+ - fixtures/vcr_cassettes/test_saving_boolean_values.yml
226
+ - fixtures/vcr_cassettes/test_saving_nested_objects.yml
227
+ - fixtures/vcr_cassettes/test_server_update.yml
228
+ - fixtures/vcr_cassettes/test_simple_save.yml
229
+ - fixtures/vcr_cassettes/test_text_file_save.yml
230
+ - fixtures/vcr_cassettes/test_update.yml
231
+ - fixtures/vcr_cassettes/test_updated_at.yml
232
+ - fixtures/vcr_cassettes/test_user_login.yml
233
+ - fixtures/vcr_cassettes/test_user_save.yml
234
+ - fixtures/vcr_cassettes/test_xget.yml
235
+ - leancloud-ruby-client.gemspec
236
+ - lib/faraday/better_retry.rb
237
+ - lib/faraday/extended_parse_json.rb
238
+ - lib/faraday/get_method_override.rb
239
+ - lib/leancloud-ruby-client.rb
240
+ - lib/leancloud/application.rb
241
+ - lib/leancloud/batch.rb
242
+ - lib/leancloud/client.rb
243
+ - lib/leancloud/cloud.rb
244
+ - lib/leancloud/datatypes.rb
245
+ - lib/leancloud/error.rb
246
+ - lib/leancloud/installation.rb
247
+ - lib/leancloud/model.rb
248
+ - lib/leancloud/object.rb
249
+ - lib/leancloud/protocol.rb
250
+ - lib/leancloud/push.rb
251
+ - lib/leancloud/query.rb
252
+ - lib/leancloud/user.rb
253
+ - lib/leancloud/util.rb
254
+ - test/cloud_functions/MyCloudCode/cloud/main.js
255
+ - test/config/global.json
256
+ - test/helper.rb
257
+ - test/middleware/better_retry_test.rb
258
+ - test/middleware/extend_parse_json_test.rb
259
+ - test/parsers.jpg
260
+ - test/test_batch.rb
261
+ - test/test_client.rb
262
+ - test/test_cloud.rb
263
+ - test/test_datatypes.rb
264
+ - test/test_file.rb
265
+ - test/test_init.rb
266
+ - test/test_init_from_cloud_code.rb
267
+ - test/test_installation.rb
268
+ - test/test_model.rb
269
+ - test/test_object.rb
270
+ - test/test_push.rb
271
+ - test/test_query.rb
272
+ - test/test_throttle.rb
273
+ - test/test_user.rb
274
+ homepage: http://github.com/killme2008/leancloud-ruby-client
275
+ licenses:
276
+ - MIT
277
+ metadata: {}
278
+ post_install_message:
279
+ rdoc_options: []
280
+ require_paths:
281
+ - lib
282
+ required_ruby_version: !ruby/object:Gem::Requirement
283
+ requirements:
284
+ - - '>='
285
+ - !ruby/object:Gem::Version
286
+ version: '0'
287
+ required_rubygems_version: !ruby/object:Gem::Requirement
288
+ requirements:
289
+ - - '>='
290
+ - !ruby/object:Gem::Version
291
+ version: '0'
292
+ requirements: []
293
+ rubyforge_project:
294
+ rubygems_version: 2.0.6
295
+ signing_key:
296
+ specification_version: 4
297
+ summary: A simple Ruby client for the leancloud.cn REST API
298
+ test_files: []