teacup 0.0.1.pre → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. data/.gitignore +5 -3
  2. data/CHANGES.md +26 -0
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +1 -1
  5. data/LICENSE +26 -0
  6. data/README.md +383 -95
  7. data/Rakefile +8 -36
  8. data/app/app_delegate.rb +14 -0
  9. data/app/controllers/first_controller.rb +71 -0
  10. data/app/controllers/landscape_only_controller.rb +16 -0
  11. data/app/controllers/tableview_controller.rb +0 -0
  12. data/app/styles/main_styles.rb +111 -0
  13. data/app/views/custom_view.rb +4 -0
  14. data/lib/dummy.rb +56 -0
  15. data/lib/teacup/handler.rb +99 -0
  16. data/lib/teacup/layout.rb +22 -74
  17. data/lib/teacup/merge_defaults.rb +45 -0
  18. data/lib/teacup/style.rb +93 -0
  19. data/lib/teacup/stylesheet.rb +242 -0
  20. data/lib/teacup/stylesheet_extensions/rotation.rb +38 -0
  21. data/lib/teacup/version.rb +1 -1
  22. data/lib/teacup/z_core_extensions/ca_layer.rb +6 -0
  23. data/lib/teacup/z_core_extensions/ui_view.rb +119 -0
  24. data/lib/teacup/z_core_extensions/ui_view_controller.rb +179 -0
  25. data/lib/teacup/z_core_extensions/ui_view_getters.rb +34 -0
  26. data/lib/teacup/z_core_extensions/z_handlers.rb +57 -0
  27. data/lib/teacup.rb +16 -33
  28. data/samples/Hai/Rakefile +7 -2
  29. data/samples/Hai/app/app_delegate.rb +2 -2
  30. data/samples/Hai/app/hai_controller.rb +8 -4
  31. data/samples/Hai/styles/iphone.rb +40 -0
  32. data/spec/main_spec.rb +226 -0
  33. data/spec/style_spec.rb +171 -0
  34. data/spec/stylesheet_spec.rb +348 -0
  35. data/spec/view_spec.rb +103 -0
  36. data/teacup.gemspec +13 -13
  37. metadata +47 -46
  38. data/.rspec +0 -2
  39. data/lib/teacup/contributors.rb +0 -7
  40. data/lib/teacup/core_extensions/ui_view.rb +0 -4
  41. data/lib/teacup/core_extensions/ui_view_controller.rb +0 -62
  42. data/lib/teacup/style_sheet.rb +0 -195
  43. data/lib/teacup/view.rb +0 -123
  44. data/pkg/teacup-0.0.0.gem +0 -0
  45. data/pkg/teacup-0.0.1.gem +0 -0
  46. data/proposals/other/README.md +0 -45
  47. data/proposals/other/app/config/application.rb +0 -1
  48. data/proposals/other/app/config/boot.rb +0 -1
  49. data/proposals/other/app/config/initializers/twitter.rb +0 -7
  50. data/proposals/other/app/controllers/events_controller.rb +0 -28
  51. data/proposals/other/app/controllers/venues_controller.rb +0 -4
  52. data/proposals/other/app/db/README.md +0 -16
  53. data/proposals/other/app/db/migrations/20120514201043_create_events.rb +0 -9
  54. data/proposals/other/app/db/migrations/20120514201044_add_price_to_events.rb +0 -5
  55. data/proposals/other/app/db/migrations/20120514201045_create_venues.rb +0 -8
  56. data/proposals/other/app/db/schema.rb +0 -19
  57. data/proposals/other/app/models/event.rb +0 -14
  58. data/proposals/other/app/models/venue.rb +0 -3
  59. data/proposals/other/app/views/events/edit.ipad.rb +0 -8
  60. data/proposals/other/app/views/events/edit.iphone.rb +0 -7
  61. data/proposals/other/app/views/events/show.ipad.rb +0 -2
  62. data/proposals/other/app/views/events/show.iphone.rb +0 -3
  63. data/samples/Hai/styles/ipad.rb +0 -11
  64. data/samples/Hai/styles/ipad_vertical.rb +0 -3
  65. data/spec/spec_helper.rb +0 -5
  66. data/spec/teacup/contributions_spec.rb +0 -13
  67. data/spec/teacup/version_spec.rb +0 -9
@@ -1,62 +0,0 @@
1
- class UIViewController
2
- include Teacup::Layout
3
-
4
- class << self
5
- # Define the layout of a controller's view.
6
- #
7
- # This function is analogous to Teacup::Layout#layout, though it is
8
- # designed so you can create an entire layout in a declarative manner in
9
- # your controller.
10
- #
11
- # The hope is that his declarativeness will allow us to automatically
12
- # deal with common iOS programming tasks (like releasing views when
13
- # low-memory conditions occur) for you. This is still not implemented
14
- # though.
15
- #
16
- # @param name The stylename for your controller's view.
17
- #
18
- # @param properties Any extra styles that you want to apply.
19
- #
20
- # @param &block The block in which you should define your layout.
21
- # It will be instance_exec'd in the context of a
22
- # controller instance.
23
- #
24
- # @example
25
- # MyViewController < UIViewController
26
- # layout :my_view do
27
- # subview UILabel, xjad: "Test"
28
- # subview UITextField, {
29
- # frame: [[200, 200], [100, 100]]
30
- # delegate: self
31
- # }
32
- # subview UIView, :shiny_thing) {
33
- # subview UIView, :centre_of_shiny_thing
34
- # }
35
- # end
36
- # end
37
- #
38
- def layout(stylename, properties={}, &block)
39
- @layout_definition = [stylename, properties, block]
40
- end
41
-
42
- # Retreive the layout defined by {layout}
43
- def layout_definition
44
- @layout_definition
45
- end
46
- end
47
-
48
- # Instantiate the layout from the class, and then call layoutDidLoad.
49
- #
50
- # If you want to use Teacup in your controller, please hook into layoutDidLoad,
51
- # not viewDidLoad.
52
- def viewDidLoad
53
- if self.class.layout_definition
54
- name, properties, block = self.class.layout_definition
55
- layout(view, name, properties, &block)
56
- end
57
-
58
- layoutDidLoad
59
- end
60
-
61
- def layoutDidLoad; true; end
62
- end
@@ -1,195 +0,0 @@
1
- module Teacup
2
- # Stylesheets in Teacup act as a central configuration mechanism,
3
- # they have two aims:
4
- #
5
- # 1. Allow you to store "Details" away from the main body of your code.
6
- # (controllers shouldn't have to be filled with style rules)
7
- # 2. Allow you to easily re-use configuration in many places.
8
- #
9
- # The API really provides only two methods, {Stylesheet#style} to store properties
10
- # on the Stylesheet; and {Stylesheet#query} to get them out again:
11
- #
12
- # @example
13
- # stylesheet = Teacup::Stylesheet.new
14
- # stylesheet.style :buttons, :corners => :rounded
15
- # # => nil
16
- # stylesheet.query :buttons
17
- # # => {:corners => :rounded}
18
- #
19
- # In addition to this, two separate mechanisms are provided for sharing
20
- # configuration within stylesheets.
21
- #
22
- # Firstly, if you set the ':extends' property for a given stylename, then on lookup
23
- # the Stylesheet will merge the properties for the ':extends' stylename into the return
24
- # value. Conflicts are resolved so that properties with the original stylename
25
- # are resolved in its favour.
26
- #
27
- # @example
28
- # Teacup::Stylesheet.new(:IPad) do
29
- # style :button,
30
- # background: UIColor.blackColor,
31
- # top: 100
32
- #
33
- # style :ok_button, extends: :button,
34
- # title: "OK!",
35
- # top: 200
36
- #
37
- # end
38
- # Teacup::Stylesheet::IPad.query(:ok_button)
39
- # # => {background: UIColor.blackColor, top: 200, title: "OK!"}
40
- #
41
- # Secondly, you can import Stylesheets into each other, in exactly the same way as you
42
- # can include Modules into each other in Ruby. This allows you to share rules between
43
- # Stylesheets.
44
- #
45
- # As you'd expect, conflicts are resolve so that the Stylesheet on which you call query
46
- # has the highest precedence.
47
- #
48
- # @example
49
- # Teacup::Stylesheet.new(:IPad) do
50
- # style :ok_button,
51
- # title: "OK!"
52
- # end
53
- #
54
- # Teacup::Stylesheet.new(:IPadVertical) do
55
- # import :IPad
56
- # style :ok_button,
57
- # width: 80
58
- # end
59
- # Teacup::Stylesheet::IPadVertical.query(:ok_button)
60
- # # => {title: "OK!", width: 80}
61
- #
62
- # The two merging mechanisms are considered independently, so you can override
63
- # a property both in a ':extends' rule, and also in an imported Stylesheet. In such a
64
- # a case the Stylesheet inclusion conflicts are resolved independently; and then in
65
- # a second phase, the ':extends' chain is flattened.
66
- #
67
- class Stylesheet
68
- attr_reader :name
69
-
70
- # Create a new Stylesheet with the given name.
71
- #
72
- # @param name, The name to give.
73
- # @param &block, The body of the Stylesheet instance_eval'd.
74
- # @example
75
- # Teacup::Stylesheet.new(:IPadVertical) do
76
- # import :IPadBase
77
- # style :continue_button,
78
- # top: 50
79
- # end
80
- #
81
- def initialize(name, &block)
82
- @name = name.to_sym
83
- Teacup::Stylesheet.const_set(@name, self)
84
- instance_eval &block
85
- self
86
- end
87
-
88
- # Include another Stylesheet into this one, the rules defined
89
- # within it will have lower precedence than those defined here
90
- # in the case that they share the same keys.
91
- #
92
- # @param Symbol the name of the stylesheet.
93
- # @example
94
- # Teacup::Stylesheet.new(:IPadVertical) do
95
- # import :IPadBase
96
- # import :VerticalTweaks
97
- # end
98
- def import(name_or_stylesheet)
99
- if Stylesheet === name_or_stylesheet
100
- imported << name_or_stylesheet.name
101
- else
102
- imported << name_or_stylesheet.to_sym
103
- end
104
- end
105
-
106
- # Add a set of properties for a given stylename or set of stylenames.
107
- #
108
- # @param Symbol, *stylename
109
- # @param Hash[Symbol, Object], properties
110
- # @example
111
- # Teacup::Stylesheet.new(:IPadBase) do
112
- # style :pretty_button,
113
- # backgroundColor: UIColor.blackColor
114
- #
115
- # style :continue_button, extends: :pretty_button,
116
- # title: "Continue!",
117
- # top: 50
118
- # end
119
- def style(*queries)
120
- properties = queries.pop
121
- queries.each do |stylename|
122
- styles[stylename].update(properties)
123
- end
124
- end
125
-
126
- # Get the properties defined for the given stylename, in this Stylesheet and all
127
- # those that have been imported.
128
- #
129
- # If the ':extends' property is set, we then repeat the process with the value
130
- # of that, and include them into the result with lower precedence.
131
- #
132
- # @param Symbol stylename, the stylename to look up.
133
- # @return Hash[Symbol, *] the resulting properties.
134
- # @example
135
- # Teacup::Stylesheet::IPadBase.query(:continue_button)
136
- # # => {backgroundColor: UIColor.blackColor, title: "Continue!", top: 50}
137
- def query(stylename)
138
- this_rule = properties_for(stylename)
139
-
140
- if also_include = this_rule.delete(:extends)
141
- query(also_include).merge(this_rule)
142
- else
143
- this_rule
144
- end
145
- end
146
-
147
- # A unique and hopefully meaningful description of this Object.
148
- #
149
- # @return String
150
- def inspect
151
- "Teacup::Stylesheet:#{name.inspect}"
152
- end
153
-
154
- protected
155
-
156
- # Get the properties for a given stylename, including any properties
157
- # defined on stylesheets that have been imported into this one, but not
158
- # resolving ':extends' inheritance.
159
- #
160
- # @param Symbol stylename, the stylename to search for.
161
- # @param Hash so_far, the properties already found in stylesheets with
162
- # lower precedence than this one.
163
- # @param Hash seen, the Stylesheets that we've already visited, this is
164
- # to avoid pathological cases where stylesheets
165
- # have been imported recursively.
166
- # @return Hash
167
- def properties_for(stylename, so_far={}, seen={})
168
- return so_far if seen[self]
169
- seen[self] = true
170
-
171
- imported.each do |name|
172
- unless Teacup::Stylesheet.const_defined?(name)
173
- raise "Teacup tried to import Stylesheet:#{name} into Stylesheet:#{self.name}, but it didn't exist"
174
- end
175
- Teacup::Stylesheet.const_get(name).properties_for(stylename, so_far, seen)
176
- end
177
-
178
- so_far.update(styles[stylename])
179
- end
180
-
181
- # The list of Stylesheet names that have been imported into this one.
182
- #
183
- # @return Array[Symbol]
184
- def imported
185
- @imported ||= []
186
- end
187
-
188
- # The actual contents of this stylesheet as a Hash from stylename to properties.
189
- #
190
- # @return Hash[Symbol, Hash]
191
- def styles
192
- @styles ||= Hash.new{ |h, k| h[k] = {} }
193
- end
194
- end
195
- end
data/lib/teacup/view.rb DELETED
@@ -1,123 +0,0 @@
1
- module Teacup
2
- # Teacup::View defines some utility functions for UIView that enable
3
- # a lot of the magic for Teacup::Layout.
4
- #
5
- # Most users of teacup should be able to ignore the contents of this file
6
- # for the most part.
7
- module View
8
- # The current stylename that is used to look up properties in the stylesheet.
9
- attr_reader :stylename
10
-
11
- # The current stylesheet will be looked at when properties are needed.
12
- attr_reader :stylesheet
13
-
14
- # Alter the stylename of this view.
15
- #
16
- # This will cause new styles to be applied from the stylesheet.
17
- #
18
- # @param Symbol stylename
19
- def stylename=(stylename)
20
- @stylename = stylename
21
- style(stylesheet.query(stylename)) if stylesheet
22
- end
23
-
24
- # Alter the stylesheet of this view.
25
- #
26
- # This will cause new styles to be applied using the current stylename,
27
- # and will recurse into subviews.
28
- #
29
- # If you would prefer that a given UIView object does not inherit the
30
- # stylesheet from its parents, override the 'stylesheet' method to
31
- # return the correct value at all times.
32
- #
33
- # @param Teacup::Stylesheet stylesheet.
34
- def stylesheet=(stylesheet)
35
- @stylesheet = stylesheet
36
- style(stylesheet.query(stylename)) if stylename && stylesheet
37
- subviews.each{ |subview| subview.stylesheet = stylesheet }
38
- end
39
-
40
- # Animate a change to a new stylename.
41
- #
42
- # This is equivalent to wrapping a call to .stylename= inside
43
- # UIView.beginAnimations.
44
- #
45
- # @param Symbol the new stylename
46
- # @param Options the options for the animation (may include the
47
- # duration and the curve)
48
- #
49
- def animate_to_stylename(stylename, options={})
50
- return if self.stylename == stylename
51
- UIView.beginAnimations(nil, context: nil)
52
- # TODO: This should be in a style-sheet!
53
- UIView.setAnimationDuration(options[:duration]) if options[:duration]
54
- UIView.setAnimationCurve(options[:curve]) if options[:curve]
55
- self.stylename = stylename
56
- UIView.commitAnimations
57
- end
58
-
59
- # Apply style properties to this element.
60
- #
61
- # Takes a hash of properties such as may have been read from a stylesheet
62
- # or passed as parameters to {Teacup::Layout#layout}, and applies them to
63
- # the element.
64
- #
65
- # Does a little bit of magic (that may be split out as 'sugarcube') to
66
- # make properties work as you'd expect.
67
- #
68
- # If you try and assign something in properties that is not supported,
69
- # a warning message will be emitted.
70
- #
71
- # @param Hash the properties to set.
72
- def style(properties)
73
- clean_properties! properties
74
-
75
- properties.each do |key, value|
76
- if key == :title && UIButton === self
77
- setTitle(value, forState: UIControlStateNormal)
78
- elsif respond_to?(:"#{key}=")
79
- send(:"#{key}=", value)
80
- elsif layer.respond_to?(:"#{key}=")
81
- layer.send(:"#{key}=", value)
82
- elsif key == :keyboardType
83
- setKeyboardType(value)
84
- else
85
- $stderr.puts "Teacup WARN: Can't apply #{key} to #{inspect}"
86
- end
87
- end
88
-
89
- #OUCH! Figure out why this is needed
90
- if rand > 1
91
- setCornerRadius(1.0)
92
- setFrame([[0,0],[0,0]])
93
- setTransform(nil)
94
- setMasksToBounds(0)
95
- setShadowOffset(0)
96
- end
97
- end
98
-
99
- # merge definitions for 'frame' into one.
100
- #
101
- # To support 'extends' more nicely it's convenient to split left, top, width
102
- # and height out of frame. Unfortunately that means we have to write ugly
103
- # code like this to reassemble them into what the user actually meant.
104
- #
105
- # WARNING: this method *mutates* its parameter.
106
- #
107
- # @param Hash
108
- # @return Hash
109
- def clean_properties!(properties)
110
- return unless [:frame, :left, :top, :width, :height].any?(&properties.method(:key?))
111
-
112
- frame = properties.delete(:frame) || self.frame
113
-
114
- frame[0][0] = properties.delete(:left) || frame[0][0]
115
- frame[0][1] = properties.delete(:top) || frame[0][1]
116
- frame[1][0] = properties.delete(:width) || frame[1][0]
117
- frame[1][1] = properties.delete(:height) || frame[1][1]
118
-
119
- properties[:frame] = frame
120
- properties
121
- end
122
- end
123
- end
data/pkg/teacup-0.0.0.gem DELETED
Binary file
data/pkg/teacup-0.0.1.gem DELETED
Binary file
@@ -1,45 +0,0 @@
1
- # Railsifiying mobile development
2
-
3
- ** This is a rough idea, which may have lots of holes, please comment on it, post issues, or fork. **
4
-
5
-
6
- It's time we take control of iOS app development, because it's clunky,
7
- slow, not obvious and because we love Ruby & Rails.
8
-
9
- We can't have "just" styling, it's not a full solution we need a framework now
10
- more then ever.
11
-
12
- With that said, I believe Rails provides a solid MVC. It can help hide or augment
13
- may of the typical problems with iOS development.
14
-
15
-
16
- Directory structure:
17
-
18
- .teacup
19
- |____app
20
- | |____config
21
- | | |____application.rb
22
- | | |____boot.rb
23
- | | |____initializers
24
- | | | |____twitter.rb
25
- | |____controllers
26
- | | |____events_controller.rb
27
- | | |____venues_controller.rb
28
- | |____db
29
- | | |____migrations
30
- | | | |____20120514201043_create_events.rb
31
- | | | |____20120514201044_add_price_to_events.rb
32
- | | | |____20120514201045_create_venues.rb
33
- | | |____README.md
34
- | | |____schema.rb
35
- | |____models
36
- | | |____event.rb
37
- | | |____venue.rb
38
- | |____views
39
- | | |____events
40
- | | | |____edit.ipad.rb
41
- | | | |____edit.iphone.rb
42
- | | | |____show.ipad.rb
43
- | | | |____show.iphone.rb
44
- | | |____venues
45
- |____README.md
@@ -1 +0,0 @@
1
- # Idea: framework runtime, starts to load the application, load initializers, run migrations, etc
@@ -1 +0,0 @@
1
- # Idea: framework booting before application (if it's needed at all)
@@ -1,7 +0,0 @@
1
- # 0. applicationDidFinishLaunching
2
- # 1. boot
3
- # 2. application
4
- # 3. initializers
5
- # 4. twitter configuration values loaded
6
-
7
- Twitter.setup("XXX", "YYY")
@@ -1,28 +0,0 @@
1
- class EventsController < Controller
2
-
3
- # Idea: Need to think about this more, but in lue of generators, we could have
4
- # over-rideable defaults based on a responds_to/actions
5
- # Idea: This would also configure what actions a controller can respond to / route to (do we need routes?)
6
- responds_to :only => [:new, :create, :edit, :update, :destroy, :index, :show] # default options
7
-
8
- def show(id)
9
- @event = Event.find(id)
10
- render :show
11
- end
12
-
13
- def edit(id)
14
- @event = Event.find(id)
15
- end
16
-
17
- def update(id)
18
- # Note: How would this conflict with the previously set @event, should something be passed? augment params?
19
- @event = Event.find(id)
20
- @event.update_attributes(
21
- # 1. data from the current/old view?
22
- # 2. autosave was false
23
- :price => self.view.price
24
- )
25
- # render :edit # Idea: (self.view is loaded)
26
- end
27
-
28
- end
@@ -1,4 +0,0 @@
1
- class VenuesController < Controller
2
- # Idea: We may want to force some kind of nesting in controller
3
- belongs_to :event
4
- end
@@ -1,16 +0,0 @@
1
- # DB
2
-
3
- ## CoreDataAdapter
4
-
5
- Rationale: CD is widely used in iOS projects and may be useful for simpler
6
- integration with UI.
7
-
8
- ## SqlLiteAdapter
9
-
10
- This would be responsible for handling CoreData+Sqlite backend.
11
-
12
- ## RemoteAdapter
13
-
14
- This would be responsible for handling remote data sources (initially just JSON).
15
-
16
- * A RemoteAdapter would be migration-less, APIs would need to be backwards compatible or be versioned, see endpoint in `models/event.rb`
@@ -1,9 +0,0 @@
1
- class CreateEvents < Migration
2
- def change
3
- create_table(:events) do |t|
4
- t.string :name
5
- t.references :venue
6
- t.timestamps
7
- end
8
- end
9
- end
@@ -1,5 +0,0 @@
1
- class AddPriceToEvents < Migration
2
- def change
3
- add_column :events, :price, :float, :default => 0.00
4
- end
5
- end
@@ -1,8 +0,0 @@
1
- class CreateVenues < Migration
2
- def change
3
- create_table(:venues) do |t|
4
- t.string :name
5
- t.timestamps
6
- end
7
- end
8
- end
@@ -1,19 +0,0 @@
1
- Schema.define(:version => 20120514201043) do
2
-
3
- create_table(:events) do |t|
4
- t.string :name
5
- t.references :venue
6
- t.timestamps
7
- end
8
-
9
- create_table(:venues) do |t|
10
- t.string :name
11
- t.timestamps
12
- end
13
-
14
- # Idea: If we can't automagically infer from CoreData?
15
- # create_table(:schema_migrations) do
16
- # t.integer :version, :default => false
17
- # end
18
-
19
- end
@@ -1,14 +0,0 @@
1
- class Event < Model
2
-
3
- # Idea: By default the endpoint is considered a local Sqllite store, see db/README.md for more information.
4
- #
5
- # endpoint nil # uses sqlite, not required
6
- #
7
- # endpoint "http://example.com" # simple configuration
8
- #
9
- # # more advanced confiruations delegating to something, in this case the AppDelegate for a current_user
10
- # endpoint lambda {
11
- # "https://#{app.current_user.name}:pass@example.com"
12
- # }
13
-
14
- end
@@ -1,3 +0,0 @@
1
- class Venue < Model
2
- belongs_to :event
3
- end
@@ -1,8 +0,0 @@
1
- text_field{@event, :name, :autosave => true}
2
- text_field{@event, :price, :autosave => false}
3
-
4
- button("Save?").on(:press) do |btn|
5
- alert("Slide to save the event")
6
- end.on(:slide) do |btn|
7
- update(@event.id) # invokes to controller or use @controller?
8
- end
@@ -1,7 +0,0 @@
1
- text_field{@event, :name}
2
- text_field{@event, :price}
3
- button("Save?").on(:press) do |btn|
4
- alert("Slide to save the event")
5
- end.on(:slide) do |btn|
6
- update(@event.id)
7
- end
@@ -1,2 +0,0 @@
1
- # alternate devise layout
2
- label{@event, :name, :color => "#ffffff", :font => {:name => "Helvetica-Bold", :size => 20} }
@@ -1,3 +0,0 @@
1
- # element(object, attribute, props) => DSL
2
- label{@event, :name, :background-color => "#ffffff", :font => UIFont.fontWithName("Helvetica-Bold")}
3
- label{@event.venue, :name, :link_to => :show} # or a click handler?
@@ -1,11 +0,0 @@
1
- Teacup::StyleSheet.new(:IPad) do
2
-
3
- style :label,
4
- text: 'Hai!',
5
- backgroundColor: UIColor.whiteColor,
6
- top: 10,
7
- left: 100,
8
- width: 200,
9
- height: 50
10
-
11
- end
@@ -1,3 +0,0 @@
1
- Teacup::StyleSheet.new(:IPadVertical) do
2
- include :IPad
3
- end
data/spec/spec_helper.rb DELETED
@@ -1,5 +0,0 @@
1
- # Add RSpec helpers here.
2
-
3
- require 'rspec'
4
- require File.expand_path '../../lib/teacup/version.rb', __FILE__
5
- require File.expand_path '../../lib/teacup/contributors.rb', __FILE__
@@ -1,13 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Teacup::CONTRIBUTORS" do
4
-
5
- it 'has contributors' do
6
- Teacup::CONTRIBUTORS.should be
7
- end
8
-
9
- it 'is an array' do
10
- Teacup::CONTRIBUTORS.should be_instance_of Array
11
- end
12
-
13
- end
@@ -1,9 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Teacup::VERSION' do
4
-
5
- it 'has a version' do
6
- Teacup::VERSION.should be
7
- end
8
-
9
- end