motion-firebase

A RubyMotion wrapper for the Firebase SDK.

Adds more rubyesque methods to the built-in classes.

For a Ruby (MRI) Firebase wrapper, check out https://github.com/derailed/bigbertha.

Versioning

versioning matches Firebase's SDK major and minor version numbers, but revision numbers could be different.

SDK

Firebase Class Reference

Initializing a Firebase object
    Firebase.new(url)
Getting references to children locations
    firebase[path]
    firebase[]  # childByAutoId
    firebase['fred']  # childByAppendingPath('fred')
Writing data
    firebase << { key: 'value' }
    # => firebase.childByAutoId.setValue({ key: 'value'}), returns the new child

    # Since firebase works with simple objects, this is equivalent to
    # => firebase.childByAutoId.setValue({ 'key' => 'value'})

    # set value
    firebase.value = value
    firebase.set(value)
    firebase.set(value) { 'completion block' }
    firebase.set(value, priority: priority)
    firebase.set(value, priority: priority) { 'completion block' }

    # set value of child node
    firebase['first_name'] = 'fred'  # childByAppendingPath('fred').set('fred')

    # remove value
    firebase.clear!
    firebase.clear! { 'completion block' }

    # priority
    firebase.priority = priority
    firebase.priority(priority)
    firebase.priority(priority) { |error| 'completion block' }

    # "updating" is used to update some children, but leaving others unchanged.
    # (set, on the other hand, replaces the value entirely, so using set with a
    # hash will remove keys that weren't specified in the new hash)
    firebase.set({ first_name: 'motion', last_name: 'fireball' })
    firebase.update(last_name: 'firebase')  # only updates last_name, first_name is left unchanged
    firebase.update(last_name: 'firebase') { |error| 'completion block' }
    # for comparison:
    firebase.set(last_name: 'firebase')  # first_name is now 'nil'
Attaching observers to read data
    handle = firebase.on(event_type) { |snapshot| 'completion block' }
    handle = firebase.on(event_type) { |snapshot, previous_sibling_name| 'completion block' }
    handle = firebase.on(event_type,
      completion: proc { |snapshot, previous_sibling_name| 'completion block' },
      disconnect: proc { 'completion block' }
      )
    handle = firebase.once(event_type) { |snapshot| 'completion block' }
    handle = firebase.once(event_type) { |snapshot, previous_sibling_name| 'completion block' }
    handle = firebase.once(event_type,
      completion: proc { |snapshot, previous_sibling_name| 'completion block' },
      disconnect: proc { 'completion block' }
      )
Detaching observers
    firebase.off
    # => firebase.removeAllObservers

    firebase.off(handle)
    # => firebase.removeObserverWithHandle(handle)
Priority and Limiting
similar-to-yet-different-than "ORDER BY" and "LIMIT"
    firebase.start_at(priority)
    # => firebase.queryStartingAtPriority(priority)

    firebase.start_at(priority, child: child_name)
    # => firebase.queryStartingAtPriority(priority, andChildName: child_name)

    firebase.end_at(priority)
    # => firebase.queryEndingAtPriority(priority)

    firebase.end_at(priority, child: child_name)
    # => firebase.queryEndingAtPriority(priority, andChildName: child_name)

    firebase.limit(limit)
    # => firebase.queryLimitedToNumberOfChildren(limit)
Managing presence
    firebase.online!
    firebase.offline!
    firebase.on_disconnect(value)
    firebase.on_disconnect(value) { |error| 'completion block' }
    firebase.on_disconnect(value, priority:priority)
    firebase.on_disconnect(value, priority:priority) { |error| 'completion block' }
    firebase.on_disconnect(nil)
    firebase.on_disconnect(nil) { |error| 'completion block' }
    firebase.on_disconnect({ child: values })
    firebase.on_disconnect({ child: values }) { |error| 'completion block' }
    firebase.cancel_disconnect
    firebase.cancel_disconnect { |error| 'completion block' }
Authenticating
    firebase.auth(credential)
    firebase.auth(credential) { |error, data| 'completion block' }
    firebase.auth(credential,
      completion: proc { |error, data| 'completion block' },
      disconnect: proc { |error| 'completion block', },
      )
    # calls `unauth`, or if you pass a block calls `unauthWithCompletionBlock`
    firebase.unauth
    firebase.unauth do |error|
      # ...
    end
    # when using FirebaseSimpleLogin to authenticate, this child node should be
    # monitored for changes
    firebase.auth_state
    # usually you'll want to monitor its value, so this is a helper for that:
    handle = firebase.on_auth do |snapshot|
    end
    # be a good citizen and turn off the listener later!
    firebase.off(handle)

##### Transactions

```ruby
    firebase.run { |data| 'transaction block' }
    firebase.run(
      transaction: proc { |data| 'transaction block' },
      completion: proc { |error, committed, snapshot| }
      )
    firebase.run(
      transaction: proc { |data| 'transaction block' },
      completion: proc { |error, committed, snapshot| }
      local: true || false,
      )

##### Retrieving String Representation

```ruby
    firebase.to_s
    firebase.inspect

##### Properties

```ruby
    firebase.parent
    firebase.root
    firebase.name

##### Global configuration and settings

```ruby
    Firebase.dispatch_queue=(queue)
    Firebase.sdkVersion


# FirebaseSimpleLogin Class Reference

##### Initializing a FirebaseSimpleLogin instance

```ruby
    ref = Firebase.new(url)
    auth = FirebaseSimpleLogin.new(ref)

##### Checking current authentication status

```ruby
    auth.check { |error, user| }

##### Removing any existing authentication

```ruby
    auth.logout

##### Email/password authentication methods

`credentials` for `create,remove,login` should include `:email` and `:password`.
For `update`, `credentials` should include `:email`, `:old_password` and
`:new_password`.

```ruby
    auth.create(email: '[email protected]', password: '12345') { |error, user| }
    auth.remove(email: '[email protected]', password: '12345') { |error, user| }
    auth.login(email: '[email protected]', password: '12345') { |error, user| }
    auth.update(email: '[email protected]', old_password: '12345', new_password: '54321') { |error, success| }

##### Facebook authentication methods

`credentials` should include `:app_id` and `:permissions`

```ruby
    auth.login_to_facebook(app_id: '123abc', permissions: ['email']) { |error, user| }

##### Twitter authentication methods

`credentials` should include `:app_id` and `:on_multiple` block. The
`:on_multiple` block is called when more than one account is found.  It is
passed an array of usernames and should return an index or `NSNotFound`.

```ruby
    auth.login_to_twitter(app_id: '123abc', on_multiple: ->(usernames) { return 0 }) { |error, user| }

##### Global configuration and settings

```ruby
    FirebaseSimpleLogin.sdkVersion

##### Retrieving String Representation

```ruby
    firebase.to_s
    firebase.inspect