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.
Files changed (82) hide show
  1. data/History.txt +21 -0
  2. data/Manifest.txt +91 -85
  3. data/README.txt +33 -18
  4. data/Rakefile +2 -3
  5. data/TODO +8 -14
  6. data/bin/clevic +18 -20
  7. data/lib/clevic.rb +7 -1
  8. data/lib/clevic/action_builder.rb +4 -1
  9. data/lib/clevic/ar_methods.rb +72 -57
  10. data/lib/clevic/attribute_list.rb +4 -0
  11. data/lib/clevic/cache_table.rb +43 -69
  12. data/lib/clevic/dataset_roller.rb +22 -0
  13. data/lib/clevic/delegate.rb +11 -5
  14. data/lib/clevic/delegates/combo_delegate.rb +156 -0
  15. data/lib/clevic/delegates/distinct_delegate.rb +48 -0
  16. data/lib/clevic/delegates/relational_delegate.rb +59 -0
  17. data/lib/clevic/delegates/set_delegate.rb +31 -0
  18. data/lib/clevic/field.rb +39 -55
  19. data/lib/clevic/field_valuer.rb +23 -10
  20. data/lib/clevic/filter_command.rb +22 -36
  21. data/lib/clevic/framework.rb +37 -0
  22. data/lib/clevic/generic_format.rb +5 -1
  23. data/lib/clevic/many_field.rb +28 -3
  24. data/lib/clevic/model_builder.rb +27 -32
  25. data/lib/clevic/ordered_dataset.rb +45 -0
  26. data/lib/clevic/qt.rb +4 -1
  27. data/lib/clevic/qt/action_builder.rb +9 -1
  28. data/lib/clevic/qt/browser.rb +1 -1
  29. data/lib/clevic/qt/clipboard.rb +3 -3
  30. data/lib/clevic/qt/combo_delegate.rb +25 -89
  31. data/lib/clevic/qt/delegate.rb +25 -0
  32. data/lib/clevic/qt/distinct_delegate.rb +5 -23
  33. data/lib/clevic/qt/extensions.rb +8 -1
  34. data/lib/clevic/qt/qt_combo_box.rb +58 -0
  35. data/lib/clevic/qt/relational_delegate.rb +18 -58
  36. data/lib/clevic/qt/set_delegate.rb +4 -34
  37. data/lib/clevic/qt/simplest_delegate.rb +19 -0
  38. data/lib/clevic/qt/table_model.rb +10 -10
  39. data/lib/clevic/qt/table_view.rb +7 -23
  40. data/lib/clevic/qt/text_delegate.rb +2 -2
  41. data/lib/clevic/qt/ui/browser_ui.rb +1 -1
  42. data/lib/clevic/qt/ui/search_dialog_ui.rb +1 -1
  43. data/lib/clevic/rails_models_loaders.rb +13 -0
  44. data/lib/clevic/record.rb +2 -2
  45. data/lib/clevic/sampler.rb +85 -39
  46. data/lib/clevic/sequel_ar_adapter.rb +1 -28
  47. data/lib/clevic/sequel_clevic.rb +68 -0
  48. data/lib/clevic/sequel_meta.rb +1 -13
  49. data/lib/clevic/subclasses.rb +18 -0
  50. data/lib/clevic/swing.rb +2 -1
  51. data/lib/clevic/swing/action.rb +27 -3
  52. data/lib/clevic/swing/action_builder.rb +0 -2
  53. data/lib/clevic/swing/browser.rb +1 -10
  54. data/lib/clevic/swing/combo_delegate.rb +45 -133
  55. data/lib/clevic/swing/delegate.rb +2 -0
  56. data/lib/clevic/swing/distinct_delegate.rb +2 -14
  57. data/lib/clevic/swing/relational_delegate.rb +2 -20
  58. data/lib/clevic/swing/set_delegate.rb +13 -28
  59. data/lib/clevic/swing/table_view.rb +1 -1
  60. data/lib/clevic/table_model.rb +3 -4
  61. data/lib/clevic/table_searcher.rb +10 -31
  62. data/lib/clevic/table_view.rb +97 -43
  63. data/lib/clevic/ui/browser_ui.rb +133 -0
  64. data/lib/clevic/ui/search_dialog_ui.rb +106 -0
  65. data/lib/clevic/version.rb +2 -2
  66. data/models/accounts_models.rb +24 -21
  67. data/models/times_models.rb +34 -28
  68. data/models/times_psql_models.rb +9 -3
  69. data/models/times_sqlite_models.rb +24 -1
  70. data/sql/times_sqlite.sql +3 -3
  71. data/tasks/clevic.rake +2 -2
  72. data/test/test_cache_table.rb +9 -19
  73. data/test/test_table_searcher.rb +2 -5
  74. metadata +95 -91
  75. data/lib/clevic/order_attribute.rb +0 -63
  76. data/lib/clevic/qt/boolean_delegate.rb +0 -8
  77. data/lib/clevic/qt/delegates.rb +0 -1
  78. data/lib/clevic/qt/item_delegate.rb +0 -66
  79. data/lib/clevic/sql_dialects.rb +0 -33
  80. data/tasks/website.rake +0 -25
  81. data/test/test_order_attribute.rb +0 -62
  82. 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
@@ -1,8 +0,0 @@
1
- require 'clevic/qt/text_delegate.rb'
2
-
3
- module Clevic
4
-
5
- # TODO alias this for now
6
- BooleanDelegate = TextDelegate
7
-
8
- end
@@ -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
@@ -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
@@ -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