betty_resource 0.0.13 → 0.0.14

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3419f4f10757834dfcdd7c5c5ff8be658f581812
4
- data.tar.gz: e423740a5b9710b1bf01f056898c9671db454b93
3
+ metadata.gz: 8cfa318752fd70e7e5dca53b694b05ed3b0c69e3
4
+ data.tar.gz: f0a203d324f8d3b7900b7432c8d766446e84e4e0
5
5
  SHA512:
6
- metadata.gz: 91d74a552ac48b8858061a7bd566a7c86a965a94c57381d98669c6b1ad5e87588666f4964f628360430379b6ce94d9b2c097c1335fae290c1de9af50c4c9b481
7
- data.tar.gz: 094d06fde8b922c2d973b3f1adb2b4b1aaa3be9f04c2cb3ee6d292ef4c05ac65e71814b0ba4ac949f1fe746debd1fa84398056e7b3d3a95ec1d5b7e579f82e05
6
+ metadata.gz: 3cc1dd827a3f618b113cc77ad2740db50dc82474d7be02852507d41a414697fd02891ed329d631447e3ef33f929bf7916475da3cb633bfea04a2cc07d541ad11
7
+ data.tar.gz: 8cebce3fed61a1facf9b0fe3a70f5b59fd75606a0b05fd3b7de9f455a1078bc0db43b1240b3475389c2f24b84d6d5d35d5bad7fca9cc7cc324309dd1c908fc92
@@ -1,14 +1,17 @@
1
- require "active_support/core_ext/hash/indifferent_access" # See https://gist.github.com/1075643
1
+ require 'active_support/core_ext/hash/indifferent_access' # See https://gist.github.com/1075643
2
+ require 'active_support/inflector'
2
3
 
3
- require "httparty"
4
- require "crack/json"
5
- require "dirty_hashy"
4
+ require 'httparty'
5
+ require 'crack/json'
6
+ require 'dirty_hashy'
7
+
8
+ require 'betty_resource/kind_extendable'
6
9
 
7
10
  module BettyResource
8
- autoload :Api, "betty_resource/api"
9
- autoload :Configuration, "betty_resource/configuration"
10
- autoload :MetaData, "betty_resource/meta_data"
11
- autoload :Model, "betty_resource/model"
11
+ autoload :Api, 'betty_resource/api'
12
+ autoload :Configuration, 'betty_resource/configuration'
13
+ autoload :MetaData, 'betty_resource/meta_data'
14
+ autoload :Model, 'betty_resource/model'
12
15
 
13
16
  def self.const_missing(name)
14
17
  meta_data.model(name).tap do |model|
@@ -36,4 +39,4 @@ module BettyResource
36
39
  end
37
40
  end
38
41
 
39
- end
42
+ end
@@ -5,8 +5,8 @@ module BettyResource
5
5
  base_uri "#{BettyResource.config.host}/api"
6
6
  format :json
7
7
  basic_auth BettyResource.config.user, BettyResource.config.password
8
- query_string_normalizer proc{|query|
8
+ query_string_normalizer proc { |query|
9
9
  query.to_json
10
10
  }
11
11
  end
12
- end
12
+ end
@@ -1,10 +1,10 @@
1
- require "singleton"
1
+ require 'singleton'
2
2
 
3
3
  module BettyResource
4
4
  class Configuration
5
5
  def initialize(args = {})
6
6
  args.each do |key, value|
7
- self.send("#{key}=", value) if [:host, :user, :password].include?(key.to_sym)
7
+ send("#{key}=", value) if [:host, :user, :password].include?(key.to_sym)
8
8
  end
9
9
  end
10
10
 
@@ -13,8 +13,8 @@ module BettyResource
13
13
  attr_accessor :host, :user, :password
14
14
 
15
15
  def validate!
16
- raise InvalidError if [:host, :user, :password].any?{|option| send(option).to_s.strip.empty?}
16
+ raise InvalidError if [:host, :user, :password].any? { |option| send(option).to_s.strip.empty? }
17
17
  end
18
18
 
19
19
  end
20
- end
20
+ end
@@ -0,0 +1,35 @@
1
+ module KindExtendable
2
+
3
+ def self.included(base)
4
+ base.send :include, InstanceMethods
5
+ end
6
+
7
+ module InstanceMethods
8
+
9
+ def extend_kind_methods
10
+ unless (m = kind_module).nil?
11
+ extend m
12
+ end
13
+ end
14
+
15
+ def kind=(value)
16
+ if defined?(super)
17
+ super
18
+ else
19
+ @kind = value
20
+ end
21
+ @kind_module = nil
22
+ extend_kind_methods
23
+ end
24
+
25
+ def kind_module
26
+ @kind_module ||= begin
27
+ if kind.is_a?(String) && !kind.empty?
28
+ m = kind.gsub(/(?:^|_)(.)/) { Regexp.last_match[1].upcase }
29
+ ActiveSupport::Inflector.constantize("#{self.class}::Types::#{m}")
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ end
@@ -2,7 +2,7 @@ module BettyResource
2
2
  class MetaData
3
3
 
4
4
  def models
5
- @models ||= BettyResource::Model.parse(Api.get("/models").parsed_response)
5
+ @models ||= BettyResource::Model.parse(Api.get('/models').parsed_response)
6
6
  end
7
7
 
8
8
  def model(name)
@@ -10,4 +10,4 @@ module BettyResource
10
10
  end
11
11
 
12
12
  end
13
- end
13
+ end
@@ -1,13 +1,13 @@
1
+ require 'betty_resource/model/record'
2
+ require 'betty_resource/model/property'
3
+
1
4
  module BettyResource
2
5
  class Model
3
- autoload :Record, "betty_resource/model/record"
4
- autoload :Property, "betty_resource/model/property"
5
-
6
6
  attr_accessor :id, :name, :properties
7
7
 
8
8
  def self.parse(input)
9
9
  input.inject({}) do |hash, row|
10
- hash.merge(row["name"] => Model.new(row["id"], row["name"], Property.parse(row["properties"])))
10
+ hash.merge(row['name'] => Model.new(row['id'], row['name'], Property.parse(row['id'], row['properties'])))
11
11
  end
12
12
  end
13
13
 
@@ -16,7 +16,7 @@ module BettyResource
16
16
  end
17
17
 
18
18
  def property(name)
19
- properties.detect{|p|p.name == name.to_s}
19
+ properties.find { |p|p.name == name.to_s }
20
20
  end
21
21
 
22
22
  def typecast(key, value)
@@ -25,14 +25,14 @@ module BettyResource
25
25
  end
26
26
 
27
27
  def attributes
28
- properties.collect(&:name)
28
+ properties.map(&:name)
29
29
  end
30
30
 
31
31
  # TODO: Refactor this method in order to handle formatted view JSON correctly
32
32
  def all(options = {})
33
33
  begin
34
- response = Api.get("/models/#{id}/records", :body => options).parsed_response
35
- ((view_id = options.delete(:view_id) || options.delete("view_id")).nil? ? response : response["records"]).collect do |data|
34
+ response = Api.get("/models/#{id}/records", body: options).parsed_response
35
+ ((view_id = options.delete(:view_id) || options.delete('view_id')).nil? ? response : response['records']).map do |data|
36
36
  load data
37
37
  end
38
38
  rescue MultiJson::DecodeError
@@ -47,7 +47,7 @@ module BettyResource
47
47
  end
48
48
 
49
49
  def first(options = {})
50
- all(options.merge(:limit => 1)).first
50
+ all(options.merge(limit: 1)).first
51
51
  end
52
52
 
53
53
  def new(attributes = {})
@@ -68,7 +68,7 @@ module BettyResource
68
68
 
69
69
  def load(data, record = nil)
70
70
  if data
71
- id = data.delete "id"
71
+ id = data.delete 'id'
72
72
  (record || BettyResource::Model::Record.new(self)).tap do |record|
73
73
  record.instance_variable_set :@id, id
74
74
  record.attributes = data
@@ -78,4 +78,4 @@ module BettyResource
78
78
  end
79
79
 
80
80
  end
81
- end
81
+ end
@@ -1,30 +1,39 @@
1
+ require 'betty_resource/model/property/types/association'
2
+ require 'betty_resource/model/property/types/belongs_to'
3
+ require 'betty_resource/model/property/types/has_many'
4
+
1
5
  module BettyResource
2
6
  class Model
3
7
  class Property
4
- attr_accessor :id, :name, :kind, :options
8
+ include KindExtendable
9
+ attr_reader :id, :name, :kind, :options
5
10
 
6
- def self.parse(input)
7
- input.collect do |row|
8
- Property.new(row["id"], row["name"], row["kind"], row["options"])
11
+ def self.parse(model_id, input)
12
+ input.map do |row|
13
+ options = row['options']
14
+ inverse_association = row["inverse_association"]
15
+ options.merge!("inverse_association" => inverse_association) if inverse_association
16
+ Property.new(row['id'], model_id, row['name'], row['kind'], options)
9
17
  end
10
18
  end
11
19
 
12
- def initialize(id, name, kind, options)
13
- @id, @name, @kind, @options = id, name, kind, options
20
+ def initialize(id, model_id, name, kind, options)
21
+ @id, @model_id, @name, @kind, @options = id, model_id, name, kind, options
22
+ extend_kind_methods if %(belongs_to has_many).include?(kind)
23
+ end
24
+
25
+ def collection?
26
+ false
14
27
  end
15
28
 
16
29
  def typecast(value)
17
- if kind == "belongs_to" && id = (value && value["id"])
18
- model.get(id)
19
- else
20
- value
21
- end
30
+ value
22
31
  end
23
32
 
24
33
  def model
25
- BettyResource.meta_data.models.values.detect{|x| x.id == options["model"]} if kind == "belongs_to"
34
+ @model ||= BettyResource.meta_data.models.values.find { |x| x.id == @model_id }
26
35
  end
27
36
 
28
37
  end
29
38
  end
30
- end
39
+ end
@@ -0,0 +1,21 @@
1
+ module BettyResource
2
+ class Model
3
+ class Property
4
+ module Types
5
+ module Association
6
+
7
+ private
8
+
9
+ def target_model
10
+ BettyResource.meta_data.models.values.find { |x| x.id == options['model'] }
11
+ end
12
+
13
+ def inverse_property
14
+ @inverse_property ||= target_model.properties.find { |x| x.id == options['inverse_association'] }
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ module BettyResource
2
+ class Model
3
+ class Property
4
+ module Types
5
+ module BelongsTo
6
+ include Association
7
+
8
+ def typecast(value)
9
+ if id = (value && value['id'])
10
+ target_model.get(id)
11
+ end
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ module BettyResource
2
+ class Model
3
+ class Property
4
+ module Types
5
+ module HasMany
6
+ include Association
7
+
8
+ def collection?
9
+ true
10
+ end
11
+
12
+ def typecast(value)
13
+ filter = {
14
+ 'operator' => 'and',
15
+ 'conditions' => [
16
+ 'path' => [inverse_property.id, model.property(:id).id],
17
+ 'predicate' => 'eq',
18
+ 'criteria' => 1
19
+ ]
20
+ }
21
+
22
+ target_model.all :filters => [filter]
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -33,10 +33,10 @@ module BettyResource
33
33
 
34
34
  def initialize(model, attributes = {})
35
35
  @model = model
36
- @id = attributes.delete(:id) || attributes.delete("id")
36
+ @id = attributes.delete(:id) || attributes.delete('id')
37
37
  @errors = {}
38
38
  super()
39
- self.attributes = Hash[model.attributes.collect{|x| [x, nil]}].merge attributes
39
+ self.attributes = Hash[model.attributes.map { |x| [x, nil] }].merge attributes
40
40
  self.attributes.instance_variable_set(:@model, model)
41
41
  end
42
42
 
@@ -70,31 +70,31 @@ module BettyResource
70
70
  if success
71
71
  model.send :load, result.parsed_response, self
72
72
  else
73
- @errors = result.parsed_response ? result.parsed_response["errors"] : {"" => ["Er is iets mis gegaan met het verwerken van het formulier. Probeer u het later nog eens. Onze excuses voor het ongemak"]}
73
+ @errors = result.parsed_response ? result.parsed_response['errors'] : { '' => ['Er is iets mis gegaan met het verwerken van het formulier. Probeer u het later nog eens. Onze excuses voor het ongemak'] }
74
74
  end
75
75
  end
76
76
  end
77
77
 
78
78
  def inspect
79
- inspection = "id: #{id.inspect}, #{attributes.collect{|key, value| "#{key}: #{value.inspect}"}.join(", ")}"
79
+ inspection = "id: #{id.inspect}, #{attributes.map { |key, value| "#{key}: #{value.inspect}"}.join(", ")}"
80
80
  "#<#{model.name} #{inspection}>"
81
81
  end
82
82
  alias :to_s :inspect
83
83
 
84
84
  # TODO: Test this update
85
85
  def as_json(options = {})
86
- attributes_as_json(options).merge! "id" => id
86
+ attributes_as_json(options).merge! 'id' => id
87
87
  end
88
88
 
89
89
  private
90
90
 
91
91
  def to_params
92
- {:body => {:record => attributes_as_json}, :headers => {"Content-Type" => "application/json"}}
92
+ { body: { record: attributes_as_json }, headers: { 'Content-Type' => 'application/json' } }
93
93
  end
94
94
 
95
95
  # TODO: Test this update
96
96
  def attributes_as_json(options = {})
97
- attributes.inject({}) do |h, (k, v)|
97
+ attributes.reduce({}) do |h, (k, v)|
98
98
  h.merge! k => (v.respond_to?(:as_json) ? v.as_json(options) : v) if v
99
99
  h
100
100
  end
@@ -102,4 +102,4 @@ module BettyResource
102
102
 
103
103
  end
104
104
  end
105
- end
105
+ end
@@ -1,7 +1,7 @@
1
1
  module BettyResource
2
2
  MAJOR = 0
3
3
  MINOR = 0
4
- TINY = 13
4
+ TINY = 14
5
5
 
6
- VERSION = [MAJOR, MINOR, TINY].join(".")
6
+ VERSION = [MAJOR, MINOR, TINY].join('.')
7
7
  end
data/script/console CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
- require "rubygems"
3
- require "bundler/setup"
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
4
 
5
5
  Bundler.require :gem_default
6
6
 
@@ -8,4 +8,4 @@ BettyResource.configure(MultiJson.decode(File.read(File.expand_path('../../.cred
8
8
 
9
9
  puts "Loading BettyResource development environment (#{BettyResource::VERSION})"
10
10
  puts "Configured connection with #{BettyResource.config.host}".yellow
11
- Pry.start
11
+ Pry.start
data/test/test_helper.rb CHANGED
@@ -1,18 +1,19 @@
1
- ENV["RACK_ENV"] = "test"
2
- ENV["TESTOPTS"] = "-v"
1
+ ENV['RACK_ENV'] = 'test'
2
+ ENV['TESTOPTS'] = '-v'
3
3
 
4
- require "rubygems"
5
- require "bundler/setup"
4
+ require 'rubygems'
5
+ require 'bundler/setup'
6
6
 
7
- require "minitest/unit"
8
- require "minitest/autorun"
7
+ require 'minitest/unit'
8
+ require 'minitest/autorun'
9
+ require 'minitest/pride'
9
10
 
10
- require "simplecov"
11
+ require 'simplecov'
11
12
 
12
13
  SimpleCov.start do
13
- coverage_dir "coverage"
14
- add_filter "/test/"
14
+ coverage_dir 'coverage'
15
+ add_filter '/test/'
15
16
  end
16
17
 
17
18
  Bundler.require :gem_default, :gem_test
18
- BettyResource.configure(MultiJson.decode(File.read(File.expand_path('../../.credentials', __FILE__))))
19
+ BettyResource.configure(MultiJson.decode(File.read(File.expand_path('../../.credentials', __FILE__))))
@@ -1,147 +1,152 @@
1
- require_relative "../../test_helper"
1
+ require_relative '../../test_helper'
2
2
 
3
3
  module Unit
4
4
  module Record
5
5
  class TestRecord < MiniTest::Unit::TestCase
6
6
 
7
7
  describe BettyResource::Model::Record do
8
- it "should return its model" do
8
+ it 'should return its model' do
9
9
  assert_equal BettyResource::Relation, BettyResource::Relation.new.model
10
10
  assert_equal BettyResource::Relation, BettyResource::Relation.new.class
11
11
  end
12
12
 
13
- it "should return its attributes" do
13
+ it 'should return its attributes' do
14
14
  relation = BettyResource::Relation.new
15
15
  assert_equal %w(first_name group id last_name), relation.attributes.keys.sort
16
16
  end
17
17
 
18
- it "should create a method for writing each attribute" do
18
+ it 'should create a method for writing each attribute' do
19
19
  relation = BettyResource::Relation.new
20
- assert relation.first_name = "my_first_name"
21
- assert relation.last_name = "my_last_name"
20
+ assert relation.first_name = 'my_first_name'
21
+ assert relation.last_name = 'my_last_name'
22
22
  end
23
23
 
24
- it "should create a method for reading each attribute" do
24
+ it 'should create a method for reading each attribute' do
25
25
  relation = BettyResource::Relation.new
26
- relation.first_name = "my_first_name"
27
- assert_equal "my_first_name", relation.first_name
26
+ relation.first_name = 'my_first_name'
27
+ assert_equal 'my_first_name', relation.first_name
28
28
  end
29
29
 
30
- it "should store its values in the @attributes instance variable" do
30
+ it 'should store its values in the @attributes instance variable' do
31
31
  relation = BettyResource::Relation.new
32
- relation.first_name = "my_first_name"
33
- assert_equal "my_first_name", relation.attributes[:first_name]
32
+ relation.first_name = 'my_first_name'
33
+ assert_equal 'my_first_name', relation.attributes[:first_name]
34
34
  end
35
35
 
36
- it "should allow mass-assignment when initializing" do
37
- relation = BettyResource::Relation.new(:first_name => "my_first_name", :last_name => "my_last_name")
38
- assert_equal "my_first_name", relation.first_name
39
- assert_equal "my_last_name", relation.last_name
36
+ it 'should allow mass-assignment when initializing' do
37
+ relation = BettyResource::Relation.new(first_name: 'my_first_name', last_name: 'my_last_name')
38
+ assert_equal 'my_first_name', relation.first_name
39
+ assert_equal 'my_last_name', relation.last_name
40
40
  end
41
41
 
42
- it "should allow mass-assignment when already initialized" do
42
+ it 'should allow mass-assignment when already initialized' do
43
43
  relation = BettyResource::Relation.new
44
- relation.attributes = {:first_name => "my_first_name", :last_name => "my_last_name"}
45
- assert_equal "my_first_name", relation.first_name
46
- assert_equal "my_last_name", relation.last_name
44
+ relation.attributes = { first_name: 'my_first_name', last_name: 'my_last_name' }
45
+ assert_equal 'my_first_name', relation.first_name
46
+ assert_equal 'my_last_name', relation.last_name
47
47
  end
48
48
 
49
- it "should not allow setting of id" do
49
+ it 'should not allow setting of id' do
50
50
  relation = BettyResource::Relation.get(1)
51
51
  assert_equal 1, relation.id
52
52
  assert relation.id = 2
53
53
  assert_equal 1, relation.id
54
54
  end
55
55
 
56
- it "should be able to represent itself as JSON" do
57
- relation = BettyResource::Relation.new(:first_name => "Paul", :last_name => "Engel")
58
- assert_equal({"id" => nil, "first_name" => "Paul", "last_name" => "Engel"}, relation.as_json)
56
+ it 'should be able to represent itself as JSON' do
57
+ relation = BettyResource::Relation.new(first_name: 'Paul', last_name: 'Engel')
58
+ assert_equal({ 'id' => nil, 'first_name' => 'Paul', 'last_name' => 'Engel' }, relation.as_json)
59
59
 
60
60
  relation = BettyResource::Relation.get(1)
61
- assert_equal({"id" => 1, "first_name" => "Daniel", "last_name" => "Willemse", "group"=>{"id"=>1, "name" => "group one"}}, relation.as_json)
62
- assert_equal({"id" => 1, "name" => "group one"}, relation.group.as_json)
61
+ assert_equal({ 'id' => 1, 'first_name' => 'Daniel', 'last_name' => 'Willemse', 'group' => { 'id' => 1, 'name' => 'group one' } }, relation.as_json)
62
+ assert_equal({ 'id' => 1, 'name' => 'group one' }, relation.group.as_json)
63
63
  end
64
64
 
65
- it "should save itself" do
66
- relation = BettyResource::Relation.new(:first_name => "Stephan", :last_name => "Kaag")
65
+ it 'should save itself' do
66
+ relation = BettyResource::Relation.new(first_name: 'Stephan', last_name: 'Kaag')
67
67
  assert relation.save
68
68
  assert relation.id > 0
69
69
 
70
70
  relation = BettyResource::Relation.get(relation.id)
71
- assert_equal "Stephan", relation.first_name
72
- assert_equal "Kaag", relation.last_name
71
+ assert_equal 'Stephan', relation.first_name
72
+ assert_equal 'Kaag', relation.last_name
73
73
  end
74
74
 
75
- it "should save itself when an %-character is used" do
76
- relation = BettyResource::Relation.new(:first_name => "Stephan%")
75
+ it 'should save itself when an %-character is used' do
76
+ relation = BettyResource::Relation.new(first_name: 'Stephan%')
77
77
  assert relation.save
78
78
  assert relation.id > 0
79
79
 
80
80
  relation = BettyResource::Relation.get(relation.id)
81
- assert_equal "Stephan%", relation.first_name
81
+ assert_equal 'Stephan%', relation.first_name
82
82
  end
83
83
 
84
- it "should not save itself when invalid (first_name is required)" do
84
+ it 'should not save itself when invalid (first_name is required)' do
85
85
  relation = BettyResource::Relation.new
86
86
  assert !relation.save
87
- assert_equal({"first_name"=>["is_required"]}, relation.errors)
87
+ assert_equal({ 'first_name' => ['is_required'] }, relation.errors)
88
88
 
89
- relation.first_name = "Stephan"
89
+ relation.first_name = 'Stephan'
90
90
  assert relation.save
91
91
  end
92
92
 
93
- it "should have read-only errors messages" do
93
+ it 'should have read-only errors messages' do
94
94
  relation = BettyResource::Relation.create
95
- assert_equal({"first_name"=>["is_required"]}, relation.errors)
95
+ assert_equal({ 'first_name' => ['is_required'] }, relation.errors)
96
96
 
97
97
  relation.errors.clear
98
- assert_equal({"first_name"=>["is_required"]}, relation.errors)
98
+ assert_equal({ 'first_name' => ['is_required'] }, relation.errors)
99
99
  end
100
100
 
101
- it "should not resave itself when invalid" do
102
- relation = BettyResource::Relation.new :first_name => "Piet"
101
+ it 'should not resave itself when invalid' do
102
+ relation = BettyResource::Relation.new first_name: 'Piet'
103
103
  assert relation.save
104
104
 
105
- relation.first_name = ""
105
+ relation.first_name = ''
106
106
  assert !relation.save
107
107
  assert relation.id > 0
108
108
 
109
- assert_equal "Piet", BettyResource::Relation.get(relation.id).first_name
109
+ assert_equal 'Piet', BettyResource::Relation.get(relation.id).first_name
110
110
  end
111
111
 
112
- it "should update itself" do
113
- relation = BettyResource::Relation.new(:first_name => "Stefan", :last_name => "Kaag")
112
+ it 'should update itself' do
113
+ relation = BettyResource::Relation.new(first_name: 'Stefan', last_name: 'Kaag')
114
114
  relation.save
115
115
 
116
- relation.first_name = "Stephan"
116
+ relation.first_name = 'Stephan'
117
117
  relation.save
118
118
 
119
119
  relation = BettyResource::Relation.get(relation.id)
120
- assert_equal "Stephan", relation.first_name
120
+ assert_equal 'Stephan', relation.first_name
121
121
  end
122
122
 
123
- it "should be able to fetch a belongs-to value" do
123
+ it 'should be able to fetch a belongs-to value' do
124
124
  relation = BettyResource::Relation.get(1)
125
125
  assert_equal 1, relation.group.id
126
126
 
127
127
  filter = {
128
- "operator" => "and",
129
- "conditions" => [
130
- "path" => [BettyResource::Relation.property(:id).id],
131
- "predicate" => "eq",
132
- "criteria" => 1
128
+ 'operator' => 'and',
129
+ 'conditions' => [
130
+ 'path' => [BettyResource::Relation.property(:id).id],
131
+ 'predicate' => 'eq',
132
+ 'criteria' => 1
133
133
  ]
134
134
  }
135
135
 
136
- relations = BettyResource::Relation.all(:filters => [filter])
136
+ relations = BettyResource::Relation.all(filters: [filter])
137
137
  assert_equal 1, relations.size
138
138
  assert_equal 1, relations[0].group.id
139
139
  assert relations[0].group.object_id == relations[0].group.object_id
140
140
 
141
141
  assert_nil BettyResource::Relation.new.group
142
142
  end
143
+
144
+ it 'should be able to fetch a has-many value' do
145
+ group = BettyResource::Group.get(1)
146
+ assert_equal %w(Chris Daniel), group.relations.map(&:first_name).sort
147
+ end
143
148
  end
144
149
 
145
150
  end
146
151
  end
147
- end
152
+ end
@@ -1,10 +1,10 @@
1
- require_relative "../test_helper"
1
+ require_relative '../test_helper'
2
2
 
3
3
  module Unit
4
4
  class TestBase < MiniTest::Unit::TestCase
5
5
 
6
6
  describe BettyResource do
7
- it "should validate its config" do
7
+ it 'should validate its config' do
8
8
  assert config = BettyResource.config
9
9
 
10
10
  config.expects(:host).returns(nil)
@@ -12,25 +12,25 @@ module Unit
12
12
  BettyResource.config
13
13
  end
14
14
 
15
- config.expects(:host).returns("")
15
+ config.expects(:host).returns('')
16
16
  assert_raises(BettyResource::Configuration::InvalidError) do
17
17
  BettyResource.config
18
18
  end
19
19
 
20
- config.expects(:host).returns(" ")
20
+ config.expects(:host).returns(' ')
21
21
  assert_raises(BettyResource::Configuration::InvalidError) do
22
22
  BettyResource.config
23
23
  end
24
24
 
25
- config.expects(:host).returns("localhost")
25
+ config.expects(:host).returns('localhost')
26
26
  assert BettyResource.config
27
27
  end
28
28
 
29
- it "should return a model instance" do
29
+ it 'should return a model instance' do
30
30
  assert BettyResource::Relation.is_a?(BettyResource::Model)
31
31
  end
32
32
 
33
- it "should raise NameError when an unknown model is requested" do
33
+ it 'should raise NameError when an unknown model is requested' do
34
34
  assert_raises(NameError) do
35
35
  assert BettyResource::DoesNotExist
36
36
  end
@@ -38,4 +38,4 @@ module Unit
38
38
  end
39
39
 
40
40
  end
41
- end
41
+ end
@@ -1,26 +1,26 @@
1
- require_relative "../test_helper"
1
+ require_relative '../test_helper'
2
2
 
3
3
  module Unit
4
4
  class TestBase < MiniTest::Unit::TestCase
5
5
 
6
6
  describe BettyResource::Configuration do
7
- it "should be able to validate itself" do
7
+ it 'should be able to validate itself' do
8
8
  config = BettyResource::Configuration.new
9
9
  assert_raises(BettyResource::Configuration::InvalidError) do
10
10
  config.validate!
11
11
  end
12
12
 
13
- config.host = "localhost"
13
+ config.host = 'localhost'
14
14
  assert_raises(BettyResource::Configuration::InvalidError) do
15
15
  config.validate!
16
16
  end
17
17
 
18
- config.host = "localhost"
19
- config.user = "foo"
20
- config.password = "bar"
18
+ config.host = 'localhost'
19
+ config.user = 'foo'
20
+ config.password = 'bar'
21
21
  assert_nil config.validate!
22
22
  end
23
23
  end
24
24
 
25
25
  end
26
- end
26
+ end
@@ -1,67 +1,67 @@
1
- require_relative "../test_helper"
1
+ require_relative '../test_helper'
2
2
 
3
3
  module Unit
4
4
  class TestModel < MiniTest::Unit::TestCase
5
5
 
6
6
  describe BettyResource::Model do
7
- it "should know its properties" do
7
+ it 'should know its properties' do
8
8
  assert BettyResource::Relation.properties.is_a?(Array)
9
9
  assert BettyResource::Relation.properties.any?
10
10
  assert BettyResource::Relation.properties[0].is_a?(BettyResource::Model::Property)
11
11
  end
12
12
 
13
- it "should know its attributes" do
13
+ it 'should know its attributes' do
14
14
  assert_equal %w(first_name group id last_name), BettyResource::Relation.attributes.sort
15
15
  end
16
16
 
17
- it "should return a new record instance" do
17
+ it 'should return a new record instance' do
18
18
  assert BettyResource::Relation.new.is_a?(BettyResource::Model::Record)
19
19
  end
20
20
 
21
- it "should not load unexisting records" do
21
+ it 'should not load unexisting records' do
22
22
  assert_nil BettyResource::Relation.get(-1)
23
23
  end
24
24
 
25
- it "should fetch a record" do
25
+ it 'should fetch a record' do
26
26
  relation = BettyResource::Relation.get(1)
27
27
  assert_equal 1, relation.id
28
- assert_equal "Daniel", relation.first_name
29
- assert_equal "Willemse", relation.last_name
28
+ assert_equal 'Daniel', relation.first_name
29
+ assert_equal 'Willemse', relation.last_name
30
30
  end
31
31
 
32
- it "should fetch a first record" do
32
+ it 'should fetch a first record' do
33
33
  relation = BettyResource::Relation.first
34
34
  assert_equal 1, relation.id
35
- assert_equal "Daniel", relation.first_name
36
- assert_equal "Willemse", relation.last_name
35
+ assert_equal 'Daniel', relation.first_name
36
+ assert_equal 'Willemse', relation.last_name
37
37
 
38
- relation = BettyResource::Relation.first :filters => {:path => BettyResource::Relation.property(:last_name).id, :predicate => "eq", :criteria => "Piet"}
38
+ relation = BettyResource::Relation.first filters: { path: BettyResource::Relation.property(:last_name).id, predicate: 'eq', criteria: 'Piet' }
39
39
  assert_nil relation
40
40
 
41
- relation = BettyResource::Relation.first :filters => {:path => BettyResource::Relation.property(:last_name).id, :predicate => "eq", :criteria => "Willemse"}
41
+ relation = BettyResource::Relation.first filters: { path: BettyResource::Relation.property(:last_name).id, predicate: 'eq', criteria: 'Willemse' }
42
42
  assert_equal 1, relation.id
43
43
  end
44
44
 
45
- it "should fetch multiple records" do
45
+ it 'should fetch multiple records' do
46
46
  relations = BettyResource::Relation.all
47
47
  assert_equal 100, relations.size
48
48
  assert relations.first.is_a?(BettyResource::Model::Record)
49
49
 
50
- relations = BettyResource::Relation.all :limit => 10
50
+ relations = BettyResource::Relation.all limit: 10
51
51
  assert_equal 10, relations.size
52
52
  assert relations.first.is_a?(BettyResource::Model::Record)
53
53
  end
54
54
 
55
- it "should directly create a record" do
56
- relation = BettyResource::Relation.create(:first_name => "Stephan", :last_name => "Kaag")
55
+ it 'should directly create a record' do
56
+ relation = BettyResource::Relation.create(first_name: 'Stephan', last_name: 'Kaag')
57
57
  assert relation
58
58
  assert relation.id > 0
59
59
 
60
60
  relation = BettyResource::Relation.get(relation.id)
61
- assert_equal "Stephan", relation.first_name
62
- assert_equal "Kaag", relation.last_name
61
+ assert_equal 'Stephan', relation.first_name
62
+ assert_equal 'Kaag', relation.last_name
63
63
  end
64
64
  end
65
65
 
66
66
  end
67
- end
67
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: betty_resource
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chiel Wester
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-10-02 00:00:00.000000000 Z
14
+ date: 2013-11-13 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: httparty
@@ -117,9 +117,13 @@ files:
117
117
  - lib/betty_resource.rb
118
118
  - lib/betty_resource/api.rb
119
119
  - lib/betty_resource/configuration.rb
120
+ - lib/betty_resource/kind_extendable.rb
120
121
  - lib/betty_resource/meta_data.rb
121
122
  - lib/betty_resource/model.rb
122
123
  - lib/betty_resource/model/property.rb
124
+ - lib/betty_resource/model/property/types/association.rb
125
+ - lib/betty_resource/model/property/types/belongs_to.rb
126
+ - lib/betty_resource/model/property/types/has_many.rb
123
127
  - lib/betty_resource/model/record.rb
124
128
  - lib/betty_resource/version.rb
125
129
  - script/console
@@ -158,4 +162,3 @@ test_files:
158
162
  - test/unit/test_base.rb
159
163
  - test/unit/test_configuration.rb
160
164
  - test/unit/test_model.rb
161
- has_rdoc: