clevic 0.13.0.b3 → 0.13.0.b5
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 +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
|