rhodes 0.3.0 → 1.0.0

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.
Files changed (65) hide show
  1. data/Manifest.txt +0 -61
  2. data/Rakefile +11 -13
  3. data/lib/rhodes.rb +2 -2
  4. metadata +33 -77
  5. data/History.txt +0 -40
  6. data/README.rdoc +0 -2
  7. data/bin/rhogen +0 -8
  8. data/generators/rhogen.rb +0 -131
  9. data/generators/templates/application/application.rb +0 -4
  10. data/generators/templates/application/index.erb +0 -11
  11. data/generators/templates/application/layout.erb +0 -17
  12. data/generators/templates/model/config.rb +0 -3
  13. data/generators/templates/model/controller.rb +0 -49
  14. data/generators/templates/model/edit.erb +0 -21
  15. data/generators/templates/model/index.erb +0 -10
  16. data/generators/templates/model/new.erb +0 -16
  17. data/generators/templates/model/show.erb +0 -6
  18. data/generators/templates/source/source_adapter.rb +0 -56
  19. data/lib/ServeME.rb +0 -7
  20. data/lib/TestServe.rb +0 -9
  21. data/lib/bsearch.rb +0 -120
  22. data/lib/builtinME.rb +0 -588
  23. data/lib/date.rb +0 -1792
  24. data/lib/date/format.rb +0 -1339
  25. data/lib/dateME.rb +0 -24
  26. data/lib/erb.rb +0 -896
  27. data/lib/find.rb +0 -81
  28. data/lib/rational.rb +0 -19
  29. data/lib/rationalME.rb +0 -530
  30. data/lib/rho.rb +0 -1
  31. data/lib/rho/render.rb +0 -51
  32. data/lib/rho/rho.rb +0 -240
  33. data/lib/rho/rhoapplication.rb +0 -36
  34. data/lib/rho/rhocontact.rb +0 -110
  35. data/lib/rho/rhocontroller.rb +0 -35
  36. data/lib/rho/rhofsconnector.rb +0 -32
  37. data/lib/rho/rhosupport.rb +0 -139
  38. data/lib/rho/rhoviewhelpers.rb +0 -121
  39. data/lib/rhoframework.rb +0 -38
  40. data/lib/rhofsconnector.rb +0 -1
  41. data/lib/rhom.rb +0 -1
  42. data/lib/rhom/rhom.rb +0 -58
  43. data/lib/rhom/rhom_db_adapter.rb +0 -185
  44. data/lib/rhom/rhom_db_adapterME.rb +0 -93
  45. data/lib/rhom/rhom_object.rb +0 -65
  46. data/lib/rhom/rhom_object_factory.rb +0 -197
  47. data/lib/rhom/rhom_source.rb +0 -60
  48. data/lib/singleton.rb +0 -137
  49. data/lib/time.rb +0 -489
  50. data/spec/app_generator_spec.rb +0 -33
  51. data/spec/app_manifest.txt +0 -3
  52. data/spec/configs/account.rb +0 -3
  53. data/spec/configs/case.rb +0 -3
  54. data/spec/configs/employee.rb +0 -3
  55. data/spec/generator_spec_helper.rb +0 -12
  56. data/spec/model_generator_spec.rb +0 -36
  57. data/spec/rho_controller_spec.rb +0 -139
  58. data/spec/rho_spec.rb +0 -61
  59. data/spec/rhom_object_factory_spec.rb +0 -132
  60. data/spec/rhom_spec.rb +0 -45
  61. data/spec/source_generator_spec.rb +0 -27
  62. data/spec/spec_helper.rb +0 -48
  63. data/spec/stubs.rb +0 -31
  64. data/spec/syncdbtest.sqlite +0 -0
  65. data/tasks/rspec.rake +0 -34
@@ -1,93 +0,0 @@
1
- #
2
- # rhom_db_adapter.rb
3
- # rhodes
4
- #
5
- # Copyright (C) 2008 Lars Burgess. All rights reserved.
6
- #
7
- # This program is free software: you can redistribute it and/or modify
8
- # it under the terms of the GNU General Public License as published by
9
- # the Free Software Foundation, either version 3 of the License, or
10
- # (at your option) any later version.
11
- #
12
- # This program is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License
18
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
- #
20
- require 'rhodes'
21
-
22
- module Rhom
23
- class RhomDbAdapter
24
-
25
- @@database = nil
26
-
27
- class << self
28
- def open(dbfile=nil)
29
- puts "DB name = " + dbfile.inspect
30
- unless @@database or dbfile.nil?
31
- db = DbAdapter.new(Rhodes::DBVERSION)
32
- @@database = db
33
- end
34
-
35
- end
36
-
37
- def close
38
- if @@database and not @@database.closed?
39
- @@database.close
40
- @@database = nil
41
- else
42
- return false
43
- end
44
- return true
45
- end
46
-
47
- # execute a sql statement
48
- # optionally, disable the factory processing
49
- # which returns the result array directly
50
- def execute_sql
51
- result = []
52
- # Make sure we lock the sync engine's mutex
53
- # before we perform a database transaction.
54
- # This prevents concurrency issues.
55
- begin
56
- SyncEngine::lock_sync_mutex
57
- result = yield
58
- SyncEngine::unlock_sync_mutex
59
- rescue Exception => e
60
- puts "exception when running query: #{e}"
61
- # make sure we unlock even if there's an error!
62
- SyncEngine::unlock_sync_mutex
63
- end
64
- puts "returned #{result.length.to_s} records..."
65
- result
66
- end
67
-
68
- def select_from_table(table=nil,columns=nil,condition=nil,params=nil)
69
- execute_sql { @@database.selectFromTable(table, columns, condition, params) }
70
- end
71
-
72
- def insert_into_table(table=nil,values=nil)
73
- execute_sql { @@database.insertIntoTable(table, values) }
74
- end
75
-
76
- def delete_from_table(table=nil,condition=nil)
77
- execute_sql { @@database.deleteFromTable(table, condition) }
78
- end
79
-
80
- def delete_all_from_table(table=nil)
81
- execute_sql { @@database.deleteAllFromTable(table) }
82
- end
83
-
84
- def update_into_table(table=nil,values=nil,condition=nil)
85
- execute_sql { @@database.updateIntoTable(table, values, condition) }
86
- end
87
- end # class methods
88
- end # RhomDbAdapter
89
- end # Rhom
90
-
91
- at_exit do
92
- Rhom::RhomDbAdapter::close
93
- end
@@ -1,65 +0,0 @@
1
- #
2
- # rhom_object.rb
3
- # rhodes
4
- #
5
- # Copyright (C) 2008 Lars Burgess. All rights reserved.
6
- #
7
- # This program is free software: you can redistribute it and/or modify
8
- # it under the terms of the GNU General Public License as published by
9
- # the Free Software Foundation, either version 3 of the License, or
10
- # (at your option) any later version.
11
- #
12
- # This program is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License
18
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
- #
20
- module Rhom
21
- module RhomObject
22
- # defines a method at runtime for the
23
- # dynamically created class
24
-
25
-
26
- # we override method_missing here so that instance variables,
27
- # when retrieved or set, are added to the object
28
- def method_missing(name, *args)
29
- unless name == Fixnum
30
- varname = name.to_s.gsub(/=/,"")
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}" )
38
- end
39
-
40
- inst_var
41
- end
42
- end
43
-
44
- def remove_var(name)
45
- remove_instance_variable("@#{name}")
46
- end
47
-
48
- def strip_braces(str=nil)
49
- str ? str.gsub(/\{/,"").gsub(/\}/,"") : nil
50
- end
51
-
52
- # use djb hash function to generate temp object id
53
- def djb_hash(str, len)
54
- hash = 5381
55
- for i in (0..len)
56
- hash = ((hash << 5) + hash) + str[i].to_i
57
- end
58
- return hash
59
- end
60
-
61
- def method_name_reserved?(method)
62
- method =~ /object|source_id|update_type|type/
63
- end
64
- end # RhomObject
65
- end # Rhom
@@ -1,197 +0,0 @@
1
- #
2
- # rhom_object_factory.rb
3
- # rhodes
4
- # Returns an array of RhomObjects
5
- #
6
- # Copyright (C) 2008 Lars Burgess. All rights reserved.
7
- #
8
- # This program is free software: you can redistribute it and/or modify
9
- # it under the terms of the GNU General Public License as published by
10
- # the Free Software Foundation, either version 3 of the License, or
11
- # (at your option) any later version.
12
- #
13
- # This program is distributed in the hope that it will be useful,
14
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- # GNU General Public License for more details.
17
- #
18
- # You should have received a copy of the GNU General Public License
19
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
20
- #
21
- require 'rhom'
22
- require 'rho'
23
-
24
- module Rhom
25
- class RhomObjectFactory
26
-
27
- def initialize
28
- unless not defined? Rho::RhoConfig::sources
29
- init_objects
30
- end
31
- end
32
-
33
- # Initialize new object with dynamic attributes
34
- def init_objects
35
- Rho::RhoConfig::sources.each do |classname,source|
36
- unless Object::const_defined?(classname.intern)
37
- Object::const_set(classname.intern,
38
- Class::new do
39
- include ::Rhom::RhomObject
40
- extend ::Rhom::RhomObject
41
-
42
- def initialize(obj=nil)
43
- if obj
44
- # create a temp id for the create type
45
- # TODO: This is duplicative of get_new_obj
46
- temp_objid = djb_hash(obj.values.to_s, 10).to_s
47
- self.send("object=".to_sym(), temp_objid)
48
- self.send("source_id=".to_sym(), obj['source_id'].to_s)
49
- self.send("update_type=".to_sym(), 'create')
50
- obj.each do |key,value|
51
- val = self.inst_strip_braces(value)
52
- self.send("#{key}=".to_sym(), val)
53
- end
54
- end
55
-
56
- end
57
-
58
- class << self
59
-
60
- def get_source_id
61
- Rho::RhoConfig::sources[self.name.to_s]['source_id'].to_s
62
- end
63
-
64
- # retrieve a single record if object id provided, otherwise return
65
- # full list corresponding to factory's source id
66
- def find(*args)
67
- list = []
68
- hash_list = {}
69
- conditions = {}
70
-
71
- # first find all query objects
72
- if args.first == :all
73
- conditions = {"source_id"=>get_source_id}
74
- else
75
- conditions = {"object"=>strip_braces(args.first.to_s)}
76
- end
77
-
78
- # process query, create, and update lists in order
79
- ["query", "create", "update"].each do |update_type|
80
- conditions.merge!({"update_type"=>update_type})
81
- objs = ::Rhom::RhomDbAdapter::select_from_table(::Rhom::TABLE_NAME, '*', conditions,
82
- {"order by"=>'object'})
83
- objs.collect! do |obj|
84
- object = obj['object']
85
- attrib = obj['attrib']
86
- value = obj['value']
87
- hash_list[object] = get_new_obj(obj) if not hash_list[object]
88
- if not method_name_reserved?(attrib) and hash_list[object].send(attrib.to_sym)
89
- hash_list[object].remove_var(attrib)
90
- end
91
- hash_list[object].send("#{attrib}=".to_sym(), value) if not method_name_reserved?(attrib)
92
- nil # remove the element from the array
93
- end
94
- end
95
-
96
- # convert hash to array
97
- list = hash_list.values
98
- hash_list = nil
99
- if list.length == 1 and args.first != :all
100
- return list[0]
101
- end
102
- list
103
- end
104
-
105
- def find_by(*args)
106
- # TODO: implement
107
- end
108
-
109
- private
110
- # returns new model instance with a temp object id
111
- def get_new_obj(obj, type='query')
112
- tmp_obj = self.new
113
- tmp_obj.send("object=".to_sym(), "{#{obj['object'].to_s}}")
114
- tmp_obj
115
- end
116
- end #class methods
117
-
118
- # deletes the record from the viewable list as well as
119
- # adding a delete record to the list of sync operations
120
- def destroy
121
- result = nil
122
- obj = self.inst_strip_braces(self.object)
123
- if obj
124
- # first delete the record from viewable list
125
- result = ::Rhom::RhomDbAdapter::delete_from_table(::Rhom::TABLE_NAME,
126
- {"object"=>obj})
127
- # now add delete operation
128
- result = ::Rhom::RhomDbAdapter::insert_into_table(::Rhom::TABLE_NAME,
129
- {"source_id"=>self.get_inst_source_id,
130
- "object"=>obj,
131
- "update_type"=>'delete'})
132
- end
133
- result
134
- end
135
-
136
- # saves the current object to the database as a create type
137
- def save
138
- result = nil
139
- # iterate over each instance variable and insert create row to table
140
- obj = self.inst_strip_braces(self.object)
141
- self.instance_variables.each do |method|
142
- method = method.to_s.gsub(/@/,"")
143
- # Don't save objects with braces to database
144
- val = self.inst_strip_braces(self.send(method.to_sym))
145
- # add rows excluding object, source_id and update_type
146
- unless self.method_name_reserved?(method) or val.nil?
147
- result = ::Rhom::RhomDbAdapter::insert_into_table(::Rhom::TABLE_NAME,
148
- {"source_id"=>self.get_inst_source_id,
149
- "object"=>obj,
150
- "attrib"=>method,
151
- "value"=>val,
152
- "update_type"=>'create'})
153
- end
154
- end
155
- result
156
- end
157
-
158
- # updates the current record in the viewable list and adds
159
- # a sync operation to update
160
- def update_attributes(attrs)
161
- result = nil
162
- obj = self.inst_strip_braces(self.object)
163
- self.instance_variables.each do |method|
164
- method = method.to_s.gsub(/@/,"")
165
- val = self.send method.to_sym
166
- # Don't save objects with braces to database
167
- new_val = self.inst_strip_braces(attrs[method])
168
- # if the object's value doesn't match the database record
169
- # then we procede with update
170
- if new_val and val != new_val
171
- unless self.method_name_reserved?(method) or new_val.length == 0
172
- # update sync list
173
- result = ::Rhom::RhomDbAdapter::insert_into_table(::Rhom::TABLE_NAME,
174
- {"source_id"=>self.get_inst_source_id,
175
- "object"=>obj,
176
- "attrib"=>method,
177
- "value"=>new_val,
178
- "update_type"=>'update'})
179
- end
180
- end
181
- end
182
- result
183
- end
184
-
185
- def get_inst_source_id
186
- Rho::RhoConfig::sources[self.class.name.to_s]['source_id'].to_s
187
- end
188
-
189
- def inst_strip_braces(str=nil)
190
- str ? str.gsub(/\{/,"").gsub(/\}/,"") : nil
191
- end
192
- end)
193
- end
194
- end
195
- end
196
- end # RhomObjectFactory
197
- end # Rhom
@@ -1,60 +0,0 @@
1
- require 'time'
2
- require 'rhom/rhom_object'
3
-
4
- module Rhom
5
- class RhomSource
6
- include RhomObject
7
- attr_accessor :source_url
8
- attr_reader :source_id, :name, :last_updated, :last_inserted_size,
9
- :last_deleted_size, :last_sync_duration,
10
- :last_sync_success, :distinct_objects
11
-
12
- def initialize(args,count=0)
13
- # setup the name
14
- # TODO: should really store this in the database
15
- Rho::RhoConfig::sources.each do |key,value|
16
- if value['source_id'].to_i == args['source_id'].to_i
17
- @name = key
18
- end
19
- end
20
- @source_id = args['source_id'].to_i
21
- @source_url = args['source_url']
22
- @last_updated = Time.at(args['last_updated'].to_i).to_s
23
- @last_inserted_size = args['last_inserted_size'].to_i
24
- @last_deleted_size = args['last_deleted_size'].to_i
25
- @last_sync_duration = args['last_sync_duration'].to_i
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
32
- end
33
-
34
- class << self
35
- include RhomObject
36
- def find(*args)
37
- list = []
38
- if args.first == :all
39
- results = ::Rhom::RhomDbAdapter::select_from_table('sources', '*')
40
-
41
- results.each do |result|
42
- list << RhomSource.new(result)
43
- end
44
- else
45
- result = ::Rhom::RhomDbAdapter::select_from_table('sources', '*',
46
- {"source_id" => strip_braces(args.first)}).first
47
- list << RhomSource.new(result)
48
- end
49
- list.size > 1 ? list : list[0]
50
- end
51
- end
52
-
53
- def update_attributes(params=nil)
54
- if params
55
- ::Rhom::RhomDbAdapter::update_into_table('sources', {"source_url"=>params['source_url']},
56
- {"source_id"=>strip_braces(params['source_id'])})
57
- end
58
- end
59
- end
60
- end
@@ -1,137 +0,0 @@
1
- # The Singleton module implements the Singleton pattern.
2
- #
3
- # Usage:
4
- # class Klass
5
- # include Singleton
6
- # # ...
7
- # end
8
- #
9
- # * this ensures that only one instance of Klass lets call it
10
- # ``the instance'' can be created.
11
- #
12
- # a,b = Klass.instance, Klass.instance
13
- # a == b # => true
14
- # a.new # NoMethodError - new is private ...
15
- #
16
- # * ``The instance'' is created at instantiation time, in other
17
- # words the first call of Klass.instance(), thus
18
- #
19
- # class OtherKlass
20
- # include Singleton
21
- # # ...
22
- # end
23
- # ObjectSpace.each_object(OtherKlass){} # => 0.
24
- #
25
- # * This behavior is preserved under inheritance and cloning.
26
- #
27
- #
28
- #
29
- # This is achieved by marking
30
- # * Klass.new and Klass.allocate - as private
31
- #
32
- # Providing (or modifying) the class methods
33
- # * Klass.inherited(sub_klass) and Klass.clone() -
34
- # to ensure that the Singleton pattern is properly
35
- # inherited and cloned.
36
- #
37
- # * Klass.instance() - returning ``the instance''. After a
38
- # successful self modifying (normally the first) call the
39
- # method body is a simple:
40
- #
41
- # def Klass.instance()
42
- # return @singleton__instance__
43
- # end
44
- #
45
- # * Klass._load(str) - calling Klass.instance()
46
- #
47
- # * Klass._instantiate?() - returning ``the instance'' or
48
- # nil. This hook method puts a second (or nth) thread calling
49
- # Klass.instance() on a waiting loop. The return value
50
- # signifies the successful completion or premature termination
51
- # of the first, or more generally, current "instantiation thread".
52
- #
53
- #
54
- # The instance method of Singleton are
55
- # * clone and dup - raising TypeErrors to prevent cloning or duping
56
- #
57
- # * _dump(depth) - returning the empty string. Marshalling strips
58
- # by default all state information, e.g. instance variables and
59
- # taint state, from ``the instance''. Providing custom _load(str)
60
- # and _dump(depth) hooks allows the (partially) resurrections of
61
- # a previous state of ``the instance''.
62
-
63
- require 'thread'
64
-
65
- module Singleton
66
- # disable build-in copying methods
67
- def clone
68
- raise TypeError, "can't clone instance of singleton #{self.class}"
69
- end
70
- def dup
71
- raise TypeError, "can't dup instance of singleton #{self.class}"
72
- end
73
-
74
- # default marshalling strategy
75
- def _dump(depth = -1)
76
- ''
77
- end
78
-
79
- module SingletonClassMethods
80
- # properly clone the Singleton pattern - did you know
81
- # that duping doesn't copy class methods?
82
- def clone
83
- Singleton.__init__(super)
84
- end
85
-
86
- def _load(str)
87
- instance
88
- end
89
-
90
- private
91
-
92
- # ensure that the Singleton pattern is properly inherited
93
- def inherited(sub_klass)
94
- super
95
- Singleton.__init__(sub_klass)
96
- end
97
- end
98
-
99
- class << Singleton
100
- def __init__(klass)
101
- klass.instance_eval {
102
- @singleton__instance__ = nil
103
- @singleton__mutex__ = Mutex.new
104
- }
105
- def klass.instance
106
- return @singleton__instance__ if @singleton__instance__
107
- @singleton__mutex__.synchronize {
108
- return @singleton__instance__ if @singleton__instance__
109
- @singleton__instance__ = new()
110
- }
111
- @singleton__instance__
112
- end
113
- klass
114
- end
115
-
116
- private
117
-
118
- # extending an object with Singleton is a bad idea
119
- undef_method :extend_object
120
-
121
- def append_features(mod)
122
- # help out people counting on transitive mixins
123
- unless mod.instance_of?(Class)
124
- raise TypeError, "Inclusion of the OO-Singleton module in module #{mod}"
125
- end
126
- super
127
- end
128
-
129
- def included(klass)
130
- super
131
- klass.private_class_method :new, :allocate
132
- klass.extend SingletonClassMethods
133
- Singleton.__init__(klass)
134
- end
135
- end
136
-
137
- end