slacker 0.0.1

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 (46) hide show
  1. data/Gemfile +4 -0
  2. data/Gemfile.lock +26 -0
  3. data/LICENSE +3 -0
  4. data/README.markdown +16 -0
  5. data/Rakefile +11 -0
  6. data/bin/slacker +28 -0
  7. data/lib/slacker.rb +138 -0
  8. data/lib/slacker/application.rb +201 -0
  9. data/lib/slacker/command_line_formatter.rb +59 -0
  10. data/lib/slacker/configuration.rb +59 -0
  11. data/lib/slacker/formatter.rb +19 -0
  12. data/lib/slacker/query_result_matcher.rb +169 -0
  13. data/lib/slacker/rspec_ext.rb +69 -0
  14. data/lib/slacker/rspec_monkey.rb +7 -0
  15. data/lib/slacker/sql.rb +39 -0
  16. data/lib/slacker/string_helper.rb +17 -0
  17. data/lib/slacker/version.rb +3 -0
  18. data/slacker.gemspec +23 -0
  19. data/spec/application_spec.rb +14 -0
  20. data/spec/query_result_matcher_spec.rb +267 -0
  21. data/spec/rspec_ext_spec.rb +127 -0
  22. data/spec/slacker_spec.rb +60 -0
  23. data/spec/spec_helper.rb +9 -0
  24. data/spec/test_files/matcher/completely_blank.csv +0 -0
  25. data/spec/test_files/matcher/no_rows.csv +1 -0
  26. data/spec/test_files/matcher/test_1.csv +3 -0
  27. data/spec/test_files/test_slacker_project/data/test_1.csv +3 -0
  28. data/spec/test_files/test_slacker_project/sql/example_1/helper_1.sql +1 -0
  29. data/spec/test_files/test_slacker_project/sql/example_1/helper_2.sql +1 -0
  30. data/spec/test_files/test_slacker_project/sql/example_1/helper_2.sql.erb +1 -0
  31. data/spec/test_files/test_slacker_project/sql/helpers/HELPER_4.SQL +1 -0
  32. data/spec/test_files/test_slacker_project/sql/helpers/helper_1.sql +1 -0
  33. data/spec/test_files/test_slacker_project/sql/helpers/helper_2.sql.erb +1 -0
  34. data/spec/test_files/test_slacker_project/sql/helpers/helper_3.sql +1 -0
  35. data/spec/test_files/test_slacker_project/sql/helpers/helper_3.sql.erb +1 -0
  36. data/spec/test_files/test_slacker_project/sql/helpers/text_file_1.txt +1 -0
  37. data/spec/test_files/test_slacker_project/sql/multi_nested.sql.erb +1 -0
  38. data/spec/test_files/test_slacker_project/sql/nest/example_1/helper_1.sql.erb +1 -0
  39. data/spec/test_files/test_slacker_project/sql/nest/nested_1.sql.erb +2 -0
  40. data/spec/test_files/test_slacker_project/sql/nest/nested_2.sql.erb +1 -0
  41. data/spec/test_files/test_slacker_project/sql/nested.sql.erb +1 -0
  42. data/spec/test_files/test_slacker_project/sql/nested_with_params.sql.erb +1 -0
  43. data/spec/test_files/test_slacker_project/sql/no_params.sql.erb +3 -0
  44. data/spec/test_files/test_slacker_project/sql/params.sql.erb +2 -0
  45. data/spec/test_files/test_slacker_project/sql/test_1.sql +1 -0
  46. metadata +114 -0
@@ -0,0 +1,127 @@
1
+ require 'slacker'
2
+ require 'spec_helper'
3
+ require 'ostruct'
4
+
5
+ class RSpecSlackerHost
6
+ include Slacker::RSpecExt
7
+ end
8
+
9
+ describe Slacker::RSpecExt do
10
+ before(:each) do
11
+ Slacker::configure do |config|
12
+ config.base_dir = SpecHelper.expand_test_files_path('test_slacker_project')
13
+ end
14
+
15
+ example = OpenStruct.new
16
+ example.metadata = {:sql => '', :example_group => {:file_path => SpecHelper.expand_test_files_path('test_slacker_project/spec/example_xyz.rb')}}
17
+
18
+ @instance = RSpecSlackerHost.new
19
+ @instance.stub(:example).and_return(example)
20
+ end
21
+
22
+ it 'responds to query' do
23
+ @instance.should respond_to(:query)
24
+ end
25
+
26
+ it 'responds to match' do
27
+ @instance.should respond_to(:match)
28
+ end
29
+
30
+ it 'responds to csv' do
31
+ @instance.should respond_to(:csv)
32
+ end
33
+
34
+ it 'responds to load_csv' do
35
+ @instance.should respond_to(:load_csv)
36
+ end
37
+
38
+ it 'responds to result' do
39
+ @instance.should respond_to(:result)
40
+ end
41
+
42
+ it 'responds to sql' do
43
+ @instance.should respond_to(:sql)
44
+ end
45
+
46
+ context 'responds to ghost methods' do
47
+ before(:each) do
48
+ Slacker.application.stub(:query_script) {|sql| sql}
49
+ end
50
+
51
+ specify 'described as SQL files found in the sql/helpers folder' do
52
+ @instance.sql.respond_to?(:helpers).should be_true
53
+ @instance.sql.helpers.respond_to?(:helper_1).should be_true
54
+ @instance.sql.helpers.helper_1.should == 'helpers/helper_1.sql called'
55
+ end
56
+
57
+ specify 'described as SQL.ERB files found in the sql/helpers folder' do
58
+ @instance.sql.helpers.respond_to?(:helper_2).should be_true
59
+ @instance.sql.helpers.helper_2.should == 'helpers/helper_2.sql.erb called'
60
+ end
61
+
62
+ specify 'with SQL files taking priority over SQL.ERB files' do
63
+ @instance.sql.helpers.respond_to?(:helper_3).should be_true
64
+ @instance.sql.helpers.helper_3.should == 'helpers/helper_3.sql called'
65
+ end
66
+
67
+ specify 'but ignores non-existing methods' do
68
+ @instance.sql.helpers.respond_to?(:some_bogus_method).should be_false
69
+ end
70
+
71
+ specify 'but ignores files which are not with SQL or SQL.ERB extension' do
72
+ @instance.sql.helpers.respond_to?(:text_file_1).should be_false
73
+ end
74
+
75
+ specify 'and is case insensitive' do
76
+ @instance.sql.helpers.respond_to?(:helper_4).should be_true
77
+ @instance.sql.helpers.respond_to?(:hElpEr_4).should be_true
78
+ @instance.sql.helpers.helper_4.should == 'helpers/HELPER_4.SQL called'
79
+ @instance.sql.helpers.heLpEr_4.should == 'helpers/HELPER_4.SQL called'
80
+ end
81
+
82
+ specify 'from folders other than helpers' do
83
+ @instance.sql.respond_to?(:example_1).should be_true
84
+ @instance.sql.example_1.respond_to?(:helper_1).should be_true
85
+ @instance.sql.example_1.helper_1.should == 'example_1/helper_1.sql called'
86
+ end
87
+
88
+ specify "works with deeply nested example files reflecting their location in the lookup of SQL files in the SQL folder" do
89
+ @instance.sql.respond_to?(:nest).should be_true
90
+ @instance.sql.nest.respond_to?(:example_1).should be_true
91
+ @instance.sql.nest.example_1.respond_to?(:helper_1).should be_true
92
+ @instance.sql.nest.example_1.helper_1.should == 'nest/example_1/helper_1.sql.erb called'
93
+ end
94
+
95
+ # context do
96
+ # before(:each) do
97
+ # # Fake the current example in the RSpec ext
98
+ # @example = OpenStruct.new :metadata => {:sql => ''}
99
+ # @instance.stub(:example).and_return(@example)
100
+ # end
101
+ #
102
+ # specify "with files from the current example's file folder taking priority over the helpers folder" do
103
+ # @example.metadata[:example_group] = {:file_path => SpecHelper.expand_test_files_path('test_slacker_project/spec/example_1.rb')}
104
+ # @instance.sql.respond_to?(:helper_1).should be_true
105
+ # @instance.sql.helper_1.should == 'example_1/helper_1.sql called'
106
+ # end
107
+ #
108
+ # specify "in example group giving priority to SQL files over SQL.ERB files" do
109
+ # @example.metadata[:example_group] = {:file_path => SpecHelper.expand_test_files_path('test_slacker_project/spec/example_1.rb')}
110
+ # @instance.sql.respond_to?(:helper_2).should be_true
111
+ # @instance.sql.helper_2.should == 'example_1/helper_2.sql called'
112
+ # end
113
+ #
114
+ # specify "works with deeply nested example files reflecting their location in the lookup of SQL files in the SQL folder" do
115
+ # @example.metadata[:example_group] = {:file_path => SpecHelper.expand_test_files_path('test_slacker_project/spec/nest/example_1.rb')}
116
+ # @instance.sql.respond_to?(:helper_1).should be_true
117
+ # @instance.sql.helper_1.should == 'nest/example_1/helper_1.sql.erb called'
118
+ # end
119
+ #
120
+ # specify "falls back to the global helper when there is no matching file in the example folder" do
121
+ # @example.metadata[:example_group] = {:file_path => SpecHelper.expand_test_files_path('test_slacker_project/spec/example_1.rb')}
122
+ # @instance.sql.respond_to?(:helper_3).should be_true
123
+ # @instance.sql.helper_3.should == 'helpers/helper_3.sql called'
124
+ # end
125
+ # end
126
+ end
127
+ end
@@ -0,0 +1,60 @@
1
+ require 'slacker'
2
+ require 'spec_helper'
3
+
4
+ describe Slacker do
5
+ it 'exposes a singleton application object' do
6
+ app = Slacker::application
7
+ app.should equal(Slacker::application)
8
+ end
9
+
10
+ it 'and it''s base folder can be configured through a call to configure' do
11
+ Slacker.configure do |config|
12
+ config.base_dir = 'xyz'
13
+ end
14
+
15
+ Slacker.configuration.base_dir.should == 'xyz'
16
+ end
17
+
18
+ it 'converts a hash array to csv' do
19
+ csv = Slacker.hash_array_to_csv [{'a' => 1, 'b' => 2}, {'a' => 3, 'b' => 4}]
20
+ csv.to_csv.should == "a,b\n1,2\n3,4\n"
21
+ end
22
+
23
+ context 'provides SQL resolution' do
24
+ before(:each) do
25
+ Slacker.configure do |config|
26
+ config.base_dir = SpecHelper.expand_test_files_path('test_slacker_project')
27
+ end
28
+ end
29
+
30
+ specify 'which resolves to a SQL string when a non-file is sent to it' do
31
+ Slacker.sql_from_query_string("select 'abc' as xyz").should == "select 'abc' as xyz"
32
+ end
33
+
34
+ specify 'which resolves to the correct contents of a SQL file' do
35
+ Slacker.sql_from_query_string("test_1.sql").should == "select 1;"
36
+ end
37
+
38
+ context 'of an ERB file' do
39
+ specify 'with no params' do
40
+ Slacker.sql_from_query_string("no_params.sql.erb").should == "select 1;\nselect 2;\n"
41
+ end
42
+
43
+ specify 'with params' do
44
+ Slacker.sql_from_query_string("params.sql.erb", {:param1 => 11, :param2 => 12}).should == "select 11;\nselect 12;"
45
+ end
46
+
47
+ specify 'which calls another ERB file with no params' do
48
+ Slacker.sql_from_query_string("nested.sql.erb").should == "select 1;\nselect 2;\n"
49
+ end
50
+
51
+ specify 'which calls another ERB file with params' do
52
+ Slacker.sql_from_query_string("nested_with_params.sql.erb", {:param1 => 21, :param2 => 22}).should == "select 21;\nselect 22;"
53
+ end
54
+
55
+ specify 'which calls complex multi-nested file' do
56
+ Slacker.sql_from_query_string("multi_nested.sql.erb", {:seed => 1}).should == "seed 1;\nselect 3;\nselect 4;"
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,9 @@
1
+ module SpecHelper
2
+ def self.expand_test_files_path(path)
3
+ File.expand_path("#{File.dirname(__FILE__)}/test_files/#{path}")
4
+ end
5
+
6
+ def self.load_csv(file)
7
+ CSV.read(expand_test_files_path(file), {:headers => true, :encoding => 'Windows-1252'})
8
+ end
9
+ end
File without changes
@@ -0,0 +1 @@
1
+ "Field 1","Field 2"
@@ -0,0 +1,3 @@
1
+ "Field 1","Field_2","b"
2
+ 12,,""
3
+ "test string",01/01/2011,8.9
@@ -0,0 +1,3 @@
1
+ "Field 1","Field_2","b"
2
+ 12,10,11
3
+ "test string",01/01/2011,8.9
@@ -0,0 +1 @@
1
+ example_1/helper_1.sql called
@@ -0,0 +1 @@
1
+ example_1/helper_2.sql called
@@ -0,0 +1 @@
1
+ example_1/helper_2.sql.erb called
@@ -0,0 +1 @@
1
+ helpers/HELPER_4.SQL called
@@ -0,0 +1 @@
1
+ helpers/helper_1.sql called
@@ -0,0 +1 @@
1
+ helpers/helper_2.sql.erb called
@@ -0,0 +1 @@
1
+ helpers/helper_3.sql called
@@ -0,0 +1 @@
1
+ helpers/helper_3.sql.erb called
@@ -0,0 +1 @@
1
+ helpers/text_file_1.txt called
@@ -0,0 +1 @@
1
+ <%= render 'nest/nested_1.sql.erb', params %>
@@ -0,0 +1 @@
1
+ nest/example_1/helper_1.sql.erb called
@@ -0,0 +1,2 @@
1
+ seed <%= params[:seed] %>;
2
+ <%= render 'nested_2.sql.erb', {:seed => params[:seed] + 1}%>
@@ -0,0 +1 @@
1
+ <%= render '/params.sql.erb', {:param1 => params[:seed] + 1, :param2 => params[:seed] + 2} %>
@@ -0,0 +1 @@
1
+ <%= render "no_params.sql.erb" %>
@@ -0,0 +1 @@
1
+ <%= render 'params.sql.erb', params %>
@@ -0,0 +1,3 @@
1
+ <%2.times do |i|%>
2
+ select <%=i+1%>;
3
+ <%end%>
@@ -0,0 +1,2 @@
1
+ select <%= params[:param1] %>;
2
+ select <%= params[:param2] %>;
@@ -0,0 +1 @@
1
+ select 1;
metadata ADDED
@@ -0,0 +1,114 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: slacker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Vassil Kovatchev
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-06-23 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ruby-odbc
16
+ requirement: &17545896 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - =
20
+ - !ruby/object:Gem::Version
21
+ version: '0.99994'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *17545896
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &17545596 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - =
31
+ - !ruby/object:Gem::Version
32
+ version: 2.5.0
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *17545596
36
+ description: RSpec-based framework for developing automated tests for SQL Server programmable
37
+ objects such as stored procedures and scalar/table functions
38
+ email:
39
+ - vassil.kovatchev@gmail.com
40
+ executables:
41
+ - slacker
42
+ extensions: []
43
+ extra_rdoc_files: []
44
+ files:
45
+ - Gemfile
46
+ - Gemfile.lock
47
+ - LICENSE
48
+ - README.markdown
49
+ - Rakefile
50
+ - bin/slacker
51
+ - lib/slacker.rb
52
+ - lib/slacker/application.rb
53
+ - lib/slacker/command_line_formatter.rb
54
+ - lib/slacker/configuration.rb
55
+ - lib/slacker/formatter.rb
56
+ - lib/slacker/query_result_matcher.rb
57
+ - lib/slacker/rspec_ext.rb
58
+ - lib/slacker/rspec_monkey.rb
59
+ - lib/slacker/sql.rb
60
+ - lib/slacker/string_helper.rb
61
+ - lib/slacker/version.rb
62
+ - slacker.gemspec
63
+ - spec/application_spec.rb
64
+ - spec/query_result_matcher_spec.rb
65
+ - spec/rspec_ext_spec.rb
66
+ - spec/slacker_spec.rb
67
+ - spec/spec_helper.rb
68
+ - spec/test_files/matcher/completely_blank.csv
69
+ - spec/test_files/matcher/no_rows.csv
70
+ - spec/test_files/matcher/test_1.csv
71
+ - spec/test_files/test_slacker_project/data/test_1.csv
72
+ - spec/test_files/test_slacker_project/sql/example_1/helper_1.sql
73
+ - spec/test_files/test_slacker_project/sql/example_1/helper_2.sql
74
+ - spec/test_files/test_slacker_project/sql/example_1/helper_2.sql.erb
75
+ - spec/test_files/test_slacker_project/sql/helpers/HELPER_4.SQL
76
+ - spec/test_files/test_slacker_project/sql/helpers/helper_1.sql
77
+ - spec/test_files/test_slacker_project/sql/helpers/helper_2.sql.erb
78
+ - spec/test_files/test_slacker_project/sql/helpers/helper_3.sql
79
+ - spec/test_files/test_slacker_project/sql/helpers/helper_3.sql.erb
80
+ - spec/test_files/test_slacker_project/sql/helpers/text_file_1.txt
81
+ - spec/test_files/test_slacker_project/sql/multi_nested.sql.erb
82
+ - spec/test_files/test_slacker_project/sql/nest/example_1/helper_1.sql.erb
83
+ - spec/test_files/test_slacker_project/sql/nest/nested_1.sql.erb
84
+ - spec/test_files/test_slacker_project/sql/nest/nested_2.sql.erb
85
+ - spec/test_files/test_slacker_project/sql/nested.sql.erb
86
+ - spec/test_files/test_slacker_project/sql/nested_with_params.sql.erb
87
+ - spec/test_files/test_slacker_project/sql/no_params.sql.erb
88
+ - spec/test_files/test_slacker_project/sql/params.sql.erb
89
+ - spec/test_files/test_slacker_project/sql/test_1.sql
90
+ homepage: https://github.com/vassilvk/slacker
91
+ licenses: []
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubyforge_project: slacker
110
+ rubygems_version: 1.8.4
111
+ signing_key:
112
+ specification_version: 3
113
+ summary: Behavior Driven Development for SQL Server
114
+ test_files: []