easyfire 0.0.1

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 (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: []