Subscribed unsubscribe Subscribe Subscribe

枕を欹てて聴く

香炉峰の雪は簾を撥げて看る

RubyでWeDataを触ってみた

最初に謝っときます。すいません。Rubyできちんとしたものを書くのはこれが初めてで、たいそうひどいものになってると思います。メソッドもprivateとpublicとprotected分けてないですし、もうなんかすごく無駄だらけな感じだと思います。
LDRFullFeedのpriorityをすべてtypeに書き換えようとして作ったものなので、自分的に都合のいいメソッドしか用意してなかったりします。
しかも、最初は見過ごした点があったせいで、約40分間にわたってLDRFullFeedのwedataのデータの中に多少欠けたものができてしまうというすさまじい迷惑をかけてしまいました。すいません。責任をもってすべて修正したと思いますが、もしもLDR Full Feedで文字化けなんかが起こっていたりしたら、たぶん私のせいです。
wedata.rb

require 'net/http'
require 'uri'
require 'simple-json'

Net::HTTP.version_1_2

class Wedata
  def initialize(apikey)
    @apikey = apikey
  end
  def get_database(name)
    WedataDatabase.new(name, @apikey)
  end
  def create_database(name, require_keys, optional_keys, permit_other_keys)
    query_hash = {
    "name"=>name,
    "required_keys"=>required_keys,
    "optional_keys"=>optional_keys,
    "permit_other_keys"=>permit_other_keys
    }
    Net::HTTP.start('wedata.net') do |http|
    query = query_hash.map do |key, value|
      "data[#{URI.encode(key)}]=#{URI.encode(value)}"
    end.join("&")+"&api_key=#{@apikey}"

      res = http.post("/databases", query)
      puts "#{res.code}"
      get_database name
    end
  end
end

class WedataDatabase
  attr_reader :name, :info, :required_keys, :optional_keys
  def initialize(name, apikey)
    @apikey = apikey

    Net::HTTP.start('wedata.net') do |http|
      parser = JsonParser.new
      res1 = http.get("/databases/#{URI.encode(name)}.json")
      res2 = http.get("/databases/#{URI.encode(name)}/items.json")
      if res1.code == '200' && res2.code == '200'
        @name = name
        @info = parser.parse(res1.body)
        @data = parser.parse(res2.body)
        @required_keys = @info["required_keys"].scan(/\w+/)
        @optional_keys = @info["optional_keys"].scan(/\w+/)
      else puts 'Request Error'
      end
    end
  end
  def get_item(name)
    WedataItem.new(@data.find {|item| name == item['name']}, @apikey, @required_keys, @optional_keys)
  end
  def create_item(name, data)
    condition = true
    @required_keys.each{|i| condition = false unless data.has_key?(i) }
    unless condition
      puts "Please enter required_keys"
      return
    end
    query = data.map do |key, value|
      "data[#{URI.encode(key)}]=#{URI.encode(value)}"
    end.join("&")+"&api_key=#{@apikey}&name=#{URI.encode(name)}"
    puts query
    Net::HTTP.start('wedata.net') do |http|
      res = http.post("/databases/#{URI.encode(@name)}/items", query)
      puts "#{res.code}"
    end
  end
  def delete
    http = Net::HTTP.new('wedata.net', 80)
    req = Net::HTTP::Delete.new("/databases/#{URI.encode(@name)}")
    req.body =  "api_key=#{@apikey}"
    res = http.request(req)
    puts "#{res.code}"
  end
  def get_items
    items = Array.new
    @data.each do |item|
      items.push(WedataItem.new(item, @apikey, @required_keys, @optional_keys))
    end
    return items
  end
end

class WedataItem
  @@re = /items\/(\d+)$/
  attr_reader :name, :data, :url, :required_keys, :optional_keys
  def initialize(data, apikey, required_keys, optional_keys)
    @name = data['name']
    @data = data['data']
    @url = data['resource_url']
    @apikey = apikey
    @required_keys = required_keys
    @optional_keys = optional_keys
  end
  def update(data)
    @required_keys.each{|i| data[i] = @data[i] unless data.has_key?(i) }
    @optional_keys.each{|i| data[i] = @data[i] if (!data.has_key?(i) && @data.has_key?(i))}
    query = data.map do |key, value|
      "data[#{URI.encode(key)}]=#{URI.encode(value)}"
    end.join("&")+"&api_key=#{@apikey}"
    puts query
    
    @url =~ @@re
    http = Net::HTTP.new('wedata.net', 80)
    req = Net::HTTP::Put.new("/items/#{$1}")
    req.body = query
    res = http.request(req)
    puts "#{res.code}"
  end
  def delete
    @url =~ @@re
    http = Net::HTTP.new('wedata.net', 80)
    req = Net::HTTP::Delete.new("/items/#{$1}")
    req.body =  "api_key=#{@apikey}"
    res = http.request(req)
    puts "#{res.code}"
  end
end

Ruby 用 JSON パーサーを更新、 JSON への変換も追加 - WebOS Goodies
http://code.nanigac.com/source/view/143:tilte
のJSONParserを、simple-json.rbで保存して使っています。ありがとうございます。

実際には

#APIKEYにはapikeyを入れてください。
wedata = Wedata.new 'APIKEY'
database = wedata.get_database 'Wedata API Example'

items = database.get_items #すべてのitemを取得
items.each do |item|
  if item.data['name'] == 'ruby'
    item.update({
      "description"=>"programming"
  })
  end
end

database.create_item("TEST2",{
  "name"=>"perl",
  "description"=>"programming language"
})

見たいな感じで使えます。

正直かなり稚拙ですが、せっかく初めて作ったのだからと公開してみました。
個人的にほしかった理由は達成できたのでまあ満足です。