easyfire 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/.byebug_history +256 -0
  3. data/.gitignore +12 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +5 -0
  6. data/CODE_OF_CONDUCT.md +74 -0
  7. data/Gemfile +6 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +43 -0
  10. data/Rakefile +6 -0
  11. data/bin/console +14 -0
  12. data/bin/easyfire +5 -0
  13. data/bin/setup +8 -0
  14. data/easyfire.gemspec +40 -0
  15. data/lib/easyfire/cli.rb +23 -0
  16. data/lib/easyfire/easyfire_model.rb +140 -0
  17. data/lib/easyfire/renders/helpers.rb +68 -0
  18. data/lib/easyfire/renders/model.rb +32 -0
  19. data/lib/easyfire/renders/service.rb +30 -0
  20. data/lib/easyfire/renders/templates/model.java.erb +220 -0
  21. data/lib/easyfire/renders/templates/model.swift.erb +62 -0
  22. data/lib/easyfire/renders/templates/service.java.erb +43 -0
  23. data/lib/easyfire/renders/templates/service.swift.erb +92 -0
  24. data/lib/easyfire/renders.rb +7 -0
  25. data/lib/easyfire/thor/android/build.gradle.tt +100 -0
  26. data/lib/easyfire/thor/android/build.sbt.tt +17 -0
  27. data/lib/easyfire/thor/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  28. data/lib/easyfire/thor/android/gradle/wrapper/gradle-wrapper.properties +6 -0
  29. data/lib/easyfire/thor/android/gradle.properties +2 -0
  30. data/lib/easyfire/thor/android/gradlew +160 -0
  31. data/lib/easyfire/thor/android/gradlew.bat +90 -0
  32. data/lib/easyfire/thor/android/pom.xml.tt +76 -0
  33. data/lib/easyfire/thor/android/settings.gradle.tt +1 -0
  34. data/lib/easyfire/thor/android/src/main/AndroidManifest.xml.tt +3 -0
  35. data/lib/easyfire/thor/android.rb +56 -0
  36. data/lib/easyfire/thor/android_helper/EasyfireDelegate.java.tt +10 -0
  37. data/lib/easyfire/thor/android_helper/EasyfireListDelegate.java.tt +11 -0
  38. data/lib/easyfire/thor/android_helper/ModelEF.java.tt +10 -0
  39. data/lib/easyfire/thor/android_helper/ServiceEF.java.tt +370 -0
  40. data/lib/easyfire/version.rb +3 -0
  41. data/lib/easyfire.rb +22 -0
  42. metadata +170 -0
@@ -0,0 +1,370 @@
1
+ package <%=@group%>.<%=@artifact%>.base;
2
+
3
+ import android.support.annotation.NonNull;
4
+
5
+ import com.google.android.gms.tasks.OnCompleteListener;
6
+ import com.google.android.gms.tasks.OnFailureListener;
7
+ import com.google.android.gms.tasks.Task;
8
+ import com.google.firebase.database.ChildEventListener;
9
+ import com.google.firebase.database.DataSnapshot;
10
+ import com.google.firebase.database.DatabaseError;
11
+ import com.google.firebase.database.DatabaseReference;
12
+ import com.google.firebase.database.ValueEventListener;
13
+
14
+ public abstract class ServiceEF<T extends ModelEF> {
15
+
16
+ private ChildEventListener childEventListener;
17
+ private DatabaseReference childListenerRef;
18
+ private ValueEventListener valueEventListener;
19
+ private DatabaseReference valueListenerRef;
20
+ private DatabaseReference trackingRef;
21
+ private ValueEventListener trackingValueListener;
22
+ private EasyfireListDelegate paginateDelegate;
23
+ private ChildEventListener firstPageChildEventListener;
24
+ private String oldestKeyYouveSeen;
25
+ private DatabaseReference childPaginateListenerRef;
26
+
27
+ public abstract DatabaseReference getRef();
28
+ protected abstract Class<T> getRuntimeClass();
29
+
30
+ public void retrieve(final String key, final EasyfireDelegate<T> delegate, String... parentKeys){
31
+ DatabaseReference localRef = getRef();
32
+
33
+ for(String parentKey : parentKeys){
34
+ localRef = localRef.child(parentKey);
35
+ }
36
+
37
+ localRef.child(key);
38
+ findByPath(delegate, localRef);
39
+ }
40
+
41
+ public void retrieve(final String path, final EasyfireDelegate<T> delegate){
42
+ DatabaseReference localRef = getRef();
43
+
44
+ localRef.child(path);
45
+ findByPath(delegate, localRef);
46
+ }
47
+
48
+
49
+ private void findByPath(final EasyfireDelegate<T> delegate, DatabaseReference localRef) {
50
+ localRef.addListenerForSingleValueEvent(new ValueEventListener() {
51
+
52
+ @Override
53
+ public void onDataChange(DataSnapshot dataSnapshot) {
54
+ if (dataSnapshot.exists()) {
55
+
56
+ T t = dataSnapshot.getValue(getRuntimeClass());
57
+ t.setKey(dataSnapshot.getKey());
58
+ delegate.changed(t);
59
+ } else {
60
+ delegate.changed(null);
61
+ }
62
+ }
63
+
64
+ @Override
65
+ public void onCancelled(DatabaseError databaseError) {
66
+ delegate.error(databaseError);
67
+ }
68
+ });
69
+ }
70
+
71
+
72
+ public void store(final T t,
73
+ final EasyfireDelegate<T> delegate) {
74
+
75
+ DatabaseReference localRef = getRef();
76
+ for(Object parentKey: t.getParentKeys()){
77
+ localRef = localRef.child(parentKey.toString());
78
+ }
79
+
80
+ if (t.getKey() == null) {
81
+ localRef = localRef.push();
82
+ } else {
83
+ localRef = localRef.child(t.getKey());
84
+ }
85
+ t.setKey(localRef.getKey());
86
+
87
+ Task<Void> task = localRef.setValue(t);
88
+ task.addOnCompleteListener(new OnCompleteListener<Void>() {
89
+ @Override
90
+ public void onComplete(@NonNull Task<Void> task) {
91
+ delegate.changed(t);
92
+ }
93
+ }).addOnFailureListener(new OnFailureListener() {
94
+ @Override
95
+ public void onFailure(@NonNull Exception e) {
96
+ delegate.error(e);
97
+ }
98
+ });
99
+ }
100
+
101
+ public void delete(final T t, final EasyfireDelegate<Boolean> delegate) {
102
+ Task<Void> task;
103
+
104
+ DatabaseReference localRef =getRef();
105
+
106
+ for(Object parentKey: t.getParentKeys()){
107
+ localRef = localRef.child(parentKey.toString());
108
+ }
109
+
110
+ task = localRef.child(t.getKey()).removeValue();
111
+
112
+ task.addOnCompleteListener(new OnCompleteListener<Void>() {
113
+ @Override
114
+ public void onComplete(@NonNull Task<Void> task) {
115
+ delegate.changed(true);
116
+ }
117
+ }).addOnFailureListener(new OnFailureListener() {
118
+ @Override
119
+ public void onFailure(@NonNull Exception e) {
120
+ delegate.error(e);
121
+ }
122
+ });
123
+ }
124
+
125
+ public void observeValue(final EasyfireListDelegate delegate,String... parentKeys) {
126
+
127
+ valueEventListener = new ValueEventListener(){
128
+
129
+ @Override
130
+ public void onDataChange(DataSnapshot dataSnapshot) {
131
+ if(dataSnapshot.exists()){
132
+ T t = dataSnapshot.getValue(getRuntimeClass());
133
+ t.setKey(dataSnapshot.getKey());
134
+ delegate.added(t);
135
+ }
136
+ }
137
+
138
+ @Override
139
+ public void onCancelled(DatabaseError databaseError) {
140
+ delegate.onError(databaseError);
141
+ }
142
+ };
143
+
144
+ this.valueListenerRef = getRef();
145
+ for(String parentKey: parentKeys){
146
+ this.valueListenerRef = valueListenerRef.child(parentKey);
147
+ }
148
+ this.valueListenerRef.addValueEventListener(valueEventListener);
149
+
150
+
151
+ }
152
+
153
+ public void removeValueObserve() {
154
+
155
+ if(valueEventListener != null && this.valueListenerRef != null){
156
+ this.valueListenerRef.removeEventListener(valueEventListener);
157
+ }
158
+ }
159
+
160
+
161
+ public void observeChild(final EasyfireListDelegate<T> delegate,String... parentKeys) {
162
+
163
+ childEventListener = new ChildEventListener() {
164
+
165
+ @Override
166
+ public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
167
+
168
+ if (dataSnapshot.exists()) {
169
+ T t = dataSnapshot.getValue(getRuntimeClass());
170
+ t.setKey(dataSnapshot.getKey());
171
+ delegate.added(t);
172
+ }
173
+
174
+ }
175
+
176
+ @Override
177
+ public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
178
+ if (dataSnapshot.exists()) {
179
+ T t = dataSnapshot.getValue(getRuntimeClass());
180
+ if (t != null) {
181
+ t.setKey(dataSnapshot.getKey());
182
+
183
+ delegate.changed(t);
184
+ }
185
+ }
186
+ }
187
+
188
+ @Override
189
+ public void onChildRemoved(DataSnapshot dataSnapshot) {
190
+ delegate.removed(createInstanceWithKey(dataSnapshot.getKey()));
191
+ }
192
+
193
+ @Override
194
+ public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
195
+ if (dataSnapshot.exists()) {
196
+ T t = dataSnapshot.getValue(getRuntimeClass());
197
+ if (t != null) {
198
+ t.setKey(dataSnapshot.getKey());
199
+
200
+ delegate.moved(t);
201
+ }
202
+ }
203
+ }
204
+
205
+
206
+ @Override
207
+ public void onCancelled(DatabaseError databaseError) {
208
+ delegate.onError(databaseError);
209
+ }
210
+ };
211
+
212
+ this.childListenerRef = getRef();
213
+
214
+ for(String parentKey: parentKeys){
215
+ this.childListenerRef = childListenerRef.child(parentKey);
216
+ }
217
+ this.childListenerRef.addChildEventListener(childEventListener);
218
+
219
+ }
220
+
221
+ public void removeChildObserve() {
222
+
223
+ if(childEventListener != null && this.childListenerRef != null){
224
+ this.childListenerRef.removeEventListener(childEventListener);
225
+ }
226
+ }
227
+ public abstract T createInstanceWithKey(String key);
228
+
229
+
230
+
231
+ public void startTracking(final String path, final EasyfireListDelegate delegate){
232
+ this.trackingRef = getRef();
233
+ this.trackingRef = this.trackingRef.child(path);
234
+ trackingValueListener = new ValueEventListener(){
235
+
236
+ @Override
237
+ public void onDataChange(DataSnapshot dataSnapshot) {
238
+ if(dataSnapshot.exists()){
239
+ T t = dataSnapshot.getValue(getRuntimeClass());
240
+ t.setKey(dataSnapshot.getKey());
241
+ delegate.changed(t);
242
+ }else{
243
+ T t = dataSnapshot.getValue(getRuntimeClass());
244
+ t.setKey(dataSnapshot.getKey());
245
+ delegate.removed(createInstanceWithKey(dataSnapshot.getKey()));
246
+ }
247
+ }
248
+
249
+ @Override
250
+ public void onCancelled(DatabaseError databaseError) {
251
+ delegate.onError(databaseError);
252
+ }
253
+ };
254
+
255
+ this.trackingRef.addValueEventListener(trackingValueListener);
256
+
257
+ }
258
+
259
+ public void stopTracking(){
260
+ if(this.trackingRef != null && this.trackingValueListener != null) {
261
+ this.trackingRef.removeEventListener(trackingValueListener);
262
+ }
263
+ }
264
+
265
+
266
+ public void startPagination(final EasyfireListDelegate delegate,int pageSize, String... parentKeys) {
267
+ this.paginateDelegate = delegate;
268
+ this.firstPageChildEventListener = createPaginateChildEventListener();
269
+ oldestKeyYouveSeen = null;
270
+
271
+ this.childPaginateListenerRef = getRef();
272
+
273
+ for(String parentKey: parentKeys){
274
+ this.childPaginateListenerRef = childPaginateListenerRef.child(parentKey);
275
+ }
276
+
277
+ this.childPaginateListenerRef.limitToLast(pageSize).addChildEventListener(firstPageChildEventListener);
278
+ }
279
+
280
+ public void nextPage(int pageSize) {
281
+ String start = oldestKeyYouveSeen;
282
+ oldestKeyYouveSeen = null;
283
+
284
+ this.childPaginateListenerRef.orderByKey().endAt(start).limitToLast(pageSize).addListenerForSingleValueEvent(new ValueEventListener() {
285
+ @Override
286
+ public void onDataChange(DataSnapshot dataSnapshot) {
287
+ if(dataSnapshot.getChildrenCount() > 0) {
288
+ for (DataSnapshot child : dataSnapshot.getChildren()) {
289
+ if (oldestKeyYouveSeen == null) {
290
+ oldestKeyYouveSeen = child.getKey();
291
+ }
292
+ T t = child.getValue(getRuntimeClass());
293
+ t.setKey(child.getKey());
294
+ paginateDelegate.added(t);
295
+ }
296
+ }else{
297
+ paginateDelegate.done();
298
+ }
299
+ }
300
+
301
+ @Override
302
+ public void onCancelled(DatabaseError databaseError) {
303
+ paginateDelegate.onError(databaseError);
304
+ }
305
+ });
306
+
307
+ }
308
+
309
+
310
+ private ChildEventListener createPaginateChildEventListener() {
311
+ return new ChildEventListener() {
312
+ @Override
313
+ public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
314
+
315
+ if (dataSnapshot.exists()) {
316
+ if (oldestKeyYouveSeen == null) {
317
+ oldestKeyYouveSeen = dataSnapshot.getKey();
318
+ }
319
+ T t = dataSnapshot.getValue(getRuntimeClass());
320
+ t.setKey(dataSnapshot.getKey());
321
+ paginateDelegate.added(t);
322
+ }
323
+
324
+ }
325
+
326
+ @Override
327
+ public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
328
+ if (dataSnapshot.exists()) {
329
+
330
+ if (oldestKeyYouveSeen == null) {
331
+ oldestKeyYouveSeen = dataSnapshot.getKey();
332
+ }
333
+ T t = dataSnapshot.getValue(getRuntimeClass());
334
+ t.setKey(dataSnapshot.getKey());
335
+ paginateDelegate.added(t);
336
+ }
337
+ }
338
+
339
+ @Override
340
+ public void onChildRemoved(DataSnapshot dataSnapshot) {
341
+ T t = createInstanceWithKey(dataSnapshot.getKey());
342
+ paginateDelegate.removed(t);
343
+ }
344
+
345
+ @Override
346
+ public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
347
+ if (dataSnapshot.exists()) {
348
+
349
+ if (oldestKeyYouveSeen == null) {
350
+ oldestKeyYouveSeen = dataSnapshot.getKey();
351
+ }
352
+ T t = dataSnapshot.getValue(getRuntimeClass());
353
+ t.setKey(dataSnapshot.getKey());
354
+ paginateDelegate.moved(t);
355
+ }
356
+ }
357
+
358
+
359
+ @Override
360
+ public void onCancelled(DatabaseError databaseError) {
361
+ paginateDelegate.onError(databaseError);
362
+ }
363
+ };
364
+
365
+ }
366
+
367
+
368
+
369
+
370
+ }
@@ -0,0 +1,3 @@
1
+ module Easyfire
2
+ VERSION = "0.0.1"
3
+ end
data/lib/easyfire.rb ADDED
@@ -0,0 +1,22 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext'
3
+ require "easyfire/version"
4
+ require 'easyfire/easyfire_model'
5
+
6
+ require "easyfire/renders"
7
+ require "easyfire/renders/helpers"
8
+ require 'easyfire/renders/model'
9
+ require 'easyfire/renders/service'
10
+ require 'erb'
11
+ require "easyfire/thor/android"
12
+ require "easyfire/cli"
13
+
14
+ class String
15
+ def uncapitalize
16
+ self[0, 1].downcase + self[1..-1]
17
+ end
18
+ end
19
+
20
+
21
+ module Easyfire
22
+ end
metadata ADDED
@@ -0,0 +1,170 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: easyfire
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Rodrigo Sol
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-09-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.15'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.15'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: |-
98
+ This gem provides an abstraction layer to define Firebase Realtime Database models and basic services.
99
+ Once the model was defined you can generate a client library to Android, Swift and Javascript.
100
+ email:
101
+ - rodrigo@rarolabs.com.br
102
+ executables: []
103
+ extensions: []
104
+ extra_rdoc_files: []
105
+ files:
106
+ - ".byebug_history"
107
+ - ".gitignore"
108
+ - ".rspec"
109
+ - ".travis.yml"
110
+ - CODE_OF_CONDUCT.md
111
+ - Gemfile
112
+ - LICENSE.txt
113
+ - README.md
114
+ - Rakefile
115
+ - bin/console
116
+ - bin/easyfire
117
+ - bin/setup
118
+ - easyfire.gemspec
119
+ - lib/easyfire.rb
120
+ - lib/easyfire/cli.rb
121
+ - lib/easyfire/easyfire_model.rb
122
+ - lib/easyfire/renders.rb
123
+ - lib/easyfire/renders/helpers.rb
124
+ - lib/easyfire/renders/model.rb
125
+ - lib/easyfire/renders/service.rb
126
+ - lib/easyfire/renders/templates/model.java.erb
127
+ - lib/easyfire/renders/templates/model.swift.erb
128
+ - lib/easyfire/renders/templates/service.java.erb
129
+ - lib/easyfire/renders/templates/service.swift.erb
130
+ - lib/easyfire/thor/android.rb
131
+ - lib/easyfire/thor/android/build.gradle.tt
132
+ - lib/easyfire/thor/android/build.sbt.tt
133
+ - lib/easyfire/thor/android/gradle.properties
134
+ - lib/easyfire/thor/android/gradle/wrapper/gradle-wrapper.jar
135
+ - lib/easyfire/thor/android/gradle/wrapper/gradle-wrapper.properties
136
+ - lib/easyfire/thor/android/gradlew
137
+ - lib/easyfire/thor/android/gradlew.bat
138
+ - lib/easyfire/thor/android/pom.xml.tt
139
+ - lib/easyfire/thor/android/settings.gradle.tt
140
+ - lib/easyfire/thor/android/src/main/AndroidManifest.xml.tt
141
+ - lib/easyfire/thor/android_helper/EasyfireDelegate.java.tt
142
+ - lib/easyfire/thor/android_helper/EasyfireListDelegate.java.tt
143
+ - lib/easyfire/thor/android_helper/ModelEF.java.tt
144
+ - lib/easyfire/thor/android_helper/ServiceEF.java.tt
145
+ - lib/easyfire/version.rb
146
+ homepage: http://www.rarolabs.com.br
147
+ licenses:
148
+ - MIT
149
+ metadata: {}
150
+ post_install_message:
151
+ rdoc_options: []
152
+ require_paths:
153
+ - lib
154
+ required_ruby_version: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ required_rubygems_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ requirements: []
165
+ rubyforge_project:
166
+ rubygems_version: 2.6.13
167
+ signing_key:
168
+ specification_version: 4
169
+ summary: High level models descriptions for Firebase Realtime Database
170
+ test_files: []