rhodes 0.2.4 → 0.2.5
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.
- data/History.txt +3 -0
- data/Manifest.txt +1 -0
- data/Rakefile +2 -1
- data/generators/rhogen.rb +2 -1
- data/generators/templates/model/edit.erb +1 -1
- data/generators/templates/model/new.erb +1 -1
- data/lib/bsearch.rb +120 -0
- data/lib/rho/rhocontact.rb +46 -3
- data/lib/rhodes.rb +1 -1
- data/lib/rhom/rhom_object.rb +9 -5
- data/lib/rhom/rhom_object_factory.rb +7 -7
- data/lib/rhom/rhom_source.rb +7 -2
- data/spec/rhom_object_factory_spec.rb +19 -2
- metadata +13 -2
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
data/Rakefile
CHANGED
data/generators/rhogen.rb
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require 'rubygems'
|
|
2
2
|
require 'templater'
|
|
3
|
+
require 'activesupport'
|
|
3
4
|
|
|
4
5
|
module Rhogen
|
|
5
|
-
|
|
6
6
|
extend Templater::Manifold
|
|
7
7
|
|
|
8
8
|
desc <<-DESC
|
|
@@ -50,6 +50,7 @@ module Rhogen
|
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
class ModelGenerator < BaseGenerator
|
|
53
|
+
include ActiveSupport::Inflector
|
|
53
54
|
|
|
54
55
|
def self.source_root
|
|
55
56
|
File.join(File.dirname(__FILE__), 'templates', 'model')
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<input type="hidden" name="id" value="<%%=@<%= name %>.object%>"/>
|
|
8
8
|
<% attributes.each do |attribute| %>
|
|
9
9
|
<div class="row">
|
|
10
|
-
<label><%=attribute%>: </label>
|
|
10
|
+
<label><%=humanize(attribute)%>: </label>
|
|
11
11
|
<input type="text" name="<%= name %>[<%= attribute %>]" value="<%%=@<%=name%>.<%=attribute%>%>"/>
|
|
12
12
|
</div>
|
|
13
13
|
<% end %>
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<input type="hidden" name="id" value="<%%=@<%= name %>.object%>"/>
|
|
8
8
|
<% attributes.each do |attribute| %>
|
|
9
9
|
<div class="row">
|
|
10
|
-
<label><%=attribute%>: </label>
|
|
10
|
+
<label><%=humanize(attribute)%>: </label>
|
|
11
11
|
<input type="text" name="<%= name %>[<%= attribute %>]"/>
|
|
12
12
|
</div>
|
|
13
13
|
<% end %>
|
data/lib/bsearch.rb
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Ruby/Bsearch - a binary search library for Ruby.
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2001 Satoru Takabayashi <satoru@namazu.org>
|
|
5
|
+
# All rights reserved.
|
|
6
|
+
# This is free software with ABSOLUTELY NO WARRANTY.
|
|
7
|
+
#
|
|
8
|
+
# You can redistribute it and/or modify it under the terms of
|
|
9
|
+
# the Ruby's licence.
|
|
10
|
+
#
|
|
11
|
+
# Example:
|
|
12
|
+
#
|
|
13
|
+
# % irb -r ./bsearch.rb
|
|
14
|
+
# >> %w(a b c c c d e f).bsearch_first {|x| x <=> "c"}
|
|
15
|
+
# => 2
|
|
16
|
+
# >> %w(a b c c c d e f).bsearch_last {|x| x <=> "c"}
|
|
17
|
+
# => 4
|
|
18
|
+
# >> %w(a b c e f).bsearch_first {|x| x <=> "c"}
|
|
19
|
+
# => 2
|
|
20
|
+
# >> %w(a b e f).bsearch_first {|x| x <=> "c"}
|
|
21
|
+
# => nil
|
|
22
|
+
# >> %w(a b e f).bsearch_last {|x| x <=> "c"}
|
|
23
|
+
# => nil
|
|
24
|
+
# >> %w(a b e f).bsearch_lower_boundary {|x| x <=> "c"}
|
|
25
|
+
# => 2
|
|
26
|
+
# >> %w(a b e f).bsearch_upper_boundary {|x| x <=> "c"}
|
|
27
|
+
# => 2
|
|
28
|
+
# >> %w(a b c c c d e f).bsearch_range {|x| x <=> "c"}
|
|
29
|
+
# => 2...5
|
|
30
|
+
# >> %w(a b c d e f).bsearch_range {|x| x <=> "c"}
|
|
31
|
+
# => 2...3
|
|
32
|
+
# >> %w(a b d e f).bsearch_range {|x| x <=> "c"}
|
|
33
|
+
# => 2...2
|
|
34
|
+
|
|
35
|
+
module Bsearch
|
|
36
|
+
VERSION = '1.5'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class Array
|
|
40
|
+
#
|
|
41
|
+
# The binary search algorithm is extracted from Jon Bentley's
|
|
42
|
+
# Programming Pearls 2nd ed. p.93
|
|
43
|
+
#
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# Return the lower boundary. (inside)
|
|
47
|
+
#
|
|
48
|
+
def bsearch_lower_boundary (range = 0 ... self.length, &block)
|
|
49
|
+
lower = range.first() -1
|
|
50
|
+
upper = if range.exclude_end? then range.last else range.last + 1 end
|
|
51
|
+
while lower + 1 != upper
|
|
52
|
+
mid = ((lower + upper) / 2).to_i # for working with mathn.rb (Rational)
|
|
53
|
+
if yield(self[mid]) < 0
|
|
54
|
+
lower = mid
|
|
55
|
+
else
|
|
56
|
+
upper = mid
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
return upper
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
#
|
|
63
|
+
# This method searches the FIRST occurrence which satisfies a
|
|
64
|
+
# condition given by a block in binary fashion and return the
|
|
65
|
+
# index of the first occurrence. Return nil if not found.
|
|
66
|
+
#
|
|
67
|
+
def bsearch_first (range = 0 ... self.length, &block)
|
|
68
|
+
boundary = bsearch_lower_boundary(range, &block)
|
|
69
|
+
if boundary >= self.length || yield(self[boundary]) != 0
|
|
70
|
+
return nil
|
|
71
|
+
else
|
|
72
|
+
return boundary
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
alias bsearch bsearch_first
|
|
77
|
+
|
|
78
|
+
#
|
|
79
|
+
# Return the upper boundary. (outside)
|
|
80
|
+
#
|
|
81
|
+
def bsearch_upper_boundary (range = 0 ... self.length, &block)
|
|
82
|
+
lower = range.first() -1
|
|
83
|
+
upper = if range.exclude_end? then range.last else range.last + 1 end
|
|
84
|
+
while lower + 1 != upper
|
|
85
|
+
mid = ((lower + upper) / 2).to_i # for working with mathn.rb (Rational)
|
|
86
|
+
if yield(self[mid]) <= 0
|
|
87
|
+
lower = mid
|
|
88
|
+
else
|
|
89
|
+
upper = mid
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
return lower + 1 # outside of the matching range.
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
#
|
|
96
|
+
# This method searches the LAST occurrence which satisfies a
|
|
97
|
+
# condition given by a block in binary fashion and return the
|
|
98
|
+
# index of the last occurrence. Return nil if not found.
|
|
99
|
+
#
|
|
100
|
+
def bsearch_last (range = 0 ... self.length, &block)
|
|
101
|
+
# `- 1' for canceling `lower + 1' in bsearch_upper_boundary.
|
|
102
|
+
boundary = bsearch_upper_boundary(range, &block) - 1
|
|
103
|
+
|
|
104
|
+
if (boundary <= -1 || yield(self[boundary]) != 0)
|
|
105
|
+
return nil
|
|
106
|
+
else
|
|
107
|
+
return boundary
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
#
|
|
112
|
+
# Return the search result as a Range object.
|
|
113
|
+
#
|
|
114
|
+
def bsearch_range (range = 0 ... self.length, &block)
|
|
115
|
+
lower = bsearch_lower_boundary(range, &block)
|
|
116
|
+
upper = bsearch_upper_boundary(range, &block)
|
|
117
|
+
return lower ... upper
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
data/lib/rho/rhocontact.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'bsearch'
|
|
2
|
+
|
|
1
3
|
module Rho
|
|
2
4
|
class RhoContact
|
|
3
5
|
class << self
|
|
@@ -62,6 +64,47 @@ module Rho
|
|
|
62
64
|
end
|
|
63
65
|
end
|
|
64
66
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
# Examples of how to use select method:
|
|
68
|
+
#
|
|
69
|
+
# selected = Rho::RhoContact.select('first_name' => 'David') { |x| x[1]['last_name']=='Taylor' }
|
|
70
|
+
# ==> returns record(s) of the David Taylor
|
|
71
|
+
#
|
|
72
|
+
# selected = Rho::RhoContact.select('first_name' => 'Kate')
|
|
73
|
+
# ==> Returns all records of Kate
|
|
74
|
+
#
|
|
75
|
+
# selected = Rho::RhoContact.select('last_name' => 'User') do |x|
|
|
76
|
+
# x[1]['first_name']=='Test' and x[1]['company_name']=="rhomobile"
|
|
77
|
+
# end
|
|
78
|
+
# ==> returns all records of the Test User from the company rhomobile
|
|
79
|
+
#
|
|
80
|
+
def select(index, &block)
|
|
81
|
+
key, value = index.keys[0], index.values[0]
|
|
82
|
+
if @contacts.nil? or @key != key
|
|
83
|
+
@key, @contacts = key, find(:all).to_a.sort! {|x,y| x[1][key] <=> y[1][key] }
|
|
84
|
+
end
|
|
85
|
+
found = @contacts[@contacts.bsearch_range {|x| x[1][key] <=> value}]
|
|
86
|
+
unless found.nil? or block.nil?
|
|
87
|
+
return found.select(&block)
|
|
88
|
+
end
|
|
89
|
+
return found
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def select_by_name(first_last_name, &block)
|
|
93
|
+
if @contacts.nil?
|
|
94
|
+
@contacts = find(:all).to_a.sort! do |x,y|
|
|
95
|
+
x[1]['first_name'] + " " + x[1]['last_name'] <=> y[1]['first_name'] + " " + y[1]['last_name']
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
range = @contacts.bsearch_range do |x|
|
|
99
|
+
x[1]['first_name'] + " " + x[1]['last_name'] <=> first_last_name
|
|
100
|
+
end
|
|
101
|
+
found = @contacts[range]
|
|
102
|
+
unless found.nil? or block.nil?
|
|
103
|
+
return found.select(&block)
|
|
104
|
+
end
|
|
105
|
+
return found
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end #<< self
|
|
109
|
+
end # class RhoContact
|
|
110
|
+
end # module Rho
|
data/lib/rhodes.rb
CHANGED
data/lib/rhom/rhom_object.rb
CHANGED
|
@@ -28,12 +28,16 @@ module Rhom
|
|
|
28
28
|
def method_missing(name, *args)
|
|
29
29
|
unless name == Fixnum
|
|
30
30
|
varname = name.to_s.gsub(/=/,"")
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
instance_variable_set( "@#{varname}", args )
|
|
31
|
+
setting = (name.to_s =~ /=/)
|
|
32
|
+
inst_var = nil
|
|
33
|
+
|
|
34
|
+
if setting
|
|
35
|
+
inst_var = instance_variable_set( "@#{varname}", args[0] )
|
|
36
|
+
else
|
|
37
|
+
inst_var = instance_variable_get( "@#{varname}" )
|
|
36
38
|
end
|
|
39
|
+
|
|
40
|
+
inst_var
|
|
37
41
|
end
|
|
38
42
|
end
|
|
39
43
|
|
|
@@ -60,12 +60,12 @@ module Rhom
|
|
|
60
60
|
# create a temp id for the create type
|
|
61
61
|
# TODO: This is duplicative of get_new_obj
|
|
62
62
|
temp_objid = djb_hash(obj.values.to_s, 10).to_s
|
|
63
|
-
self.send
|
|
64
|
-
self.send
|
|
65
|
-
self.send
|
|
63
|
+
self.send :object=, "#{temp_objid}"
|
|
64
|
+
self.send :source_id=, obj['source_id'].to_s
|
|
65
|
+
self.send :update_type=, 'create'
|
|
66
66
|
obj.each do |key,value|
|
|
67
67
|
val = self.inst_strip_braces(value)
|
|
68
|
-
self.send key, val
|
|
68
|
+
self.send "#{key}=".to_sym, val
|
|
69
69
|
end
|
|
70
70
|
end
|
|
71
71
|
|
|
@@ -106,10 +106,10 @@ module Rhom
|
|
|
106
106
|
attrib = obj['attrib']
|
|
107
107
|
value = obj['value']
|
|
108
108
|
hash_list[object] = get_new_obj(obj) if not hash_list[object]
|
|
109
|
-
if not method_name_reserved?(attrib) and hash_list[object].send
|
|
109
|
+
if not method_name_reserved?(attrib) and hash_list[object].send(attrib.to_sym)
|
|
110
110
|
hash_list[object].remove_var(attrib)
|
|
111
111
|
end
|
|
112
|
-
hash_list[object].send
|
|
112
|
+
hash_list[object].send("#{attrib}=".to_sym(), value) if not method_name_reserved?(attrib)
|
|
113
113
|
nil # remove the element from the array
|
|
114
114
|
end
|
|
115
115
|
end
|
|
@@ -131,7 +131,7 @@ module Rhom
|
|
|
131
131
|
# returns new model instance with a temp object id
|
|
132
132
|
def get_new_obj(obj, type='query')
|
|
133
133
|
tmp_obj = self.new
|
|
134
|
-
tmp_obj.send
|
|
134
|
+
tmp_obj.send :object=, "{#{obj['object'].to_s}}"
|
|
135
135
|
tmp_obj
|
|
136
136
|
end
|
|
137
137
|
end #class methods
|
data/lib/rhom/rhom_source.rb
CHANGED
|
@@ -7,9 +7,9 @@ module Rhom
|
|
|
7
7
|
attr_accessor :source_url
|
|
8
8
|
attr_reader :source_id, :name, :last_updated, :last_inserted_size,
|
|
9
9
|
:last_deleted_size, :last_sync_duration,
|
|
10
|
-
:last_sync_success
|
|
10
|
+
:last_sync_success, :distinct_objects
|
|
11
11
|
|
|
12
|
-
def initialize(args)
|
|
12
|
+
def initialize(args,count=0)
|
|
13
13
|
# setup the name
|
|
14
14
|
# TODO: should really store this in the database
|
|
15
15
|
Rho::RhoConfig::sources.each do |key,value|
|
|
@@ -24,6 +24,11 @@ module Rhom
|
|
|
24
24
|
@last_deleted_size = args['last_deleted_size'].to_i
|
|
25
25
|
@last_sync_duration = args['last_sync_duration'].to_i
|
|
26
26
|
@last_sync_success = args['last_sync_success'].to_i == 1 ? true : false
|
|
27
|
+
@distinct_objects = ::Rhom::RhomDbAdapter::select_from_table(
|
|
28
|
+
::Rhom::TABLE_NAME,
|
|
29
|
+
'object',
|
|
30
|
+
{"source_id"=>@source_id},
|
|
31
|
+
{"distinct"=>true}).length
|
|
27
32
|
end
|
|
28
33
|
|
|
29
34
|
class << self
|
|
@@ -36,7 +36,7 @@ describe "RhomObjectFactory" do
|
|
|
36
36
|
"2".should == Case.get_source_id
|
|
37
37
|
"3".should == Employee.get_source_id
|
|
38
38
|
end
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
it "should dynamically assign values" do
|
|
41
41
|
account = Account.new
|
|
42
42
|
account.name = 'hello name'
|
|
@@ -109,7 +109,7 @@ describe "RhomObjectFactory" do
|
|
|
109
109
|
@new_acct.name.should == "Mobio US"
|
|
110
110
|
@new_acct.industry.should == "Technology"
|
|
111
111
|
end
|
|
112
|
-
|
|
112
|
+
|
|
113
113
|
it "should fully update a record" do
|
|
114
114
|
new_attributes = {"name"=>"Mobio US", "industry"=>"Electronics"}
|
|
115
115
|
@account = Account.find(:all).first
|
|
@@ -120,4 +120,21 @@ describe "RhomObjectFactory" do
|
|
|
120
120
|
@new_acct.name.should == "Mobio US"
|
|
121
121
|
@new_acct.industry.should == "Electronics"
|
|
122
122
|
end
|
|
123
|
+
|
|
124
|
+
it "should retrieve and modify one record" do
|
|
125
|
+
@acct = Account.find('44e804f2-4933-4e20-271c-48fcecd9450d')
|
|
126
|
+
|
|
127
|
+
@acct.name.should == "Mobio US"
|
|
128
|
+
@acct.industry.should == "Technology"
|
|
129
|
+
|
|
130
|
+
@acct.name = "Rhomobile US"
|
|
131
|
+
|
|
132
|
+
@acct.name.should == "Rhomobile US"
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
it "should return an empty value for a non-existent attribute" do
|
|
136
|
+
@acct = Account.find('44e804f2-4933-4e20-271c-48fcecd9450d')
|
|
137
|
+
|
|
138
|
+
@acct.foobar.should be_nil
|
|
139
|
+
end
|
|
123
140
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rhodes
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Rhomobile Dev
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2009-01-
|
|
12
|
+
date: 2009-01-28 00:00:00 -08:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
@@ -82,6 +82,16 @@ dependencies:
|
|
|
82
82
|
- !ruby/object:Gem::Version
|
|
83
83
|
version: "0"
|
|
84
84
|
version:
|
|
85
|
+
- !ruby/object:Gem::Dependency
|
|
86
|
+
name: activesupport
|
|
87
|
+
type: :runtime
|
|
88
|
+
version_requirement:
|
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
90
|
+
requirements:
|
|
91
|
+
- - ">="
|
|
92
|
+
- !ruby/object:Gem::Version
|
|
93
|
+
version: "0"
|
|
94
|
+
version:
|
|
85
95
|
- !ruby/object:Gem::Dependency
|
|
86
96
|
name: hoe
|
|
87
97
|
type: :development
|
|
@@ -124,6 +134,7 @@ files:
|
|
|
124
134
|
- generators/templates/source/source_adapter.rb
|
|
125
135
|
- lib/ServeME.rb
|
|
126
136
|
- lib/TestServe.rb
|
|
137
|
+
- lib/bsearch.rb
|
|
127
138
|
- lib/builtinME.rb
|
|
128
139
|
- lib/date.rb
|
|
129
140
|
- lib/date/format.rb
|