studio54 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/Gemfile +31 -0
  2. data/Gemfile.lock +68 -0
  3. data/LICENSE +25 -0
  4. data/README.md +0 -0
  5. data/Rakefile +56 -0
  6. data/VERSION +5 -0
  7. data/app/controllers/users_controller.rb +29 -0
  8. data/app/models/post.rb +4 -0
  9. data/app/models/user.rb +46 -0
  10. data/bare/Gemfile +31 -0
  11. data/bare/Rakefile +28 -0
  12. data/bare/config.ru +9 -0
  13. data/bare/config/app_tie.rb +12 -0
  14. data/bare/config/db.rb +20 -0
  15. data/bare/config/db_connect.rb +19 -0
  16. data/bare/config/environment.rb +17 -0
  17. data/bare/config/sinatra.rb +36 -0
  18. data/bare/config/studio54_tie.rb +2 -0
  19. data/bare/dance.rb +11 -0
  20. data/bare/lib/after_filters.rb +7 -0
  21. data/bare/lib/before_filters.rb +7 -0
  22. data/bare/lib/helpers.rb +5 -0
  23. data/bare/public/index.rhtml +1 -0
  24. data/bare/public/layout.rhtml +12 -0
  25. data/bare/static/css/base.css +86 -0
  26. data/bare/static/css/yui_reset.css +30 -0
  27. data/bare/test/helpers.rb +8 -0
  28. data/bare/test/suite.rb +13 -0
  29. data/bin/studio54 +65 -0
  30. data/config.ru +9 -0
  31. data/config/app_tie.rb +8 -0
  32. data/config/db.rb +20 -0
  33. data/config/db_connect.rb +19 -0
  34. data/config/environment.rb +17 -0
  35. data/config/sinatra.rb +36 -0
  36. data/dance.rb +80 -0
  37. data/ideas +0 -0
  38. data/lib/after_filters.rb +7 -0
  39. data/lib/base.rb +29 -0
  40. data/lib/before_filters.rb +30 -0
  41. data/lib/helpers.rb +24 -0
  42. data/lib/lazy_controller.rb +87 -0
  43. data/lib/lazy_record.rb +395 -0
  44. data/lib/partials.rb +19 -0
  45. data/lib/studio54.rb +14 -0
  46. data/lib/vendor.rb +23 -0
  47. data/public/_partial_test.rhtml +4 -0
  48. data/public/all.rhtml +7 -0
  49. data/public/form.rhtml +11 -0
  50. data/public/index.rhtml +6 -0
  51. data/public/layout.rhtml +15 -0
  52. data/public/partial_test.rhtml +6 -0
  53. data/public/test_find_by.rhtml +4 -0
  54. data/rack/cache/body/ec/b48431757330e446c58d88e317574ef0eca2e9 +0 -0
  55. data/rack/cache/meta/25/3a7a342a66b79119b7b8cb34bda89978f9e606 +0 -0
  56. data/rack/cache/meta/c1/34c9b7112c7d884220d6ee9a8e43ec69d2ea6e +0 -0
  57. data/static/css/base.css +86 -0
  58. data/static/css/yui_reset.css +30 -0
  59. data/static/hello.html +1 -0
  60. data/studio54.gemspec +25 -0
  61. data/tags +149 -0
  62. data/test/email.rb +8 -0
  63. data/test/environment.rb +28 -0
  64. data/test/helpers.rb +8 -0
  65. data/test/integration/index_test.rb +41 -0
  66. data/test/integration/partial_test.rb +50 -0
  67. data/test/mail/email_test.rb +14 -0
  68. data/test/rack/helpers.rb +23 -0
  69. data/test/suite.rb +8 -0
  70. data/test/unit/associations_test.rb +33 -0
  71. data/test/unit/callbacks_test.rb +16 -0
  72. data/test/unit/database_test.rb +73 -0
  73. data/test/unit/model_introspection_test.rb +44 -0
  74. data/test/unit/serialization_test.rb +19 -0
  75. data/test/unit/validations_test.rb +73 -0
  76. metadata +165 -0
@@ -0,0 +1,8 @@
1
+ module Studio54
2
+
3
+ class Dancefloor
4
+
5
+ end
6
+
7
+ end
8
+
@@ -0,0 +1,41 @@
1
+ class IndexPageTest < MiniTest::Unit::TestCase
2
+ include Rack::Test::Methods
3
+ include Studio54
4
+
5
+ def app
6
+ Dancefloor.new
7
+ end
8
+
9
+ def test_callbacks_working
10
+ get '/'
11
+ var = nil
12
+ Base.app_instance.instance_eval do
13
+ var = @second_user
14
+ end
15
+ assert_equal 'me', var
16
+ end
17
+
18
+ def test_index_response
19
+ get '/'
20
+ app = Base.app_instance
21
+ body = nil
22
+ app.instance_eval do
23
+ body = erb :index
24
+ end
25
+ assert_equal body, last_response.body
26
+ assert_equal true, last_response.ok?
27
+ assert_equal true, last_response.html?
28
+ end
29
+
30
+ def test_flash_is_set
31
+ get '/'
32
+ app = Base.app_instance
33
+ flashy = nil
34
+ app.instance_eval do
35
+ flashy = flash[:notice]
36
+ end
37
+ assert_equal('hi', flashy)
38
+ end
39
+
40
+ end
41
+
@@ -0,0 +1,50 @@
1
+ class PartialTest < MiniTest::Unit::TestCase
2
+ include Rack::Test::Methods
3
+ include Studio54
4
+
5
+ def app
6
+ Dancefloor.new
7
+ end
8
+
9
+ FULL_RENDERING = <<HTML
10
+ <html>
11
+ <head>
12
+ <!--
13
+ -<link rel="stylesheet" type="text/css" href="/css/yui_reset.css" />
14
+ -<link rel="stylesheet" type="text/css" href="/css/base.css" />
15
+ -->
16
+ </head>
17
+ <body>
18
+ <title>Site</title>
19
+ <div id="container">
20
+ <h1>Partial Test</h1>
21
+ <p>I am 1 years old</p>
22
+ <p>I am 2 years old</p>
23
+ <p>I am 3 years old</p>
24
+ <p>I am 4 years old</p>
25
+ <p>I am 5 years old</p>
26
+ <p>I am 6 years old</p>
27
+
28
+
29
+
30
+ </div>
31
+ </body>
32
+ </html>
33
+
34
+ HTML
35
+
36
+ def test_partial_rendered
37
+ get '/partial'
38
+ app = Base.app_instance
39
+ body = ""
40
+ app.instance_eval do
41
+ body += erb :partial_test
42
+ end
43
+ assert_equal body, last_response.body
44
+ assert_equal true, last_response.ok?
45
+ assert_equal true, last_response.html?
46
+ assert_equal FULL_RENDERING, body
47
+ end
48
+
49
+ end
50
+
@@ -0,0 +1,14 @@
1
+ class MailTest < MiniTest::Unit::TestCase
2
+ include Rack::Test::Methods
3
+ include Studio54
4
+
5
+ def app
6
+ Dancefloor.new
7
+ end
8
+
9
+ def test_send_email_with_pony
10
+ post '/email/send'
11
+ assert_equal true, last_response.errors.empty?
12
+ end
13
+ end
14
+
@@ -0,0 +1,23 @@
1
+ module Rack
2
+ class MockResponse
3
+
4
+ # these methods are defined by Sinatra, but just
5
+ # in case...
6
+ def content_length
7
+ self["Content-Length"]
8
+ end unless method_defined? :content_length
9
+
10
+ def content_type
11
+ self["Content-Type"]
12
+ end unless method_defined? :content_type
13
+
14
+ # Not a good method, but probably good enough...
15
+ def html?
16
+ body = Array.wrap(self.body)
17
+ content_type =~ %r{text/html} and
18
+ body.detect {|e| e =~ %r{<\w>} || e =~ %r{<br}}.present?
19
+ end
20
+
21
+ end
22
+ end
23
+
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative 'environment'
3
+
4
+ module Studio54
5
+ # test files (all but email sending)
6
+ Dir.glob('**/*_test.rb').each {|f| require f unless f =~ /email/ }
7
+ end
8
+
@@ -0,0 +1,33 @@
1
+ class AssociationTest < MiniTest::Unit::TestCase
2
+ include Rack::Test::Methods
3
+ include ::Studio54
4
+
5
+ ::NewKlass = Class.new(LazyRecord)
6
+
7
+ def app
8
+ Dancefloor.new
9
+ end
10
+
11
+ def test_has_many_without_reciprocation
12
+ Post.tap do |p|
13
+ assert_raises(LazyRecord::AssociationNotFound) do
14
+ p.class_eval do
15
+ has_many :users
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ def test_reciprocal_association
22
+ Post.tap do |p|
23
+ p.class_eval { belongs_to :users, :new_klass }
24
+ assert_equal [:users, :new_klass].map(&:to_s), p.belongs_to_attributes
25
+ end
26
+ User.tap do |u|
27
+ u.class_eval { has_many :posts }
28
+ assert_equal [:posts].map(&:to_s), u.nested_attributes
29
+ end
30
+ end
31
+
32
+ end
33
+
@@ -0,0 +1,16 @@
1
+ class CallbackTest < MiniTest::Unit::TestCase
2
+ include Rack::Test::Methods
3
+ include ::Studio54
4
+
5
+ def app
6
+ Dancefloor.new
7
+ end
8
+
9
+ def test_single_simple_callback
10
+ u = User.new
11
+ quaff = u.drink
12
+ assert_equal 21, u.age
13
+ assert_equal "mmm", quaff
14
+ end
15
+ end
16
+
@@ -0,0 +1,73 @@
1
+ class DatabaseTest < MiniTest::Unit::TestCase
2
+ include Rack::Test::Methods
3
+ include ::Studio54
4
+
5
+ def app
6
+ Dancefloor.new
7
+ end
8
+
9
+ def test_empty_resultset
10
+ empty_results = []
11
+ assert_raises(LazyRecord::RecordNotFound) do
12
+ User.class_eval do
13
+ test_resultset empty_results
14
+ end
15
+ end
16
+ end
17
+
18
+ def test_non_empty_results
19
+ non_empty_results = [1,2,3]
20
+ ret = nil
21
+ User.class_eval do
22
+ ret = test_resultset non_empty_results
23
+ end
24
+ assert_nil ret
25
+ end
26
+
27
+ def test_invalid_save
28
+ u = User.new
29
+ assert_nil u.save
30
+ end
31
+
32
+ def test_simple_id_find
33
+ @user = User.find(1)
34
+ assert_equal User, @user.class
35
+ assert_equal 1, @user.id.to_i
36
+ assert_equal 'luke', @user.name
37
+ assert_equal 22, @user.age.to_i
38
+ end
39
+
40
+ # need to fix find_by to take into account ORs with the same
41
+ # field name, and a mixture of ANDs and ORs, need a composites
42
+ # hash with a length equal to the sum of the previous arguments
43
+ def test_find_by_conjunction_AND
44
+ @users = User.find_by :name => 'david', :age => 44
45
+ assert_equal 2, @users.count
46
+ end
47
+
48
+ def test_find_by_conjunction_OR
49
+ @users = User.find_by({:name => 'luke', :age => 44}, :conjunction => "OR")
50
+ assert_equal 6, @users.count
51
+ end
52
+
53
+ def test_dynamic_find
54
+ @user = User.find_by_name 'rick'
55
+ assert_equal 13, @user.id.to_i
56
+ end
57
+
58
+ def test_build_user_from_params
59
+ params = {:user => {:name => 'luke', :age => '22'}}
60
+ @user = User.new params[:user]
61
+ assert_equal 'luke', @user.name
62
+ assert_equal '22', @user.age
63
+ end
64
+
65
+ def test_find_all_from_tbl
66
+ @users = User.all
67
+ sql = "SELECT * FROM users;"
68
+ res = Db.conn.execute(sql)
69
+ assert_equal res.count, @users.count
70
+ end
71
+
72
+ end
73
+
@@ -0,0 +1,44 @@
1
+ class ModelIntrospectionTest < MiniTest::Unit::TestCase
2
+ include Rack::Test::Methods
3
+ include ::Studio54
4
+
5
+ def app
6
+ Dancefloor.new
7
+ end
8
+
9
+ def test_tbl_attribute_introspection
10
+ assert_equal :id.to_s, User.primary_key
11
+ assert_equal [:name, :age].map(&:to_s), User.attributes
12
+ assert_equal [:id, :name, :age].map(&:to_s), User.all_attributes
13
+ end
14
+
15
+ def test_default_tbl_name
16
+ assert_equal 'posts', Post.table_name
17
+ end
18
+
19
+ def test_custom_tbl_name
20
+ User.class_eval do
21
+ self.assoc_table_name = 'special_users'
22
+ end
23
+ assert_equal 'special_users', User.table_name
24
+ # and change back so unordered tests don't break
25
+ User.class_eval do
26
+ self.assoc_table_name = 'users'
27
+ end
28
+ assert_equal 'users', User.table_name
29
+ end
30
+
31
+ def test_composite_primary_key
32
+ Post.class_eval do
33
+ attr_primary :id, :user_id
34
+ end
35
+ assert_equal [:id, :user_id].map(&:to_s), Post.primary_key
36
+ # and change back so unordered tests don't break
37
+ Post.class_eval do
38
+ attr_primary nil
39
+ end
40
+ assert_equal nil, Post.primary_key
41
+ end
42
+
43
+ end
44
+
@@ -0,0 +1,19 @@
1
+ class SerializeTest < MiniTest::Unit::TestCase
2
+ include Rack::Test::Methods
3
+ include ::Studio54
4
+
5
+ def app
6
+ Dancefloor.new
7
+ end
8
+
9
+ def test_json_rendering
10
+ @user = User.find(1)
11
+ assert_equal "{\"user\":{\"age\":\"22\",\"id\":\"1\",\"name\":\"luke\"}}", @user.to_json
12
+ end
13
+
14
+ def test_xml_rendering
15
+ @user = User.find(1)
16
+ assert_equal "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>\n <id>1</id>\n <name>luke</name>\n <age>22</age>\n</user>\n", @user.to_xml
17
+ end
18
+ end
19
+
@@ -0,0 +1,73 @@
1
+ class ValidationTest < MiniTest::Unit::TestCase
2
+ include Rack::Test::Methods
3
+ include ::Studio54
4
+
5
+ def app
6
+ Dancefloor.new
7
+ end
8
+
9
+ def test_blank_user
10
+ u = User.new
11
+ u.name = ""
12
+ assert_equal false, u.valid?
13
+ assert_equal 5, u.errors.count
14
+ end
15
+
16
+ def test_young_user
17
+ u = User.new
18
+ # should be > 18
19
+ u.age = 17
20
+ u.name = "Katelin"
21
+ u.humor = true
22
+ assert_equal false, u.valid?
23
+ end
24
+
25
+ def test_short_named_user
26
+ u = User.new
27
+ u.age = 29
28
+ u.name = "jon"
29
+ u.humor = true
30
+ assert_equal false, u.valid?
31
+ assert_equal ["is too short"], u.errors[:name]
32
+ assert_equal ["Name is too short"], u.errors.full_messages
33
+ end
34
+
35
+ def test_valid_user
36
+ u = User.new
37
+ u.age = 19
38
+ u.name = "Andrew Dice Clay"
39
+ u.humor = true
40
+ assert_equal true, u.valid?
41
+ end
42
+
43
+ def test_presence_validation
44
+ u = User.new
45
+ u.age = 25
46
+ u.name = "Mel Brooks"
47
+ assert_equal false, u.valid?
48
+ assert_equal ["can't be blank"] , u.errors[:humor]
49
+ assert_equal ["Humor can't be blank"], u.errors.full_messages
50
+ end
51
+
52
+ def test_numericality_of_age
53
+ u = User.new
54
+ u.age = 100
55
+ u.name = "Shania Twain"
56
+ u.humor = true
57
+ assert_equal false, u.valid?
58
+ assert_equal 1, u.errors.count
59
+ assert_equal ["must be less than 99"], u.errors[:age]
60
+ end
61
+
62
+ def test_format_email
63
+ u = User.new
64
+ u.age = 30
65
+ u.name = "jack gonzo"
66
+ u.humor = true
67
+ u.email = "SPAM"
68
+ assert_equal false, u.valid?
69
+ assert_equal 1, u.errors.count
70
+ assert_equal ["is invalid"], u.errors[:email]
71
+ end
72
+ end
73
+
metadata ADDED
@@ -0,0 +1,165 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: studio54
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Luke Gruber
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-06 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rack
16
+ requirement: &84870790 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *84870790
25
+ - !ruby/object:Gem::Dependency
26
+ name: rack-cache
27
+ requirement: &84870070 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *84870070
36
+ - !ruby/object:Gem::Dependency
37
+ name: rack-flash
38
+ requirement: &84869710 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *84869710
47
+ - !ruby/object:Gem::Dependency
48
+ name: sinatra
49
+ requirement: &84869290 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *84869290
58
+ description: Sinatra meets rails, falls in love, and dances through the night.
59
+ email: luke.gru@gmail.com
60
+ executables:
61
+ - studio54
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - dance.rb
66
+ - config/sinatra.rb
67
+ - config/db.rb
68
+ - config/db_connect.rb
69
+ - config/app_tie.rb
70
+ - config/environment.rb
71
+ - Gemfile.lock
72
+ - tags
73
+ - Rakefile
74
+ - rack/cache/meta/25/3a7a342a66b79119b7b8cb34bda89978f9e606
75
+ - rack/cache/meta/c1/34c9b7112c7d884220d6ee9a8e43ec69d2ea6e
76
+ - rack/cache/body/ec/b48431757330e446c58d88e317574ef0eca2e9
77
+ - bare/dance.rb
78
+ - bare/config/sinatra.rb
79
+ - bare/config/db.rb
80
+ - bare/config/studio54_tie.rb
81
+ - bare/config/db_connect.rb
82
+ - bare/config/app_tie.rb
83
+ - bare/config/environment.rb
84
+ - bare/Rakefile
85
+ - bare/lib/after_filters.rb
86
+ - bare/lib/before_filters.rb
87
+ - bare/lib/helpers.rb
88
+ - bare/test/helpers.rb
89
+ - bare/test/suite.rb
90
+ - bare/Gemfile
91
+ - bare/public/index.rhtml
92
+ - bare/public/layout.rhtml
93
+ - bare/static/css/base.css
94
+ - bare/static/css/yui_reset.css
95
+ - bare/config.ru
96
+ - README.md
97
+ - lib/lazy_controller.rb
98
+ - lib/after_filters.rb
99
+ - lib/lazy_record.rb
100
+ - lib/before_filters.rb
101
+ - lib/helpers.rb
102
+ - lib/base.rb
103
+ - lib/studio54.rb
104
+ - lib/partials.rb
105
+ - lib/vendor.rb
106
+ - ideas
107
+ - VERSION
108
+ - app/controllers/users_controller.rb
109
+ - app/models/user.rb
110
+ - app/models/post.rb
111
+ - studio54.gemspec
112
+ - bin/studio54
113
+ - LICENSE
114
+ - test/rack/helpers.rb
115
+ - test/unit/model_introspection_test.rb
116
+ - test/unit/associations_test.rb
117
+ - test/unit/callbacks_test.rb
118
+ - test/unit/serialization_test.rb
119
+ - test/unit/validations_test.rb
120
+ - test/unit/database_test.rb
121
+ - test/helpers.rb
122
+ - test/mail/email_test.rb
123
+ - test/suite.rb
124
+ - test/email.rb
125
+ - test/integration/partial_test.rb
126
+ - test/integration/index_test.rb
127
+ - test/environment.rb
128
+ - Gemfile
129
+ - public/index.rhtml
130
+ - public/layout.rhtml
131
+ - public/test_find_by.rhtml
132
+ - public/_partial_test.rhtml
133
+ - public/form.rhtml
134
+ - public/partial_test.rhtml
135
+ - public/all.rhtml
136
+ - static/hello.html
137
+ - static/css/base.css
138
+ - static/css/yui_reset.css
139
+ - config.ru
140
+ homepage:
141
+ licenses:
142
+ - MIT
143
+ post_install_message:
144
+ rdoc_options: []
145
+ require_paths:
146
+ - lib
147
+ required_ruby_version: !ruby/object:Gem::Requirement
148
+ none: false
149
+ requirements:
150
+ - - ! '>='
151
+ - !ruby/object:Gem::Version
152
+ version: 1.9.1
153
+ required_rubygems_version: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ requirements: []
160
+ rubyforge_project:
161
+ rubygems_version: 1.8.10
162
+ signing_key:
163
+ specification_version: 3
164
+ summary: Sinatra meets rails, falls in love, and dances through the night.
165
+ test_files: []