A Ruby Gem for FatSecret API
Ruby
Switch branches/tags
Nothing to show
Clone or download
Pull request Compare This branch is 11 commits ahead, 35 commits behind whistler:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib
spec
.gitignore
Gemfile
Gemfile.lock
README.md
Rakefile
fatsecret.gemspec

README.md

FatSecret Gem

Introduction

An activemodel compliant wrapper to the FatSecret api. You need to register with FatSecret to get a key and secret. At the moment only the food search, and get methods are implemented. More methods can be easily implemented. See development for more information

Installation

If you are using bundler, you put this in your Gemfile:

source :rubygems
gem 'fatsecret-models', :git => 'https://github.com/joeyjoejoejr/Fatsecret.git'

Then run bundle install

or gem install fatsecret-models

Useage

Rails:

run rails generate fat_secret::install this will create a fatsecret.rb initializer file in config/initializers fill in your fatsecret key and secret. Make sure to exclude this file from version control

Ruby:

You must set up configuration before instantiating any of the FatSecret classes:

FatSecret.configure do |config|
  config.api_key = <your key>
  config.api_secret = <your secret key>
end

FatSecret::Connection is a lightweight wrapper of the api and can be used alone. It currently has a search, and a get method. Both take three arguments and return a ruby hash.

connection = FatSecret::Conection.new
connection.search(method, searchArguments, additionalArguments)
connection.get(method, ID, additionalArguments)

A real world example:

connection = FatSecret::Connection.new
connection.search :food, "Apple", :max_results => "10"
connection.get :food, 12345

FatSecret::Food is an ActiveModel Compliant representation of the api data that fits a number of useful rails model idioms. Usage is simple.

foodlist = FatSecret::Food.find_by_name("Apple") # returns an array of Food objects
first_food = foodlist.first.reload #returns a full food model from the api
first_food.servings.first #returns the first serving object

You can also instantiate and create your own food objects using mass assignment

food = FatSecret::Food.new(:food_id => 12345, :food_name => "Bad and Plenties")
food.servings.new(:calories => "45", :vitamin_a => "millions of mgs")
food.servings_attributes = [{array => of}, {hashes => ""}]

See the food_spec.rb file for more examples

Development

Setup:

git clone 'https://github.com/joeyjoejoejr/Fatsecret.git'
cd Fatsecret
git checkout 'active_model'
bundle install

You'll need to set up your api-key and api-secret in the spec/support/set_keys files then run the specs

bundle exec rspec spec/

Please submit pull requests with fixes, updates, new models.

Setting up a new model

# file "/lib/fatsecret.rb"
require "fatsecret/models/your_new_model.rb"

Most of what you need is in the base class

"lib/fatsecret/models/your_new_model"
module FatSecret
  class YourNewModel < FatSecret::Base
    #predefine attributes for validations, others will be created dynamically
    attribute :monkey, :type => String, :default => 'Oooh, ohh, Ahh'  
    
    validates :monkey, :presence => True
    
    #creates an instance of FatSecret::Relation so that mass assigment and  
    #"food_object.insects.new" will work.  You will need to create that related model.
    has_many :insects

    #this model has access to the connection object so you can define methods
    #this should all be customized to deal with how Fatsecret returns
    def self.find(id, args = {})
      attrs = connection.get(api_method, id.to_s, args)
      attrs['your_new_model']['insect_attributes'] = attrs['your_new_model']['insects']['insect']
      attrs['your_new_model'].delete 'insects'
      self.new attrs['your_new_model']
    end

    def self.find_by_name(name, args = {})
      results = connection.search(api_method, name, args)
     return_results = []
     results['your_new_models']['your_new_model'].each do |thing|
       return_results.push self.new thing
     end
     return_results
    end
  end

  class Insect < FatSecret::Base
  end
end