clevic 0.13.0.b3 → 0.13.0.b5
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +21 -0
- data/Manifest.txt +91 -85
- data/README.txt +33 -18
- data/Rakefile +2 -3
- data/TODO +8 -14
- data/bin/clevic +18 -20
- data/lib/clevic.rb +7 -1
- data/lib/clevic/action_builder.rb +4 -1
- data/lib/clevic/ar_methods.rb +72 -57
- data/lib/clevic/attribute_list.rb +4 -0
- data/lib/clevic/cache_table.rb +43 -69
- data/lib/clevic/dataset_roller.rb +22 -0
- data/lib/clevic/delegate.rb +11 -5
- data/lib/clevic/delegates/combo_delegate.rb +156 -0
- data/lib/clevic/delegates/distinct_delegate.rb +48 -0
- data/lib/clevic/delegates/relational_delegate.rb +59 -0
- data/lib/clevic/delegates/set_delegate.rb +31 -0
- data/lib/clevic/field.rb +39 -55
- data/lib/clevic/field_valuer.rb +23 -10
- data/lib/clevic/filter_command.rb +22 -36
- data/lib/clevic/framework.rb +37 -0
- data/lib/clevic/generic_format.rb +5 -1
- data/lib/clevic/many_field.rb +28 -3
- data/lib/clevic/model_builder.rb +27 -32
- data/lib/clevic/ordered_dataset.rb +45 -0
- data/lib/clevic/qt.rb +4 -1
- data/lib/clevic/qt/action_builder.rb +9 -1
- data/lib/clevic/qt/browser.rb +1 -1
- data/lib/clevic/qt/clipboard.rb +3 -3
- data/lib/clevic/qt/combo_delegate.rb +25 -89
- data/lib/clevic/qt/delegate.rb +25 -0
- data/lib/clevic/qt/distinct_delegate.rb +5 -23
- data/lib/clevic/qt/extensions.rb +8 -1
- data/lib/clevic/qt/qt_combo_box.rb +58 -0
- data/lib/clevic/qt/relational_delegate.rb +18 -58
- data/lib/clevic/qt/set_delegate.rb +4 -34
- data/lib/clevic/qt/simplest_delegate.rb +19 -0
- data/lib/clevic/qt/table_model.rb +10 -10
- data/lib/clevic/qt/table_view.rb +7 -23
- data/lib/clevic/qt/text_delegate.rb +2 -2
- data/lib/clevic/qt/ui/browser_ui.rb +1 -1
- data/lib/clevic/qt/ui/search_dialog_ui.rb +1 -1
- data/lib/clevic/rails_models_loaders.rb +13 -0
- data/lib/clevic/record.rb +2 -2
- data/lib/clevic/sampler.rb +85 -39
- data/lib/clevic/sequel_ar_adapter.rb +1 -28
- data/lib/clevic/sequel_clevic.rb +68 -0
- data/lib/clevic/sequel_meta.rb +1 -13
- data/lib/clevic/subclasses.rb +18 -0
- data/lib/clevic/swing.rb +2 -1
- data/lib/clevic/swing/action.rb +27 -3
- data/lib/clevic/swing/action_builder.rb +0 -2
- data/lib/clevic/swing/browser.rb +1 -10
- data/lib/clevic/swing/combo_delegate.rb +45 -133
- data/lib/clevic/swing/delegate.rb +2 -0
- data/lib/clevic/swing/distinct_delegate.rb +2 -14
- data/lib/clevic/swing/relational_delegate.rb +2 -20
- data/lib/clevic/swing/set_delegate.rb +13 -28
- data/lib/clevic/swing/table_view.rb +1 -1
- data/lib/clevic/table_model.rb +3 -4
- data/lib/clevic/table_searcher.rb +10 -31
- data/lib/clevic/table_view.rb +97 -43
- data/lib/clevic/ui/browser_ui.rb +133 -0
- data/lib/clevic/ui/search_dialog_ui.rb +106 -0
- data/lib/clevic/version.rb +2 -2
- data/models/accounts_models.rb +24 -21
- data/models/times_models.rb +34 -28
- data/models/times_psql_models.rb +9 -3
- data/models/times_sqlite_models.rb +24 -1
- data/sql/times_sqlite.sql +3 -3
- data/tasks/clevic.rake +2 -2
- data/test/test_cache_table.rb +9 -19
- data/test/test_table_searcher.rb +2 -5
- metadata +95 -91
- data/lib/clevic/order_attribute.rb +0 -63
- data/lib/clevic/qt/boolean_delegate.rb +0 -8
- data/lib/clevic/qt/delegates.rb +0 -1
- data/lib/clevic/qt/item_delegate.rb +0 -66
- data/lib/clevic/sql_dialects.rb +0 -33
- data/tasks/website.rake +0 -25
- data/test/test_order_attribute.rb +0 -62
- data/test/test_sql_dialects.rb +0 -77
@@ -1,63 +0,0 @@
|
|
1
|
-
=begin rdoc
|
2
|
-
Store the SQL order_by attributes with ascending and descending values
|
3
|
-
=end
|
4
|
-
# TODO don't use this anymore
|
5
|
-
class OrderAttribute
|
6
|
-
attr_reader :direction, :attribute
|
7
|
-
|
8
|
-
def initialize( entity_class, sql_order_fragment )
|
9
|
-
@entity_class = entity_class
|
10
|
-
if sql_order_fragment =~ /^(.*?\.)?(.*?) *asc$/i
|
11
|
-
@direction = :asc
|
12
|
-
@attribute = $2
|
13
|
-
elsif sql_order_fragment =~ /^(.*?\.)?(.*?) *desc$/i
|
14
|
-
@direction = :desc
|
15
|
-
@attribute = $2
|
16
|
-
else
|
17
|
-
@direction = :asc
|
18
|
-
@attribute = sql_order_fragment
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
# return ORDER BY field name
|
23
|
-
def to_s
|
24
|
-
@string ||= attribute
|
25
|
-
end
|
26
|
-
|
27
|
-
def to_sym
|
28
|
-
@sym ||= attribute.to_sym
|
29
|
-
end
|
30
|
-
|
31
|
-
# return 'field ASC' or 'field DESC', depending
|
32
|
-
def to_sql
|
33
|
-
"#{@entity_class.table_name}.#{attribute} #{direction.to_s}"
|
34
|
-
end
|
35
|
-
|
36
|
-
def reverse( direction )
|
37
|
-
case direction
|
38
|
-
when :asc; :desc
|
39
|
-
when :desc; :asc
|
40
|
-
else; raise "unknown direction #{direction}"
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# return the opposite ASC or DESC from to_sql
|
45
|
-
def to_reverse_sql
|
46
|
-
"#{@entity_class.table_name}.#{attribute} #{reverse(direction).to_s}"
|
47
|
-
end
|
48
|
-
|
49
|
-
def ==( other )
|
50
|
-
@entity_class == other.instance_eval( '@entity_class' ) and
|
51
|
-
self.direction == other.direction and
|
52
|
-
self.attribute == other.attribute
|
53
|
-
end
|
54
|
-
|
55
|
-
# return -1 for desc, 1 for asc
|
56
|
-
def to_i
|
57
|
-
case direction
|
58
|
-
when :asc; 1
|
59
|
-
when :desc; -1
|
60
|
-
else; raise "unknown direction #{direction}"
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
data/lib/clevic/qt/delegates.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
|
@@ -1,66 +0,0 @@
|
|
1
|
-
require 'Qt4'
|
2
|
-
|
3
|
-
module Qt
|
4
|
-
class KeyEvent
|
5
|
-
def inspect
|
6
|
-
"<Qt::KeyEvent text=#{text} key=#{key}"
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
module Clevic
|
12
|
-
|
13
|
-
class ItemDelegate < Qt::ItemDelegate
|
14
|
-
attr_reader :field
|
15
|
-
|
16
|
-
def initialize( field )
|
17
|
-
raise "field is nil" if field.nil?
|
18
|
-
# pass nil as Qt object's parent. Will set parent later.
|
19
|
-
super( nil )
|
20
|
-
@field = field
|
21
|
-
end
|
22
|
-
|
23
|
-
def attribute
|
24
|
-
field.attribute
|
25
|
-
end
|
26
|
-
|
27
|
-
def entity_class
|
28
|
-
field.entity_class
|
29
|
-
end
|
30
|
-
|
31
|
-
def find_options
|
32
|
-
field.find_options
|
33
|
-
end
|
34
|
-
|
35
|
-
# Figure out where to put the editor widget, taking into
|
36
|
-
# account the sizes of the headers
|
37
|
-
def updateEditorGeometry( editor, style_option_view_item, model_index )
|
38
|
-
rect = style_option_view_item.rect
|
39
|
-
rect.set_width( [editor.size_hint.width,rect.width].max )
|
40
|
-
rect.set_height( editor.size_hint.height )
|
41
|
-
editor.set_geometry( rect )
|
42
|
-
end
|
43
|
-
|
44
|
-
# This catches the event that begins the edit process.
|
45
|
-
def editorEvent ( event, model, style_option_view_item, model_index )
|
46
|
-
parent.before_edit_index = model_index
|
47
|
-
super
|
48
|
-
end
|
49
|
-
|
50
|
-
# This is called when one of the EditTriggers is pressed. So
|
51
|
-
# it's only good for opening a generic keystroke editor, not
|
52
|
-
# a specific one, eg a calendar-style date editor.
|
53
|
-
#~ def createEditor( parent_widget, style_option_view_item, model_index )
|
54
|
-
#~ end
|
55
|
-
|
56
|
-
# Set the data for the given editor widget
|
57
|
-
#~ def setEditorData( editor_widget, model_index )
|
58
|
-
#~ end
|
59
|
-
|
60
|
-
# Set the data for the given model and index from the given
|
61
|
-
#~ def setModelData( editor_widget, abstract_item_model, model_index )
|
62
|
-
#~ end
|
63
|
-
|
64
|
-
end
|
65
|
-
|
66
|
-
end
|
data/lib/clevic/sql_dialects.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
module Clevic
|
2
|
-
# Provide some SQL dialect differences that aren't in ActiveRecord. Including
|
3
|
-
# class must respond to entity_class.
|
4
|
-
module SqlDialects
|
5
|
-
def adapter_name
|
6
|
-
connection.adapter_name
|
7
|
-
end
|
8
|
-
|
9
|
-
def connection
|
10
|
-
entity_class.connection
|
11
|
-
end
|
12
|
-
|
13
|
-
# return a string containing the correct
|
14
|
-
# boolean value depending on the DB adapter
|
15
|
-
# because Postgres wants real true and false in complex statements, not 't' and 'f'
|
16
|
-
def sql_boolean( value )
|
17
|
-
case adapter_name
|
18
|
-
when 'PostgreSQL'
|
19
|
-
value ? 'true' : 'false'
|
20
|
-
else
|
21
|
-
value ? connection.quoted_true : connection.quoted_false
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
# return a case-insensitive like operator
|
26
|
-
def like_operator
|
27
|
-
case adapter_name
|
28
|
-
when 'PostgreSQL'; 'ilike'
|
29
|
-
else; 'like'
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
data/tasks/website.rake
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
task :ruby_env do
|
2
|
-
RUBY_APP = if RUBY_PLATFORM =~ /java/
|
3
|
-
"jruby"
|
4
|
-
else
|
5
|
-
"ruby"
|
6
|
-
end unless defined? RUBY_APP
|
7
|
-
end
|
8
|
-
|
9
|
-
desc 'Generate website files'
|
10
|
-
task :website_generate => :ruby_env do
|
11
|
-
(Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
|
12
|
-
sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
desc 'Upload website files to rubyforge'
|
17
|
-
task :upload_website do
|
18
|
-
host = "#{rubyforge_username}@rubyforge.org"
|
19
|
-
remote_dir = "/var/www/gforge-projects/#{PATH}/"
|
20
|
-
local_dir = 'website'
|
21
|
-
sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
|
22
|
-
end
|
23
|
-
|
24
|
-
desc 'Generate and upload website files'
|
25
|
-
task :website => [:website_generate, :website_upload, :publish_docs]
|
@@ -1,62 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper'
|
2
|
-
require 'clevic/order_attribute.rb'
|
3
|
-
|
4
|
-
class Dummy < Sequel::Model
|
5
|
-
end
|
6
|
-
|
7
|
-
# need to set up a test DB, and test data for this
|
8
|
-
class TestOrderAttribute < Test::Unit::TestCase
|
9
|
-
def setup
|
10
|
-
end
|
11
|
-
|
12
|
-
def teardown
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_reverse
|
16
|
-
oa = OrderAttribute.new Dummy, 'id'
|
17
|
-
assert_equal :asc, oa.reverse( :desc )
|
18
|
-
assert_equal :desc, oa.reverse( :asc )
|
19
|
-
assert_raise( RuntimeError ) { oa.reverse( :something_wrong ) }
|
20
|
-
end
|
21
|
-
|
22
|
-
# Test that initialisation was OK
|
23
|
-
def test_equal
|
24
|
-
oa1 = OrderAttribute.new Dummy, 'id'
|
25
|
-
oa2 = OrderAttribute.new Dummy, 'id'
|
26
|
-
assert_equal oa1, oa2
|
27
|
-
assert_equal oa1.to_sql, 'dummies.id asc'
|
28
|
-
assert_equal oa1.to_reverse_sql, 'dummies.id desc'
|
29
|
-
assert_equal oa1.attribute.to_sym, oa1.to_sym
|
30
|
-
|
31
|
-
assert_equal oa2.to_sql, 'dummies.id asc'
|
32
|
-
assert_equal oa2.to_reverse_sql, 'dummies.id desc'
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_parse_default
|
36
|
-
oa_asc = OrderAttribute.new Dummy, "name"
|
37
|
-
assert_equal 'name', oa_asc.attribute
|
38
|
-
assert_equal :asc, oa_asc.direction
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_parse_desc
|
42
|
-
oa_desc = OrderAttribute.new Dummy, "name desc"
|
43
|
-
assert_equal 'name', oa_desc.attribute
|
44
|
-
assert_equal 'name', oa_desc.to_s
|
45
|
-
assert_equal :desc, oa_desc.direction
|
46
|
-
assert_equal oa_desc.to_sql, 'dummies.name desc'
|
47
|
-
assert_equal 'dummies.name asc', oa_desc.to_reverse_sql
|
48
|
-
|
49
|
-
oa_desc = OrderAttribute.new Dummy, "dummies.name desc"
|
50
|
-
assert_equal 'name', oa_desc.attribute
|
51
|
-
assert_equal :desc, oa_desc.direction
|
52
|
-
assert_equal oa_desc.to_sql, 'dummies.name desc'
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_parse_table
|
56
|
-
oa_with_table = OrderAttribute.new Dummy, 'dummies.name asc'
|
57
|
-
assert_equal 'name', oa_with_table.attribute
|
58
|
-
assert_equal :asc, oa_with_table.direction
|
59
|
-
assert_equal oa_with_table.to_sql, 'dummies.name asc'
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
data/test/test_sql_dialects.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
-
require 'clevic/sql_dialects.rb'
|
3
|
-
|
4
|
-
# TODO should probably connect to real DB drivers to do this
|
5
|
-
|
6
|
-
class MockPostgreSQL
|
7
|
-
include Clevic::SqlDialects
|
8
|
-
def adapter_name
|
9
|
-
'PostgreSQL'
|
10
|
-
end
|
11
|
-
|
12
|
-
def connection
|
13
|
-
self
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
class MockOther
|
19
|
-
include Clevic::SqlDialects
|
20
|
-
def adapter_name
|
21
|
-
'Something else entirely'
|
22
|
-
end
|
23
|
-
|
24
|
-
def connection
|
25
|
-
self
|
26
|
-
end
|
27
|
-
|
28
|
-
def quoted_true; "'t'"; end
|
29
|
-
def quoted_false; "'f'"; end
|
30
|
-
end
|
31
|
-
|
32
|
-
class TestSqlDialects < Test::Unit::TestCase
|
33
|
-
def self.startup
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.shutdown
|
37
|
-
end
|
38
|
-
|
39
|
-
def setup
|
40
|
-
end
|
41
|
-
|
42
|
-
context MockPostgreSQL.name do
|
43
|
-
setup do
|
44
|
-
@dialect = MockPostgreSQL.new
|
45
|
-
end
|
46
|
-
|
47
|
-
should 'return ilike' do
|
48
|
-
assert_equal 'ilike', @dialect.like_operator
|
49
|
-
end
|
50
|
-
|
51
|
-
should "return true" do
|
52
|
-
assert_equal "true", @dialect.sql_boolean( true )
|
53
|
-
end
|
54
|
-
|
55
|
-
should "return false" do
|
56
|
-
assert_equal "false", @dialect.sql_boolean( false )
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
context MockOther.name do
|
61
|
-
setup do
|
62
|
-
@dialect = MockOther.new
|
63
|
-
end
|
64
|
-
|
65
|
-
should 'return like' do
|
66
|
-
assert_equal 'like', @dialect.like_operator
|
67
|
-
end
|
68
|
-
|
69
|
-
should "return 't'" do
|
70
|
-
assert_equal "'t'", @dialect.sql_boolean( true )
|
71
|
-
end
|
72
|
-
|
73
|
-
should "return 'f'" do
|
74
|
-
assert_equal "'f'", @dialect.sql_boolean( false )
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|