learn_rails 0.0.0 → 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.
- data/.coveralls.yml +1 -0
- data/.gitignore +19 -0
- data/.travis.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +143 -0
- data/Rakefile +16 -0
- data/bin/learn +4 -0
- data/features/accessors.feature +122 -0
- data/features/associations.feature +506 -0
- data/features/step_definitions/associations.rb +7 -0
- data/features/support/env.rb +3 -0
- data/features/support/setup.rb +4 -0
- data/learn_rails.gemspec +31 -0
- data/lib/ext/hash.rb +5 -0
- data/lib/learn_rails.rb +54 -3
- data/lib/learn_rails/accessors.rb +56 -0
- data/lib/learn_rails/associations.rb +44 -0
- data/lib/learn_rails/associations/belongs_to.rb +48 -0
- data/lib/learn_rails/associations/has_many.rb +13 -0
- data/lib/learn_rails/associations/has_one.rb +52 -0
- data/lib/learn_rails/cli.rb +11 -0
- data/lib/learn_rails/version.rb +3 -0
- data/spec/learn_rails/accessors_spec.rb +142 -0
- data/spec/learn_rails/associations_spec.rb +575 -0
- data/spec/spec_helper.rb +4 -0
- metadata +197 -11
data/.coveralls.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
service_name: travis-ci
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Peter-Jan Celis
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
# Learn Rails
|
2
|
+
[][travis]
|
3
|
+
[][gemnasium]
|
4
|
+
[][codeclimate]
|
5
|
+
[][coveralls]
|
6
|
+
|
7
|
+
[travis]: https://travis-ci.org/pjc/learn_rails
|
8
|
+
[codeclimate]: https://codeclimate.com/github/pjc/learn_rails
|
9
|
+
[gemnasium]: https://gemnasium.com/pjc/learn_rails
|
10
|
+
[coveralls]: https://coveralls.io/r/pjc/learn_rails
|
11
|
+
|
12
|
+
Learn Ruby on Rails by seeing all the ruby code behind the rails (and ruby) magic you use.
|
13
|
+
|
14
|
+
Currently works for:
|
15
|
+
- accessors (`attr_reader`, `attr_writer`, `attr_accessor`)
|
16
|
+
- associations (`belongs_to` and `has_one` only so far)
|
17
|
+
|
18
|
+
Also note that for associations, the only options that work so far are `class_name`, `readonly`, `primary_key` and `foreign_key`.
|
19
|
+
|
20
|
+
Coming soon:
|
21
|
+
- All rails magic / helpers
|
22
|
+
- Annotate your rails app with a single command (e.g. associations code shown in each model)
|
23
|
+
|
24
|
+
## Installation
|
25
|
+
|
26
|
+
Add this line to your application's Gemfile:
|
27
|
+
|
28
|
+
gem 'learn_rails'
|
29
|
+
|
30
|
+
And then execute:
|
31
|
+
|
32
|
+
$ bundle
|
33
|
+
|
34
|
+
Or install it yourself as:
|
35
|
+
|
36
|
+
$ gem install learn_rails
|
37
|
+
|
38
|
+
## Usage
|
39
|
+
|
40
|
+
This gem installs an executable called `learn` and a general purpose command called `rails`, so all you need to do is go to the terminal and type:
|
41
|
+
|
42
|
+
$ learn rails the_rails_magic_I_want_to_learn_about
|
43
|
+
|
44
|
+
Say you want to know what the `attr_accessor :color, :size` line in one of the models in your code really does. Type the following terminal command:
|
45
|
+
|
46
|
+
$ learn rails attr_accessor :color, :size
|
47
|
+
|
48
|
+
The gem will now print the following ruby code in your terminal output:
|
49
|
+
|
50
|
+
# def color
|
51
|
+
# @color
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
# def color=(value)
|
55
|
+
# @color = value
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# def size
|
59
|
+
# @size
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
# def size=(value)
|
63
|
+
# @size = value
|
64
|
+
# end
|
65
|
+
|
66
|
+
Sweet!
|
67
|
+
|
68
|
+
Maybe you also want to know a bit more about the association `has_one :task, class_name: "ToDo"` in your `user.rb` model. You would now type:
|
69
|
+
|
70
|
+
$ learn rails user has_one :task, class_name: "ToDo"
|
71
|
+
|
72
|
+
(Note that we included the model name in the command, because our gem needs it to generate the ruby code!)
|
73
|
+
|
74
|
+
This is the terminal output you'll see:
|
75
|
+
|
76
|
+
# def task(force_reload = false)
|
77
|
+
# @task = nil if force_reload
|
78
|
+
# @task ||= ToDo.find_by_user_id(self.id)
|
79
|
+
# end
|
80
|
+
#
|
81
|
+
# def task=(task)
|
82
|
+
# task.user_id = self.id
|
83
|
+
# task.save
|
84
|
+
# end
|
85
|
+
#
|
86
|
+
# def build_task(attributes = {})
|
87
|
+
# attributes[:user_id] = self.id
|
88
|
+
# ToDo.new(attributes)
|
89
|
+
# end
|
90
|
+
#
|
91
|
+
# def create_task(attributes = {})
|
92
|
+
# attributes[:user_id] = self.id
|
93
|
+
# ToDo.create(attributes)
|
94
|
+
# end
|
95
|
+
#
|
96
|
+
# def create_task!(attributes = {})
|
97
|
+
# attributes[:user_id] = self.id
|
98
|
+
# ToDo.create!(attributes)
|
99
|
+
# end
|
100
|
+
|
101
|
+
Happy learning!
|
102
|
+
|
103
|
+
## 2 rules to remember
|
104
|
+
|
105
|
+
1. Always use the new ruby hash syntax for the options you specify. So type `class_name: "ToDo"` and not `class_name => "ToDo"`.
|
106
|
+
|
107
|
+
2. Don't forget to prepend your associations with the ruby model they are defined in (see example above).
|
108
|
+
|
109
|
+
Don't worry too much about rule 2 though: If you forget to give the model name when we need it, we'll ask for it. And when you give it when we don't need it, we'll ignore it.
|
110
|
+
|
111
|
+
## List of available commands
|
112
|
+
|
113
|
+
Accessors:
|
114
|
+
|
115
|
+
$ learn rails attr_reader :as, :many, :attributes, :as, :you, :want
|
116
|
+
|
117
|
+
$ learn rails attr_writer :as, :many, :attributes, :as, :you, :want
|
118
|
+
|
119
|
+
$ learn rails attr_accessor :as, :many, :attributes, :as, :you, :want
|
120
|
+
|
121
|
+
Associations:
|
122
|
+
|
123
|
+
$ learn rails mymodelname belongs_to :associate
|
124
|
+
|
125
|
+
$ learn rails mymodelname has_one :associate
|
126
|
+
|
127
|
+
Options for each association: `class_name: "Whatever"`, `foreign_key: "foreign_id"`, `primary_id: "primary_id"`, `readonly: true`
|
128
|
+
|
129
|
+
## Changelog
|
130
|
+
|
131
|
+
This gem has yet to be published at Rubygems. Coming soon!
|
132
|
+
|
133
|
+
## Feedback
|
134
|
+
|
135
|
+
Comments and feedback are very welcome on [our github issues page](https://github.com/pjc/learn_rails/issues?state=open).
|
136
|
+
|
137
|
+
## Contributing
|
138
|
+
|
139
|
+
1. Fork it
|
140
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
141
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
142
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
143
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require 'cucumber/rake/task'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
require 'coveralls/rake/task'
|
5
|
+
|
6
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
7
|
+
t.cucumber_opts = "features --format pretty"
|
8
|
+
end
|
9
|
+
|
10
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
11
|
+
t.rspec_opts = "--color --format documentation"
|
12
|
+
end
|
13
|
+
|
14
|
+
Coveralls::RakeTask.new
|
15
|
+
|
16
|
+
task :default => [:spec, :features, 'coveralls:push']
|
data/bin/learn
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
Feature: Accessors
|
2
|
+
In order to understand rails accessors
|
3
|
+
As a learn_rails gem user
|
4
|
+
I want to see the right ruby code in the terminal
|
5
|
+
|
6
|
+
Scenario: attr_reader
|
7
|
+
When I run `learn rails attr_reader :whatever`
|
8
|
+
Then the output should contain:
|
9
|
+
"""
|
10
|
+
# def whatever
|
11
|
+
# @whatever
|
12
|
+
# end
|
13
|
+
"""
|
14
|
+
|
15
|
+
Scenario: attr_writer
|
16
|
+
When I run `learn rails attr_writer :whatever`
|
17
|
+
Then the output should contain:
|
18
|
+
"""
|
19
|
+
# def whatever=(value)
|
20
|
+
# @whatever = value
|
21
|
+
# end
|
22
|
+
"""
|
23
|
+
|
24
|
+
Scenario: attr_accessor
|
25
|
+
When I run `learn rails attr_accessor :whatever`
|
26
|
+
Then the output should contain:
|
27
|
+
"""
|
28
|
+
# def whatever
|
29
|
+
# @whatever
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# def whatever=(value)
|
33
|
+
# @whatever = value
|
34
|
+
# end
|
35
|
+
"""
|
36
|
+
|
37
|
+
Scenario: attr_reader with anymodelname
|
38
|
+
When I run `learn rails anymodelname attr_reader :whatever`
|
39
|
+
Then the output should contain:
|
40
|
+
"""
|
41
|
+
# def whatever
|
42
|
+
# @whatever
|
43
|
+
# end
|
44
|
+
"""
|
45
|
+
|
46
|
+
Scenario: attr_writer with anymodelname
|
47
|
+
When I run `learn rails anymodelname attr_writer :whatever`
|
48
|
+
Then the output should contain:
|
49
|
+
"""
|
50
|
+
# def whatever=(value)
|
51
|
+
# @whatever = value
|
52
|
+
# end
|
53
|
+
"""
|
54
|
+
|
55
|
+
Scenario: attr_accessor with anymodelname
|
56
|
+
When I run `learn rails anymodelname attr_accessor :whatever`
|
57
|
+
Then the output should contain:
|
58
|
+
"""
|
59
|
+
# def whatever
|
60
|
+
# @whatever
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
# def whatever=(value)
|
64
|
+
# @whatever = value
|
65
|
+
# end
|
66
|
+
"""
|
67
|
+
|
68
|
+
Scenario: attr_reader with multiple attributes
|
69
|
+
When I run `learn rails attr_reader :whatever, :another`
|
70
|
+
Then the output should contain:
|
71
|
+
"""
|
72
|
+
# def whatever
|
73
|
+
# @whatever
|
74
|
+
# end
|
75
|
+
#
|
76
|
+
# def another
|
77
|
+
# @another
|
78
|
+
# end
|
79
|
+
"""
|
80
|
+
|
81
|
+
Scenario: attr_writer with multiple attrributes
|
82
|
+
When I run `learn rails attr_writer :whatever, :another`
|
83
|
+
Then the output should contain:
|
84
|
+
"""
|
85
|
+
# def whatever=(value)
|
86
|
+
# @whatever = value
|
87
|
+
# end
|
88
|
+
#
|
89
|
+
# def another=(value)
|
90
|
+
# @another = value
|
91
|
+
# end
|
92
|
+
"""
|
93
|
+
|
94
|
+
Scenario: attr_accessor with multiple attributes
|
95
|
+
When I run `learn rails attr_accessor :whatever, :another`
|
96
|
+
Then the output should contain:
|
97
|
+
"""
|
98
|
+
# def whatever
|
99
|
+
# @whatever
|
100
|
+
# end
|
101
|
+
#
|
102
|
+
# def whatever=(value)
|
103
|
+
# @whatever = value
|
104
|
+
# end
|
105
|
+
#
|
106
|
+
# def another
|
107
|
+
# @another
|
108
|
+
# end
|
109
|
+
#
|
110
|
+
# def another=(value)
|
111
|
+
# @another = value
|
112
|
+
# end
|
113
|
+
"""
|
114
|
+
|
115
|
+
Scenario: valid statement but with comma right after
|
116
|
+
When I run `learn rails attr_reader :whatever,`
|
117
|
+
Then the output should not contain ","
|
118
|
+
|
119
|
+
Scenario: valid statement but with standalone comma after it
|
120
|
+
When I run `learn rails attr_reader :whatever ,`
|
121
|
+
Then the output should not contain ","
|
122
|
+
And the output should not contain "@ "
|
@@ -0,0 +1,506 @@
|
|
1
|
+
Feature: Associations
|
2
|
+
In order to understand rails associations
|
3
|
+
As a learn_rails gem user
|
4
|
+
I want to see the right ruby code in the terminal
|
5
|
+
|
6
|
+
Scenario: belongs_to association
|
7
|
+
When I run `learn rails task belongs_to :user`
|
8
|
+
Then the output should contain:
|
9
|
+
"""
|
10
|
+
# def user(force_reload = false)
|
11
|
+
# @user = nil if force_reload
|
12
|
+
# @user ||= User.find_by_id(self.user_id)
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# def user=(user)
|
16
|
+
# self.user_id = user.id
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# def build_user(attributes = {})
|
20
|
+
# self.user = User.new(attributes)
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# def create_user(attributes = {})
|
24
|
+
# self.user = User.create(attributes)
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# def create_user!(attributes = {})
|
28
|
+
# self.user = User.create!(attributes)
|
29
|
+
# end
|
30
|
+
"""
|
31
|
+
|
32
|
+
Scenario: belongs_to association without the model name
|
33
|
+
When I run `learn rails belongs_to :user`
|
34
|
+
Then the output should contain:
|
35
|
+
"""
|
36
|
+
# def user(force_reload = false)
|
37
|
+
# @user = nil if force_reload
|
38
|
+
# @user ||= User.find_by_id(self.user_id)
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# def user=(user)
|
42
|
+
# self.user_id = user.id
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# def build_user(attributes = {})
|
46
|
+
# self.user = User.new(attributes)
|
47
|
+
# end
|
48
|
+
#
|
49
|
+
# def create_user(attributes = {})
|
50
|
+
# self.user = User.create(attributes)
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# def create_user!(attributes = {})
|
54
|
+
# self.user = User.create!(attributes)
|
55
|
+
# end
|
56
|
+
"""
|
57
|
+
|
58
|
+
Scenario: belongs_to association with multi-word model
|
59
|
+
When I run `learn rails manual belongs_to :car_part`
|
60
|
+
Then the output should contain:
|
61
|
+
"""
|
62
|
+
# def car_part(force_reload = false)
|
63
|
+
# @car_part = nil if force_reload
|
64
|
+
# @car_part ||= CarPart.find_by_id(self.car_part_id)
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# def car_part=(car_part)
|
68
|
+
# self.car_part_id = car_part.id
|
69
|
+
# end
|
70
|
+
#
|
71
|
+
# def build_car_part(attributes = {})
|
72
|
+
# self.car_part = CarPart.new(attributes)
|
73
|
+
# end
|
74
|
+
#
|
75
|
+
# def create_car_part(attributes = {})
|
76
|
+
# self.car_part = CarPart.create(attributes)
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
# def create_car_part!(attributes = {})
|
80
|
+
# self.car_part = CarPart.create!(attributes)
|
81
|
+
# end
|
82
|
+
"""
|
83
|
+
And the output should not contain "carpart"
|
84
|
+
And the output should not contain "Car_Part"
|
85
|
+
|
86
|
+
Scenario: belongs_to association with :class_name option
|
87
|
+
When I run `learn rails task belongs_to :user, class_name: "Person"`
|
88
|
+
Then the output should contain:
|
89
|
+
"""
|
90
|
+
# def user(force_reload = false)
|
91
|
+
# @user = nil if force_reload
|
92
|
+
# @user ||= Person.find_by_id(self.user_id)
|
93
|
+
# end
|
94
|
+
#
|
95
|
+
# def user=(user)
|
96
|
+
# self.user_id = user.id
|
97
|
+
# end
|
98
|
+
#
|
99
|
+
# def build_user(attributes = {})
|
100
|
+
# self.user = Person.new(attributes)
|
101
|
+
# end
|
102
|
+
#
|
103
|
+
# def create_user(attributes = {})
|
104
|
+
# self.user = Person.create(attributes)
|
105
|
+
# end
|
106
|
+
#
|
107
|
+
# def create_user!(attributes = {})
|
108
|
+
# self.user = Person.create!(attributes)
|
109
|
+
# end
|
110
|
+
"""
|
111
|
+
And the output should not contain "# @user ||= User.find_by_id(self.user_id)"
|
112
|
+
And the output should not contain "# self.user = User.new(attributes)"
|
113
|
+
And the output should not contain "# self.user = User.create(attributes)"
|
114
|
+
And the output should not contain "# self.user = User.create!(attributes)"
|
115
|
+
|
116
|
+
Scenario: belongs_to association with :foreign_key option
|
117
|
+
When I run `learn rails task belongs_to :user, foreign_key: "person_id"`
|
118
|
+
Then the output should contain:
|
119
|
+
"""
|
120
|
+
# def user(force_reload = false)
|
121
|
+
# @user = nil if force_reload
|
122
|
+
# @user ||= User.find_by_id(self.person_id)
|
123
|
+
# end
|
124
|
+
#
|
125
|
+
# def user=(user)
|
126
|
+
# self.person_id = user.id
|
127
|
+
# end
|
128
|
+
#
|
129
|
+
# def build_user(attributes = {})
|
130
|
+
# self.user = User.new(attributes)
|
131
|
+
# end
|
132
|
+
#
|
133
|
+
# def create_user(attributes = {})
|
134
|
+
# self.user = User.create(attributes)
|
135
|
+
# end
|
136
|
+
#
|
137
|
+
# def create_user!(attributes = {})
|
138
|
+
# self.user = User.create!(attributes)
|
139
|
+
# end
|
140
|
+
"""
|
141
|
+
And the output should not contain "# @user ||= User.find_by_id(self.user_id)"
|
142
|
+
And the output should not contain "# self.user_id = user.id"
|
143
|
+
|
144
|
+
Scenario: belongs_to association with :primary_key option
|
145
|
+
When I run `learn rails task belongs_to :user, primary_key: "todo_id"`
|
146
|
+
Then the output should contain:
|
147
|
+
"""
|
148
|
+
# def user(force_reload = false)
|
149
|
+
# @user = nil if force_reload
|
150
|
+
# @user ||= User.find_by_id(self.user_id)
|
151
|
+
# end
|
152
|
+
#
|
153
|
+
# def user=(user)
|
154
|
+
# self.user_id = user.todo_id
|
155
|
+
# end
|
156
|
+
#
|
157
|
+
# def build_user(attributes = {})
|
158
|
+
# self.user = User.new(attributes)
|
159
|
+
# end
|
160
|
+
#
|
161
|
+
# def create_user(attributes = {})
|
162
|
+
# self.user = User.create(attributes)
|
163
|
+
# end
|
164
|
+
#
|
165
|
+
# def create_user!(attributes = {})
|
166
|
+
# self.user = User.create!(attributes)
|
167
|
+
# end
|
168
|
+
"""
|
169
|
+
And the output should not contain "# self.user_id = user.id"
|
170
|
+
|
171
|
+
Scenario: belongs_to association with :readonly option
|
172
|
+
When I run `learn rails task belongs_to :user, readonly: true`
|
173
|
+
Then the output should contain:
|
174
|
+
"""
|
175
|
+
# def user(force_reload = false)
|
176
|
+
# @user = nil if force_reload
|
177
|
+
# @user ||= User.find_by_id(self.user_id)
|
178
|
+
# end
|
179
|
+
#
|
180
|
+
# def build_user(attributes = {})
|
181
|
+
# self.user = User.new(attributes)
|
182
|
+
# end
|
183
|
+
#
|
184
|
+
# def create_user(attributes = {})
|
185
|
+
# self.user = User.create(attributes)
|
186
|
+
# end
|
187
|
+
#
|
188
|
+
# def create_user!(attributes = {})
|
189
|
+
# self.user = User.create!(attributes)
|
190
|
+
# end
|
191
|
+
"""
|
192
|
+
And the output should not contain "# def user=(user)"
|
193
|
+
And the output should not contain "# self.user_id = user.id"
|
194
|
+
|
195
|
+
Scenario: belongs_to association with :conditions option
|
196
|
+
When I run `learn rails task belongs_to :user, conditions: { status: "active"}`
|
197
|
+
And the output should contain "# def user(force_reload = false)"
|
198
|
+
And the output should contain:
|
199
|
+
"""
|
200
|
+
# @user ||= User.first(:conditions => {:id => self.user_id, :status => "active"})
|
201
|
+
"""
|
202
|
+
|
203
|
+
Scenario: has_one association
|
204
|
+
When I run `learn rails user has_one :task`
|
205
|
+
Then the output should contain:
|
206
|
+
"""
|
207
|
+
# def task(force_reload = false)
|
208
|
+
# @task = nil if force_reload
|
209
|
+
# @task ||= Task.find_by_user_id(self.id)
|
210
|
+
# end
|
211
|
+
#
|
212
|
+
# def task=(task)
|
213
|
+
# task.user_id = self.id
|
214
|
+
# task.save
|
215
|
+
# end
|
216
|
+
#
|
217
|
+
# def build_task(attributes = {})
|
218
|
+
# attributes[:user_id] = self.id
|
219
|
+
# Task.new(attributes)
|
220
|
+
# end
|
221
|
+
#
|
222
|
+
# def create_task(attributes = {})
|
223
|
+
# attributes[:user_id] = self.id
|
224
|
+
# Task.create(attributes)
|
225
|
+
# end
|
226
|
+
#
|
227
|
+
# def create_task!(attributes = {})
|
228
|
+
# attributes[:user_id] = self.id
|
229
|
+
# Task.create!(attributes)
|
230
|
+
# end
|
231
|
+
"""
|
232
|
+
|
233
|
+
Scenario: has_one association without the model name
|
234
|
+
Given PENDING: Aruba process keeps hanging, need to test for terminal question
|
235
|
+
When I run `learn rails has_one :task`
|
236
|
+
Then the output should contain "What is the model name for this association?"
|
237
|
+
|
238
|
+
Scenario: has_one association with model name given when prompted
|
239
|
+
Given PENDING: Aruba process keeps hanging, need to test for terminal question
|
240
|
+
When I run `learn rails has_one :task`
|
241
|
+
And I type `user`
|
242
|
+
Then the output should contain:
|
243
|
+
"""
|
244
|
+
# def task(force_reload = false)
|
245
|
+
# @task = nil if force_reload
|
246
|
+
# @task ||= Task.find_by_user_id(self.id)
|
247
|
+
# end
|
248
|
+
#
|
249
|
+
# def task=(task)
|
250
|
+
# task.user_id = self.id
|
251
|
+
# task.save
|
252
|
+
# end
|
253
|
+
#
|
254
|
+
# def build_task(attributes = {})
|
255
|
+
# attributes[:user_id] = self.id
|
256
|
+
# Task.new(attributes)
|
257
|
+
# end
|
258
|
+
#
|
259
|
+
# def create_task(attributes = {})
|
260
|
+
# attributes[:user_id] = self.id
|
261
|
+
# Task.create(attributes)
|
262
|
+
# end
|
263
|
+
#
|
264
|
+
# def create_task!(attributes = {})
|
265
|
+
# attributes[:user_id] = self.id
|
266
|
+
# Task.create!(attributes)
|
267
|
+
# end
|
268
|
+
"""
|
269
|
+
|
270
|
+
Scenario: has_one association with multi-word model
|
271
|
+
When I run `learn rails user has_one :voodoo_pop`
|
272
|
+
Then the output should contain:
|
273
|
+
"""
|
274
|
+
# def voodoo_pop(force_reload = false)
|
275
|
+
# @voodoo_pop = nil if force_reload
|
276
|
+
# @voodoo_pop ||= VoodooPop.find_by_user_id(self.id)
|
277
|
+
# end
|
278
|
+
#
|
279
|
+
# def voodoo_pop=(voodoo_pop)
|
280
|
+
# voodoo_pop.user_id = self.id
|
281
|
+
# voodoo_pop.save
|
282
|
+
# end
|
283
|
+
#
|
284
|
+
# def build_voodoo_pop(attributes = {})
|
285
|
+
# attributes[:user_id] = self.id
|
286
|
+
# VoodooPop.new(attributes)
|
287
|
+
# end
|
288
|
+
#
|
289
|
+
# def create_voodoo_pop(attributes = {})
|
290
|
+
# attributes[:user_id] = self.id
|
291
|
+
# VoodooPop.create(attributes)
|
292
|
+
# end
|
293
|
+
#
|
294
|
+
# def create_voodoo_pop!(attributes = {})
|
295
|
+
# attributes[:user_id] = self.id
|
296
|
+
# VoodooPop.create!(attributes)
|
297
|
+
# end
|
298
|
+
"""
|
299
|
+
And the output should not contain "voodoopop"
|
300
|
+
And the output should not contain "Voodoo_Pop"
|
301
|
+
|
302
|
+
Scenario: has_one association with :class_name option using the old hash syntax
|
303
|
+
When I run `learn rails user has_one :task, :class_name => "ToDo"`
|
304
|
+
Then the output should contain:
|
305
|
+
"""
|
306
|
+
# def task(force_reload = false)
|
307
|
+
# @task = nil if force_reload
|
308
|
+
# @task ||= ToDo.find_by_user_id(self.id)
|
309
|
+
# end
|
310
|
+
#
|
311
|
+
# def task=(task)
|
312
|
+
# task.user_id = self.id
|
313
|
+
# task.save
|
314
|
+
# end
|
315
|
+
#
|
316
|
+
# def build_task(attributes = {})
|
317
|
+
# attributes[:user_id] = self.id
|
318
|
+
# ToDo.new(attributes)
|
319
|
+
# end
|
320
|
+
#
|
321
|
+
# def create_task(attributes = {})
|
322
|
+
# attributes[:user_id] = self.id
|
323
|
+
# ToDo.create(attributes)
|
324
|
+
# end
|
325
|
+
#
|
326
|
+
# def create_task!(attributes = {})
|
327
|
+
# attributes[:user_id] = self.id
|
328
|
+
# ToDo.create!(attributes)
|
329
|
+
# end
|
330
|
+
"""
|
331
|
+
And the output should not contain "# @task ||= Task.find_by_user_id(self.id)"
|
332
|
+
And the output should not contain "# Task.new(attributes)"
|
333
|
+
And the output should not contain "# Task.create(attributes)"
|
334
|
+
And the output should not contain "# Task.create!(attributes)"
|
335
|
+
|
336
|
+
Scenario: has_one association with :class_name option using the new hash syntax
|
337
|
+
When I run `learn rails user has_one :task, class_name: "ToDo"`
|
338
|
+
Then the output should contain:
|
339
|
+
"""
|
340
|
+
# def task(force_reload = false)
|
341
|
+
# @task = nil if force_reload
|
342
|
+
# @task ||= ToDo.find_by_user_id(self.id)
|
343
|
+
# end
|
344
|
+
#
|
345
|
+
# def task=(task)
|
346
|
+
# task.user_id = self.id
|
347
|
+
# task.save
|
348
|
+
# end
|
349
|
+
#
|
350
|
+
# def build_task(attributes = {})
|
351
|
+
# attributes[:user_id] = self.id
|
352
|
+
# ToDo.new(attributes)
|
353
|
+
# end
|
354
|
+
#
|
355
|
+
# def create_task(attributes = {})
|
356
|
+
# attributes[:user_id] = self.id
|
357
|
+
# ToDo.create(attributes)
|
358
|
+
# end
|
359
|
+
#
|
360
|
+
# def create_task!(attributes = {})
|
361
|
+
# attributes[:user_id] = self.id
|
362
|
+
# ToDo.create!(attributes)
|
363
|
+
# end
|
364
|
+
"""
|
365
|
+
And the output should not contain "# @task ||= Task.find_by_user_id(self.id)"
|
366
|
+
And the output should not contain "# Task.new(attributes)"
|
367
|
+
And the output should not contain "# Task.create(attributes)"
|
368
|
+
And the output should not contain "# Task.create!(attributes)"
|
369
|
+
|
370
|
+
Scenario: has_one association with :foreign_key option
|
371
|
+
When I run `learn rails user has_one :task, foreign_key: "employee_id"`
|
372
|
+
Then the output should contain:
|
373
|
+
"""
|
374
|
+
# def task(force_reload = false)
|
375
|
+
# @task = nil if force_reload
|
376
|
+
# @task ||= Task.find_by_employee_id(self.id)
|
377
|
+
# end
|
378
|
+
#
|
379
|
+
# def task=(task)
|
380
|
+
# task.employee_id = self.id
|
381
|
+
# task.save
|
382
|
+
# end
|
383
|
+
#
|
384
|
+
# def build_task(attributes = {})
|
385
|
+
# attributes[:employee_id] = self.id
|
386
|
+
# Task.new(attributes)
|
387
|
+
# end
|
388
|
+
#
|
389
|
+
# def create_task(attributes = {})
|
390
|
+
# attributes[:employee_id] = self.id
|
391
|
+
# Task.create(attributes)
|
392
|
+
# end
|
393
|
+
#
|
394
|
+
# def create_task!(attributes = {})
|
395
|
+
# attributes[:employee_id] = self.id
|
396
|
+
# Task.create!(attributes)
|
397
|
+
# end
|
398
|
+
"""
|
399
|
+
And the output should not contain "# @task ||= Task.find_by_user_id(self.id)"
|
400
|
+
And the output should not contain "# task.user_id = self.id"
|
401
|
+
And the output should not contain "# attributes[:user_id] = self.id"
|
402
|
+
And the output should not contain "# attributes[:user_id] = self.id"
|
403
|
+
And the output should not contain "# attributes[:user_id] = self.id"
|
404
|
+
|
405
|
+
Scenario: has_one association with :primary_key option
|
406
|
+
When I run `learn rails user has_one :task, primary_key: "primary_id"`
|
407
|
+
Then the output should contain:
|
408
|
+
"""
|
409
|
+
# def task(force_reload = false)
|
410
|
+
# @task = nil if force_reload
|
411
|
+
# @task ||= Task.find_by_user_id(self.primary_id)
|
412
|
+
# end
|
413
|
+
#
|
414
|
+
# def task=(task)
|
415
|
+
# task.user_id = self.primary_id
|
416
|
+
# task.save
|
417
|
+
# end
|
418
|
+
#
|
419
|
+
# def build_task(attributes = {})
|
420
|
+
# attributes[:user_id] = self.primary_id
|
421
|
+
# Task.new(attributes)
|
422
|
+
# end
|
423
|
+
#
|
424
|
+
# def create_task(attributes = {})
|
425
|
+
# attributes[:user_id] = self.primary_id
|
426
|
+
# Task.create(attributes)
|
427
|
+
# end
|
428
|
+
#
|
429
|
+
# def create_task!(attributes = {})
|
430
|
+
# attributes[:user_id] = self.primary_id
|
431
|
+
# Task.create!(attributes)
|
432
|
+
# end
|
433
|
+
"""
|
434
|
+
And the output should not contain "# @task ||= Task.find_by_user_id(self.id)"
|
435
|
+
And the output should not contain "# task.user_id = self.id"
|
436
|
+
And the output should not contain "# attributes[:user_id] = self.id"
|
437
|
+
And the output should not contain "# attributes[:user_id] = self.id"
|
438
|
+
And the output should not contain "# attributes[:user_id] = self.id"
|
439
|
+
|
440
|
+
Scenario: has_one association with :readonly option
|
441
|
+
When I run `learn rails user has_one :task, readonly: true`
|
442
|
+
Then the output should contain:
|
443
|
+
"""
|
444
|
+
# def task(force_reload = false)
|
445
|
+
# @task = nil if force_reload
|
446
|
+
# @task ||= Task.find_by_user_id(self.id)
|
447
|
+
# end
|
448
|
+
#
|
449
|
+
# def build_task(attributes = {})
|
450
|
+
# attributes[:user_id] = self.id
|
451
|
+
# Task.new(attributes)
|
452
|
+
# end
|
453
|
+
#
|
454
|
+
# def create_task(attributes = {})
|
455
|
+
# attributes[:user_id] = self.id
|
456
|
+
# Task.create(attributes)
|
457
|
+
# end
|
458
|
+
#
|
459
|
+
# def create_task!(attributes = {})
|
460
|
+
# attributes[:user_id] = self.id
|
461
|
+
# Task.create!(attributes)
|
462
|
+
# end
|
463
|
+
"""
|
464
|
+
And the output should not contain "# def task="
|
465
|
+
And the output should not contain "# task.user_id = self.id"
|
466
|
+
|
467
|
+
Scenario: has_many association
|
468
|
+
When I run `learn rails user has_many :tasks`
|
469
|
+
Then the output should contain:
|
470
|
+
"""
|
471
|
+
# def tasks
|
472
|
+
# Task.where(user_id: self.id)
|
473
|
+
# end
|
474
|
+
"""
|
475
|
+
|
476
|
+
Scenario: has_many association without the model name
|
477
|
+
Given PENDING: Aruba process keeps hanging, need to test for terminal question
|
478
|
+
When I run `learn rails has_many :tasks`
|
479
|
+
Then the output should contain "What is the model name for this association?"
|
480
|
+
|
481
|
+
Scenario: has_many association with model name given when prompted
|
482
|
+
Given PENDING: Aruba process keeps hanging, need to test for terminal question
|
483
|
+
When I run `learn rails has_many :tasks`
|
484
|
+
And I type `user`
|
485
|
+
Then the output should contain:
|
486
|
+
"""
|
487
|
+
# def tasks
|
488
|
+
# Task.where(user_id: self.id)
|
489
|
+
# end
|
490
|
+
"""
|
491
|
+
|
492
|
+
Scenario: has_many association with multi-word model
|
493
|
+
When I run `learn rails user has_many :car_parts`
|
494
|
+
Then the output should contain:
|
495
|
+
"""
|
496
|
+
# def car_parts
|
497
|
+
# CarPart.where(user_id: self.id)
|
498
|
+
# end
|
499
|
+
"""
|
500
|
+
And the output should not contain "carpart"
|
501
|
+
And the output should not contain "Car_Part"
|
502
|
+
|
503
|
+
Scenario: non valid rails magic
|
504
|
+
When I run `learn rails random gibberish`
|
505
|
+
Then the output should contain "No ruby code available."
|
506
|
+
And the output should contain "See http://www.github.com/pjc/learn_rails for list of valid instructions."
|