lean_motion 0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 11a512b0eb4900d63e392c755728747ceaafbabd
4
+ data.tar.gz: 0edccd1ef76eef1b8790fdb754657b09749e4f29
5
+ SHA512:
6
+ metadata.gz: 93ef272d5136b2fabc8db74b670093a1cdda48f153aac7e8d3d28a033b6850c1fa08a385e4bd093ac1d20ae94de6bacd7b388caf1f332688c85fbae271a99756
7
+ data.tar.gz: 71c044f0ec94eef4b4dca0cccf94b3a77bc37c865572a224af2d5bf78286be7c69d6d52789186f9a3201f72744ac0b6cfa8a2eb8b9450e97a44d5a151d828365
data/README.md ADDED
@@ -0,0 +1,76 @@
1
+ # LeanMotion
2
+
3
+ LeanMotion 是一个RubyMotion的Gem,可以更加方便地使用LeanCloud SDK。用更Ruby的写法来操作LeanCloud的数据,类Rails的ActiveRecord,增删查改。
4
+
5
+ ## 安装说明
6
+
7
+ 1、安装gem
8
+ ```
9
+ gem install lean_motion
10
+ ```
11
+
12
+ 2、创建项目
13
+ ```
14
+ lean_motion create app-name
15
+ ```
16
+
17
+ 3、设置LeanCloud的App ID和App Key
18
+ 修改 app_delegate.rb
19
+
20
+ ```
21
+ app_id = "your_app_id"
22
+ app_key = "your_app_key"
23
+ ```
24
+
25
+ 4、运行
26
+ ```
27
+ rake
28
+ ```
29
+
30
+ ## 使用说明
31
+ 1、在LeanCloud后台创建一个Class,比如Product,并添加以下字段
32
+ ```
33
+ name: String
34
+ description: String
35
+ url: String
36
+ ```
37
+
38
+ 2、添加model文件 product.rb,建议放在app/models/目录下
39
+ ```
40
+ class Product
41
+ include LM::Model
42
+
43
+ fields :name, :description, :url
44
+ end
45
+ ```
46
+
47
+ 3、操作数据
48
+
49
+ 新建产品
50
+ ```
51
+ product = Product.new
52
+ product.name = 'iPhone 6'
53
+ product.description = '目前最好的智能手机'
54
+ product.url = 'http://www.apple.com'
55
+ product.save
56
+ ```
57
+
58
+ 产品数量
59
+ ```
60
+ Product.count
61
+ ```
62
+
63
+ 查询产品
64
+ ```
65
+ Product.where(:name=>'iPhone 6').find
66
+ ```
67
+
68
+ 获得第一条记录
69
+ ```
70
+ Product.first
71
+ ```
72
+
73
+ 排序
74
+ ```
75
+ Product.sort(:createdAt=>:desc).find
76
+ ```
data/bin/lean_motion ADDED
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'methadone'
5
+ require 'lean_motion/version'
6
+
7
+ class App
8
+ include Methadone::Main
9
+ include Methadone::CLILogging
10
+ include Methadone::SH
11
+
12
+ main do |command, opt|
13
+ case command.to_sym
14
+ when :create then create(opt)
15
+ when :create_pro then create_pro(opt)
16
+ when :create_user then create_user(opt)
17
+ when :help then show_help
18
+ else show_help
19
+ end
20
+
21
+ 0 # Good!
22
+ end
23
+
24
+ def self.show_help
25
+ info "lean_motion - Command line tools for LeanMotion."
26
+ info "By smartweb"
27
+ info ""
28
+ info "Commands:"
29
+ info " create <appname>"
30
+ info " Creates a new LeanMotion app from a template."
31
+ info ""
32
+ info " create_pro <appname>"
33
+ info " Creates a new LeanMotion + ProMotion app from a template."
34
+ info ""
35
+ info " create_user <appname>"
36
+ info " Creates a new LeanMotion + ProMotion + User app from a template."
37
+ end
38
+
39
+ def self.create(name)
40
+ return puts "Usage: lean_motion create <appname>" unless name.to_s.length > 0
41
+ info "Creating new LeanMotion iOS app #{name}"
42
+ sh "motion create --template=git://coding.net/smartweb/LeanMotionTemplate.git #{name}"
43
+ end
44
+
45
+ def self.create_pro(name)
46
+ return puts "Usage: lean_motion create <appname>" unless name.to_s.length > 0
47
+ info "Creating new LeanMotion iOS app #{name}"
48
+ sh "motion create --template=git://coding.net/smartweb/LeanProMotionTemplate.git #{name}"
49
+ end
50
+
51
+ def self.create_user(name)
52
+ return puts "Usage: lean_motion create <appname>" unless name.to_s.length > 0
53
+ info "Creating new LeanMotion iOS app #{name}"
54
+ sh "motion create --template=git://coding.net/smartweb/LeanUserTemplate.git #{name}"
55
+ end
56
+
57
+ description "Command line for LeanMotion."
58
+
59
+ arg :command
60
+ arg :opt, :optional
61
+
62
+ version LeanMotion::VERSION
63
+
64
+ go!
65
+ end
@@ -0,0 +1,17 @@
1
+ unless defined?(Motion::Project::Config)
2
+ raise "The lean_motion gem must be required within a RubyMotion project Rakefile."
3
+ end
4
+
5
+ Motion::Project::App.setup do |app|
6
+ core_lib = File.join(File.dirname(__FILE__), 'lean_motion')
7
+ insert_point = app.files.find_index { |file| file =~ /^(?:\.\/)?app\// } || 0
8
+
9
+ Dir.glob(File.join(core_lib, '**/*.rb')).reverse.each do |file|
10
+ app.files.insert(insert_point, file)
11
+ end
12
+
13
+ app.vendor_project('vendor/AVOSCloud.framework',
14
+ :static,
15
+ :products => ['AVOSCloud'],
16
+ :headers_dir => 'Headers')
17
+ end
@@ -0,0 +1,9 @@
1
+ module LeanMotion
2
+
3
+ def self.run(function_name, params, &block)
4
+ AVCloud.callFunctionInBackground(function_name, withParameters:params, block:lambda do |object, error|
5
+ block.call(object, error)
6
+ end)
7
+ end
8
+
9
+ end
@@ -0,0 +1,21 @@
1
+ module LeanMotion
2
+ class Config
3
+
4
+ def self.init(app_id, app_key)
5
+ if app_id == "your_app_id" || app_key == "your_app_key"
6
+ NSLog("=========== LeanMotion Error ==========")
7
+ NSLog("LeanCloud App ID and App Key require")
8
+ NSLog("=======================================")
9
+ return
10
+ end
11
+
12
+ AVOSCloud.setApplicationId(app_id, clientKey:app_key)
13
+ AVOSCloud.useAVCloudCN
14
+ end
15
+
16
+ def self.channel(name)
17
+ AVAnalytics.setChannel name
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ module LeanMotion
2
+ end
3
+ ::LM = LeanMotion unless defined?(::LM)
@@ -0,0 +1,322 @@
1
+ module LeanMotion
2
+ module Model
3
+ attr_accessor :AVObject, :errors
4
+
5
+ RESERVED_KEYS = [:objectId, :createdAt, :updatedAt]
6
+
7
+ def initialize(av=nil)
8
+ if av
9
+ self.AVObject = av
10
+ else
11
+ self.AVObject = AVObject.objectWithClassName(self.class.to_s)
12
+ end
13
+
14
+ self
15
+ end
16
+
17
+ def method_missing(method, *args, &block)
18
+ method = method.to_sym
19
+ setter = false
20
+
21
+ if setter?(method)
22
+ setter = true
23
+ method = method.split("=")[0].to_sym
24
+ end
25
+
26
+ # Setters
27
+ if RESERVED_KEYS.include?(method) && setter
28
+ return self.AVObject.send("#{method}=", args)
29
+ elsif fields.include?(method) && setter
30
+ return setField(method, args.first)
31
+ # Getters
32
+ elsif RESERVED_KEYS.include?(method)
33
+ return self.AVObject.send(method)
34
+ elsif fields.include? method
35
+ return getField(method)
36
+ elsif self.AVObject.respond_to?("#{method}=")
37
+ return self.AVObject.send("#{method}=", *args, &block)
38
+ elsif self.AVObject.respond_to?(method)
39
+ return self.AVObject.send(method, *args, &block)
40
+ else
41
+ super
42
+ end
43
+ end
44
+
45
+ def getter?(method)
46
+ !setter?(method)
47
+ end
48
+
49
+ def setter?(method)
50
+ method.to_s.include?("=")
51
+ end
52
+
53
+ # Override of ruby's respond_to?
54
+ #
55
+ # @param [Symbol] method
56
+ # @return [Bool] true/false
57
+ def respond_to?(method)
58
+ if setter?(method)
59
+ method = method.to_s.split("=")[0]
60
+ end
61
+
62
+ method = method.to_sym unless method.is_a? Symbol
63
+
64
+ return true if fields.include?(method)
65
+
66
+ super
67
+ end
68
+
69
+ def fields
70
+ self.class.send(:get_fields)
71
+ end
72
+
73
+
74
+ def getField(field)
75
+ field = field.to_sym
76
+ return @AVObject.send(field) if RESERVED_KEYS.include?(field)
77
+ return @AVObject[field] if fields.include? field
78
+ raise "AVCloud Exception: Invalid field name #{field} for object #{self.class.to_s}"
79
+ end
80
+
81
+ def setField(field, value)
82
+ if RESERVED_KEYS.include?(field) || fields.include?(field.to_sym)
83
+ return @AVObject.removeObjectForKey(field.to_s) if value.nil?
84
+ return @AVObject.send("#{field}=", value) if RESERVED_KEYS.include?(field)
85
+ return @AVObject[field] = value
86
+ else
87
+ raise "AVCloud Exception: Invalid field name #{field} for object #{self.class.to_s}"
88
+ end
89
+ end
90
+
91
+ # Returns all of the attributes of the Model
92
+ #
93
+ # @return [Hash] attributes of Model
94
+ def attributes
95
+ attributes = {}
96
+ fields.each do |f|
97
+ attributes[f] = getField(f)
98
+ end
99
+ @attributes = attributes
100
+ end
101
+
102
+ # Sets the attributes of the Model
103
+ #
104
+ # @param [Hash] attrs to set on the Model
105
+ # @return [Hash] that you gave it
106
+ # @note will throw an error if a key is invalid
107
+ def attributes=(attrs)
108
+ attrs.each do |k, v|
109
+ if v.respond_to?(:each) && !v.is_a?(AVObject)
110
+ self.attributes = v
111
+ elsif self.respond_to? "#{k}="
112
+ self.send("#{k}=", v)
113
+ else
114
+ setField(k, v) unless k.nil?
115
+ end
116
+ end
117
+ end
118
+
119
+ # Save the current state of the Model to Parse
120
+ #
121
+ # @note calls before/after_save hooks
122
+ # @note before_save MUST return true, or save will not be called on AVObject
123
+ # @note does not save if validations fail
124
+ #
125
+ # @return [Bool] true/false
126
+ def save
127
+ saved = false
128
+ unless before_save == false
129
+ self.validate
130
+
131
+ if @errors && @errors.length > 0
132
+ saved = false
133
+ else
134
+ saved = @AVObject.save
135
+ end
136
+
137
+ after_save if saved
138
+ end
139
+ saved
140
+ end
141
+ def before_save; end
142
+ def after_save; end
143
+
144
+ def validate
145
+ reset_errors
146
+ self.attributes.each do |field, value|
147
+ validateField field, value
148
+ end
149
+ end
150
+
151
+ # Checks to see if the current Model has errors
152
+ #
153
+ # @return [Bool] true/false
154
+ def is_valid?
155
+ self.validate
156
+ return false if @errors && @errors.length > 0
157
+ true
158
+ end
159
+
160
+ def delete
161
+ deleted = false
162
+ unless before_delete == false
163
+ deleted = @AVObject.delete
164
+ end
165
+ after_delete if deleted
166
+ deleted
167
+ end
168
+ def before_delete; end
169
+ def after_delete; end
170
+
171
+
172
+ # Validations
173
+ def presenceValidations
174
+ self.class.send(:get_presence_validations)
175
+ end
176
+
177
+ def presenceValidationMessages
178
+ self.class.send(:get_presence_validation_messages)
179
+ end
180
+
181
+
182
+
183
+ def validateField(field, value)
184
+ @errors ||= {}
185
+ if presenceValidations.include?(field) && (value.nil? || value == "")
186
+ messages = presenceValidationMessages
187
+ if messages.include?(field)
188
+ @errors[field] = messages[field]
189
+ else
190
+ @errors[field] = "#{field} can't be blank"
191
+ end
192
+ end
193
+ end
194
+
195
+ def errorForField(field)
196
+ @errors[field] || false
197
+ end
198
+
199
+ def errors
200
+ @errors
201
+ end
202
+
203
+ def valid?
204
+ self.errors.nil? || self.errors.length == 0
205
+ end
206
+
207
+ def invalid?
208
+ !self.valid?
209
+ end
210
+
211
+ def reset_errors
212
+ @errors = nil
213
+ end
214
+
215
+ module ClassMethods
216
+
217
+ def query
218
+ LeanMotion::CloudQuery.alloc.initWithClassNameAndClassObject(self.name, classObject:self)
219
+ end
220
+
221
+ def count(&block)
222
+ cloud_query = query
223
+ return cloud_query.countObjects unless block_given?
224
+
225
+ cloud_query.count do |count, error|
226
+ block.call(count, error)
227
+ end
228
+ end
229
+
230
+ def all(&block)
231
+ cloud_query = query
232
+ return cloud_query.find unless block_given?
233
+
234
+ cloud_query.find do |objects, error|
235
+ block.call(objects, error)
236
+ end
237
+ end
238
+
239
+ def where(hash)
240
+ cloud_query = query
241
+ cloud_query.findByHash(hash)
242
+ end
243
+
244
+ def first(&block)
245
+ cloud_query = query
246
+ return cloud_query.first unless block_given?
247
+
248
+ cloud_query.first do |object, error|
249
+ block.call(object, error)
250
+ end
251
+ end
252
+
253
+ def destroy(&block)
254
+ cloud_query = query
255
+ return cloud_query.delete unless block_given?
256
+
257
+ cloud_query.destroy do |object, error|
258
+ block.call(object, error)
259
+ end
260
+ end
261
+
262
+ def sort(hash)
263
+ cloud_query = query
264
+ cloud_query.sort(hash)
265
+ end
266
+
267
+ def page(number, pagesize=20)
268
+ cloud_query = query
269
+ cloud_query.page(number, pagesize)
270
+ end
271
+
272
+ # set the fields for the current Model
273
+ # used in method_missing
274
+ #
275
+ # @param [Symbol] args one or more fields
276
+ def fields(*args)
277
+ args.each {|arg| field(arg)}
278
+ end
279
+
280
+ # set a field for the current Model
281
+ #
282
+ # @param [Symbol] name of field
283
+ # (see #fields)
284
+ def field(name)
285
+ @fields ||= [:objectId]
286
+ @fields << name.to_sym
287
+ @fields.uniq!
288
+ end
289
+
290
+ def get_fields
291
+ @fields ||= []
292
+ end
293
+
294
+ # require a certain field to be present (not nil And not an empty String)
295
+ #
296
+ # @param [Symbol, Hash] field and options (now only has message)
297
+ def validates_presence_of(field, opts={})
298
+ @presenceValidationMessages ||= {}
299
+ @presenceValidationMessages[field] = opts[:message] if opts[:message]
300
+ validate_presence(field)
301
+ end
302
+
303
+ def get_presence_validations
304
+ @presenceValidations ||= {}
305
+ end
306
+
307
+ def get_presence_validation_messages
308
+ @presenceValidationMessages ||= {}
309
+ end
310
+
311
+ def validate_presence(field)
312
+ @presenceValidations ||= []
313
+ @presenceValidations << field
314
+ end
315
+ end
316
+
317
+ def self.included(base)
318
+ base.extend(ClassMethods)
319
+ end
320
+
321
+ end
322
+ end
@@ -0,0 +1,120 @@
1
+ module LeanMotion
2
+ class CloudQuery < AVQuery
3
+
4
+ def setClassObject(classObject)
5
+ @classObject = classObject
6
+ self
7
+ end
8
+
9
+ def initWithClassNameAndClassObject(className, classObject:myClassObject)
10
+ @className = className
11
+ self.initWithClassName(className)
12
+ self.setClassObject(myClassObject)
13
+ self
14
+ end
15
+
16
+ def findByHash(hash)
17
+ hash.each do |k, v|
18
+ symbols = [:gt, :greater, :lt, :less, :gte, :greater_and_equal,
19
+ :lte, :less_and_equal, :bt, :between]
20
+
21
+ if v.class == Array && (symbols.include? v[0])
22
+ compare(k, v)
23
+ else
24
+ equal(k, v)
25
+ end
26
+ end
27
+ self
28
+ end
29
+
30
+ def equal(k, v)
31
+ if v.nil?
32
+ self.whereKeyDoesNotExist(k)
33
+ elsif v == :exist
34
+ self.whereKeyExists(k)
35
+ else
36
+ self.whereKey(k, equalTo:v)
37
+ end
38
+ end
39
+
40
+ def compare(k, v)
41
+ type = v[0]
42
+ value = v[1]
43
+ case type
44
+ when :gt, :greater
45
+ self.whereKey(k, greaterThan: value)
46
+ when :lt, :less
47
+ self.whereKey(k, lessThan: value)
48
+ when :gte, :greater_and_equal
49
+ self.whereKey(k, greaterThanOrEqualTo: value)
50
+ when :lte, :less_and_equal
51
+ self.whereKey(k, lessThanOrEqualTo: value)
52
+ when :bt, :between
53
+ self.whereKey(k, greaterThan: v[1])
54
+ self.whereKey(k, lessThan: v[2])
55
+ end
56
+ self
57
+ end
58
+
59
+ def find(&block)
60
+ return self.findObjects.map {|obj| @classObject.new(obj)} unless block_given?
61
+
62
+ self.findObjectsInBackgroundWithBlock(lambda do |objects, error|
63
+ objects = objects.map {|obj| @classObject.new(obj)} if objects
64
+ block.call(objects, error)
65
+ end)
66
+ end
67
+
68
+ def first(&block)
69
+ return @classObject.new(self.getFirstObject) unless block_given?
70
+
71
+ self.getFirstObjectInBackgroundWithBlock(lambda do |object, error|
72
+ obj = @classObject.new(object) if object
73
+ block.call(obj, error)
74
+ end)
75
+ end
76
+
77
+ def get(id, &block)
78
+ return @classObject.new(self.getObjectWithId(id)) unless block_given?
79
+
80
+ self.getObjectInBackgroundWithId(id, block:lambda do |object, error|
81
+ obj = @classObject.new(object) if object
82
+ block.call(obj, error)
83
+ end)
84
+ end
85
+
86
+ def count(&block)
87
+ return self.countObjects unless block_given?
88
+
89
+ self.countObjectsInBackgroundWithBlock(lambda do |count, error|
90
+ block.call(count, error)
91
+ end)
92
+ end
93
+
94
+ def destroy(&block)
95
+ self.deleteAllInBackgroundWithBlock(lambda do |objects, error|
96
+ block.call(objects, error)
97
+ end)
98
+ end
99
+
100
+ def page(number, pagesize=20)
101
+ number ||= 1
102
+ self.limit = pagesize
103
+ self.skip = (number - 1) * pagesize
104
+ self
105
+ end
106
+
107
+ def sort(hash)
108
+ key = hash.first[0]
109
+ sort= hash.first[1]
110
+ if sort == :asc
111
+ self.orderByAscending(key)
112
+ else
113
+ self.orderByDescending(key)
114
+ end
115
+ self
116
+ end
117
+
118
+ end
119
+
120
+ end
@@ -0,0 +1,137 @@
1
+ module LeanMotion
2
+ module User
3
+ attr_accessor :AVUser
4
+
5
+ RESERVED_KEYS = ['username', 'password', 'email']
6
+
7
+ def initialize(av_user_object=nil)
8
+ if av_user_object
9
+ @AVUser = av_user_object
10
+ else
11
+ @AVUser = AVUser.user
12
+ end
13
+ end
14
+
15
+ def method_missing(method, *args, &block)
16
+ if RESERVED_KEYS.include?("#{method}")
17
+ @AVUser.send(method)
18
+ elsif RESERVED_KEYS.map {|f| "#{f}="}.include?("#{method}")
19
+ @AVUser.send(method, args.first)
20
+ elsif fields.include?(method)
21
+ @AVUser.objectForKey(method)
22
+ elsif fields.map {|f| "#{f}="}.include?("#{method}")
23
+ method = method.split("=")[0]
24
+ @AVUser.setObject(args.first, forKey:method)
25
+ elsif @AVUser.respond_to?(method)
26
+ @AVUser.send(method, *args, &block)
27
+ else
28
+ super
29
+ end
30
+ end
31
+
32
+ def fields
33
+ self.class.send(:get_fields)
34
+ end
35
+
36
+ def sign(&block)
37
+ return true unless block_given?
38
+ @AVUser.signUpInBackgroundWithBlock(lambda do |succeeded, error|
39
+ block.call(succeeded, error)
40
+ end)
41
+ end
42
+
43
+ module ClassMethods
44
+
45
+ def login(username, password, &block)
46
+ AVUser.logInWithUsernameInBackground(username, password:password, block:lambda do |user, error|
47
+ block.call(user, error)
48
+ end)
49
+ end
50
+
51
+
52
+ def query
53
+ LeanMotion::CloudQuery.alloc.initWithClassNameAndClassObject('_User', classObject:self)
54
+ end
55
+
56
+ def count(&block)
57
+ cloud_query = query
58
+ return cloud_query.countObjects unless block_given?
59
+
60
+ cloud_query.countObjectsInBackgroundWithBlock(lambda do |count, error|
61
+ block.call(count, error)
62
+ end)
63
+ end
64
+
65
+ def where(hash)
66
+ cloud_query = query
67
+ cloud_query.findByHash(hash)
68
+ end
69
+
70
+ def first(&block)
71
+ cloud_query = query
72
+ return cloud_query.getFirst unless block_given?
73
+
74
+ cloud_query.getFirstObjectInBackgroundWithBlock(lambda do |object, error|
75
+ block.call(object, error)
76
+ end)
77
+ end
78
+
79
+ def order(hash)
80
+ cloud_query = query
81
+ key = hash.first[0]
82
+ sort= hash.first[1]
83
+ if sort == :asc
84
+ cloud_query.orderByAscending(key)
85
+ else
86
+ cloud_query.orderByDescending(key)
87
+ end
88
+ end
89
+
90
+ def page(number, pagesize=20)
91
+ number ||= 1
92
+ cloud_query = query
93
+ cloud_query.limit = pagesize
94
+ cloud_query.skip = (number - 1) * pagesize
95
+ cloud_query
96
+ end
97
+
98
+ def fields(*args)
99
+ args.each {|arg| field(arg)}
100
+ end
101
+
102
+ def field(name)
103
+ @fields ||= []
104
+ @fields << name
105
+ end
106
+
107
+ def current_user
108
+ if AVUser.currentUser
109
+ u = new
110
+ u.AVUser = AVUser.currentUser
111
+ return u
112
+ else
113
+ return nil
114
+ end
115
+ end
116
+
117
+ def all(&block)
118
+ return AVUser.query.findObjects.map {|obj| self.new(obj)} unless block_given?
119
+
120
+ AVUser.query.findObjectsInBackgroundWithBlock(lambda do |objects, error|
121
+ objects = objects.map {|obj| self.new(obj)} if objects
122
+ block.call(objects, error)
123
+ end)
124
+ end
125
+
126
+ def get_fields
127
+ @fields
128
+ end
129
+
130
+ end
131
+
132
+ def self.included(base)
133
+ base.extend(ClassMethods)
134
+ end
135
+
136
+ end
137
+ end
@@ -0,0 +1,3 @@
1
+ module LeanMotion
2
+ VERSION = "0.1" unless defined?(LeanMotion::VERSION)
3
+ end
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lean_motion
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - smartweb
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: methadone
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ description: Make it more easy to use LeanCloud SDK in RubyMotion. Inspired by ParseModel.
42
+ email: sam@chamobile.com
43
+ executables:
44
+ - lean_motion
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - README.md
49
+ - bin/lean_motion
50
+ - lib/lean_motion.rb
51
+ - lib/lean_motion/cloud.rb
52
+ - lib/lean_motion/config.rb
53
+ - lib/lean_motion/lean_motion.rb
54
+ - lib/lean_motion/model.rb
55
+ - lib/lean_motion/query.rb
56
+ - lib/lean_motion/user.rb
57
+ - lib/lean_motion/version.rb
58
+ homepage: http://github.com/smartweb/lean_motion
59
+ licenses:
60
+ - MIT
61
+ metadata: {}
62
+ post_install_message:
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubyforge_project:
78
+ rubygems_version: 2.4.2
79
+ signing_key:
80
+ specification_version: 4
81
+ summary: Rubymotion wrapper for LeanCloud SDK
82
+ test_files: []