self_systeem 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d2c6cfe25cf61af7377e58c63bbf3ce3a9d75287
4
- data.tar.gz: 69b1f86627aad4b6e6268e80f3db35e20bf2cf63
3
+ metadata.gz: 9de54012651cf7ecfb8be4425844e0d53df4e308
4
+ data.tar.gz: 27d9e804227cb2c399a5c7b9ced9f92d65c264c7
5
5
  SHA512:
6
- metadata.gz: d3b41fa5008d20861a5f95436f41c2a2a9c9e9ff46e9568837616727f11cfb376917be14910db768a5ce178179b22b5b5f4411d3c75a3a28ee6105aeadddcacb
7
- data.tar.gz: 4df8624646d3cfce7e6aa6240fad8e8af83eabf28de6985c45c77e5a9e7124eb05e125a5041c65f58bcd7e8d74e379085d7f7d010392ff81a5596a641c30e048
6
+ metadata.gz: 46267c6ddd61cec31f64abe1535c32b3d1e597b3418f23866c6591cc9f8e01def74a889f83cabd775c46ebc214d53f5f35e1bc5856c47f89527ebe07078d2f52
7
+ data.tar.gz: 23451262d6da7d07ded730df9eaabe0c85b706619c1b93431c6cc82abaccf13dfbc20d05289c0cebfa3afba4c8fb828d4e0069fed911c1c059b3e222b86013a7
data/README.md CHANGED
@@ -1,12 +1,69 @@
1
- # SelfSysteem
1
+ self_systeem
2
+ ============
3
+ | Project | Gem Release |
4
+ |------------------------ | ----------------- |
5
+ | Gem name | self_systeem |
6
+ | License | [MIT](LICENSE.txt) |
7
+ | Version | [![Gem Version](https://badge.fury.io/rb/self_systeem.png)](http://badge.fury.io/rb/self_systeem) |
8
+ | Continuous Integration | [![Build Status](https://travis-ci.org/mfpiccolo/self_systeem.png?branch=master)](https://travis-ci.org/mfpiccolo/self_systeem)
9
+ | Test Coverage | [![Coverage Status](https://coveralls.io/repos/mfpiccolo/self_systeem/badge.png?branch=master)](https://coveralls.io/r/mfpiccolo/self_systeem?branch=coveralls)
10
+ | Grade | [![Code Climate](https://codeclimate.com/github/mfpiccolo/self_systeem.png)](https://codeclimate.com/github/mfpiccolo/self_systeem)
11
+ | Dependencies | [![Dependency Status](https://gemnasium.com/mfpiccolo/self_systeem.png)](https://gemnasium.com/mfpiccolo/self_systeem)
12
+ | Homepage | [http://mfpiccolo.github.io/self_systeem][homepage] |
13
+ | Documentation | [http://rdoc.info/github/mfpiccolo/self_systeem/frames][documentation] |
14
+ | Issues | [https://github.com/mfpiccolo/self_systeem/issues][issues] |
2
15
 
3
- TODO: Write a gem description
16
+ ## Description
17
+
18
+ ###Definition: self-systeem
19
+ noun
20
+
21
+ 1. a realistic respect for or favorable impression of one's system
22
+ 2. confidence in one's system worth or abilities
23
+ 3. system-respect
24
+
25
+ Do you have low self-systeem? Don't worry. This gem is here to help.
26
+
27
+ self_systeem allows you to record a users interaction with your rails app in a
28
+ development enviornment and automatically creates system tests based on the
29
+ recordings.
30
+
31
+ It is simple. Walk through the app from sart to finish. Cover as much as you
32
+ feel comfortable. That't it. You just built a system test. Congrats!
33
+
34
+ ## Features
35
+
36
+ After setting up self_systeem (see configuration below) use the generator to create
37
+ the system test directory.
38
+
39
+ `rails g self_systeem:test`
40
+
41
+ Then run `SELF_SYSTEEM=true rails s`
42
+
43
+ Now open a new browser preferably in incognito mode so you have fresh session.
44
+ Walk through your app like a normal user would. While you are doing this positive
45
+ affirmations are being built in "test/system/support/systeem_booster.yml"
46
+
47
+ Now just run the test file with `ruby -Itest test/system/systeem_test.rb` and watch
48
+ you tests turn green. What does this really get you? Well for one the session and
49
+ database is persisted while runnin all these tests. That means that when you are running
50
+ your tests it is essentially a recreation of all of those users actions in sequence.
51
+
52
+ Possitive affirmations:
53
+ * "Today, my system choose to see love instead of fear"
54
+ * "My system possess the qualities needed to be extremely successful"
55
+
56
+ Feeling better?
57
+
58
+ Well if those didn't work you can always check out the affirmations that you have built in systeem_booster.yml. That should do the trick.
4
59
 
5
60
  ## Installation
6
61
 
7
62
  Add this line to your application's Gemfile:
8
63
 
9
- gem 'self_systeem'
64
+ ```ruby
65
+ gem "self_systeem"
66
+ ```
10
67
 
11
68
  And then execute:
12
69
 
@@ -16,9 +73,44 @@ Or install it yourself as:
16
73
 
17
74
  $ gem install self_systeem
18
75
 
19
- ## Usage
76
+ ## Configuration
20
77
 
21
- TODO: Write usage instructions here
78
+ To use the generator run:
79
+
80
+ $ rails g self_systeem:test
81
+
82
+ This will set up a system folder under test with a test file and some support files.
83
+
84
+ Add this line to development.rb
85
+
86
+ `config.middleware.use "SelfSysteem::AffirmationBuilder" if ENV["SELF_SYSTEEM"].present?`
87
+
88
+ Temporarily change you database.yml so the development database uses the test database.
89
+ This step is only while you build systeem_booster.yml file. Chage it back when you are done.
90
+
91
+ i.e.
92
+ ```ruby
93
+ development: &dev
94
+ adapter: postgresql
95
+ encoding: unicode
96
+ database: app_test # Change this back after creating the
97
+ pool: 5
98
+ username: <%= ENV["USER"] %>
99
+ password:
100
+ allow_concurrency: true
101
+ min_messages: warning
102
+ ```
103
+
104
+ ## Donating
105
+ Support this project and [others by mfpiccolo][gittip-mfpiccolo] via [gittip][gittip-mfpiccolo].
106
+
107
+ [gittip-mfpiccolo]: https://www.gittip.com/mfpiccolo/
108
+
109
+ ## Copyright
110
+
111
+ Copyright (c) 2013 Mike Piccolo
112
+
113
+ See [LICENSE.txt](LICENSE.txt) for details.
22
114
 
23
115
  ## Contributing
24
116
 
@@ -27,3 +119,11 @@ TODO: Write usage instructions here
27
119
  3. Commit your changes (`git commit -am 'Add some feature'`)
28
120
  4. Push to the branch (`git push origin my-new-feature`)
29
121
  5. Create new Pull Request
122
+
123
+ [![githalytics.com alpha](https://cruel-carlota.pagodabox.com/3d22924e211bdc891d3ad124e085a595 "githalytics.com")](http://githalytics.com/mfpiccolo/self_systeem)
124
+
125
+ [license]: https://github.com/mfpiccolo/self_systeem/MIT-LICENSE
126
+ [homepage]: http://mfpiccolo.github.io/self_systeem
127
+ [documentation]: http://rdoc.info/github/mfpiccolo/self_systeem/frames
128
+ [issues]: https://github.com/mfpiccolo/self_systeem/issues
129
+
@@ -1,24 +1,32 @@
1
1
  require "./test/system/support/systeem_config.rb"
2
2
 
3
3
  describe "start_db_cleaner" do
4
- before { DatabaseCleaner.start }
4
+ it { DatabaseCleaner.start }
5
5
  end
6
6
 
7
7
  SysteemConfig::Affirmations.each do |a|
8
8
  describe a[:controller_class_name].constantize do
9
9
  before do
10
+ # Only needed if devise
10
11
  @request.env["devise.mapping"] = Devise.mappings[:user]
11
12
  send(a[:request_method].downcase.to_sym, a[:action], a[:request_parameters], SysteemConfig::Session)
12
13
  SysteemConfig::Session.merge! session
13
14
  end
14
15
 
15
16
  it {
16
- assert_response a[:status]
17
+ controller_instance = response.request.env["action_controller.instance"]
18
+ builder = SelfSysteem::InstanceVariablesBuilder.call(controller_instance)
19
+ relevant_instance_varaibles = builder.relevant_instance_varaibles
20
+ instance_variable_objects = builder.instance_variable_objects
17
21
 
22
+ assert_response a[:status]
23
+ assert_equal(a[:relevant_instance_varaibles], relevant_instance_varaibles.to_s)
24
+ assert_equal(a[:instance_variable_objects], instance_variable_objects)
25
+ assert_equal(a[:templates], @_templates)
18
26
  }
19
27
  end
20
28
  end
21
29
 
22
30
  describe "db_cleaner_clean" do
23
- before { DatabaseCleaner.clean }
31
+ it { DatabaseCleaner.clean }
24
32
  end
@@ -1,9 +1,11 @@
1
1
  require "self_systeem/version"
2
2
  require "self_systeem/affirmation_builder"
3
+ require "self_systeem/instance_variables_builder"
3
4
 
4
- module MinitestVcr
5
+ module SelfSysteem
5
6
  def self.included(base)
6
7
  base.send(:include, SelfSysteem::AffirmationBuilder)
8
+ base.send(:include, SelfSysteem::InstanceVariablesBuilder)
7
9
  super
8
10
  end
9
11
  end
@@ -6,9 +6,11 @@ module SelfSysteem
6
6
  end
7
7
 
8
8
  def call(env)
9
+
9
10
  if env["REQUEST_PATH"].match(/\/assets/)
10
11
  status, headers, response = @app.call(env)
11
12
  else
13
+ setup_subscriptions
12
14
  status, headers, response = @app.call(env)
13
15
  request_path = env["REQUEST_PATH"]
14
16
  request_method = env["REQUEST_METHOD"]
@@ -17,26 +19,11 @@ module SelfSysteem
17
19
  request_parameters.merge!(env["rack.request.form_hash"]) if env["rack.request.form_hash"].present?
18
20
  request_parameters.merge!(env["action_controller.instance"].params.try(:to_hash)) if env["action_controller.instance"].params.present?
19
21
 
20
- controller_instance = env["action_controller.instance"]
21
- controller_class_name = controller_instance.try(:class).try(:name)
22
- action = controller_instance.action_name
23
-
24
- relevant_instance_varaibles = controller_instance
25
- .instance_variable_names.reject {|v| v[/@_/] || v == "@marked_for_same_origin_verification"}
26
- instance_variable_objects = {}
27
- relevant_instance_varaibles.each do |v|
28
- iv_val = controller_instance.instance_variable_get(v)
29
- if iv_val.class.name.match(/ActiveRecord::AssociationRelation|ActiveRecord::Associations::CollectionProxy/)
30
- instance_variable_objects.merge!(v.to_s => { })
31
- iv_val.each do |o|
32
- instance_variable_objects[v.to_s].merge!({ o.to_s => o.attributes })
33
- end
34
- elsif iv_val.is_a?(ActiveRecord::Base)
35
- instance_variable_objects.merge!({ v.to_s => iv_val.attributes })
36
- else
37
- instance_variable_objects.merge!({ v.to_s => iv_val.to_s })
38
- end
39
- end
22
+ @controller_instance = env["action_controller.instance"]
23
+ controller_class_name = @controller_instance.try(:class).try(:name)
24
+ action = @controller_instance.action_name
25
+
26
+ setup_instance_varaibles
40
27
 
41
28
  booster = {request_method: request_method,
42
29
  request_path: request_path,
@@ -44,8 +31,12 @@ module SelfSysteem
44
31
  request_parameters: request_parameters,
45
32
  controller_class_name: controller_class_name,
46
33
  status: status,
47
- relevant_instance_varaibles: relevant_instance_varaibles.to_s,
48
- instance_variable_objects: instance_variable_objects
34
+ partials: @_partials,
35
+ layouts: @_layouts,
36
+ templates: @_templates,
37
+ files: @_files,
38
+ relevant_instance_varaibles: @relevant_instance_varaibles.to_s,
39
+ instance_variable_objects: @instance_variable_objects
49
40
  }
50
41
 
51
42
  unless File.exist?(Rails.root.to_s + "/test/system/support/systeem_booster.yml")
@@ -59,9 +50,63 @@ module SelfSysteem
59
50
  File.open(Rails.root.to_s + "/test/system/support/systeem_booster.yml", 'w') do |file|
60
51
  file.write(boosters.to_yaml)
61
52
  end
53
+
54
+ teardown_subscriptions
62
55
  end
63
56
 
64
57
  [status, headers, [response.try(:body)].flatten]
65
58
  end
59
+
60
+ def setup_instance_varaibles
61
+ builder = SelfSysteem::InstanceVariablesBuilder.call(@controller_instance)
62
+ @relevant_instance_varaibles = builder.relevant_instance_varaibles
63
+ @instance_variable_objects = builder.instance_variable_objects
64
+ end
65
+
66
+ def setup_subscriptions
67
+ @_partials = Hash.new(0)
68
+ @_templates = Hash.new(0)
69
+ @_layouts = Hash.new(0)
70
+ @_files = Hash.new(0)
71
+
72
+ ActiveSupport::Notifications.subscribe("render_template.action_view") do |_name, _start, _finish, _id, payload|
73
+ path = payload[:layout]
74
+ if path
75
+ @_layouts[path] += 1
76
+ if path =~ /^layouts\/(.*)/
77
+ @_layouts[$1] += 1
78
+ end
79
+ end
80
+ end
81
+
82
+ ActiveSupport::Notifications.subscribe("!render_template.action_view") do |_name, _start, _finish, _id, payload|
83
+ path = payload[:virtual_path]
84
+ next unless path
85
+ partial = path =~ /^.*\/_[^\/]*$/
86
+
87
+ if partial
88
+ @_partials[path] += 1
89
+ @_partials[path.split("/").last] += 1
90
+ end
91
+
92
+ @_templates[path] += 1
93
+ end
94
+
95
+ ActiveSupport::Notifications.subscribe("!render_template.action_view") do |_name, _start, _finish, _id, payload|
96
+ next if payload[:virtual_path] # files don't have virtual path
97
+
98
+ path = payload[:identifier]
99
+ if path
100
+ @_files[path] += 1
101
+ @_files[path.split("/").last] += 1
102
+ end
103
+ end
104
+ end
105
+
106
+ def teardown_subscriptions
107
+ ActiveSupport::Notifications.unsubscribe("render_template.action_view")
108
+ ActiveSupport::Notifications.unsubscribe("!render_template.action_view")
109
+ end
110
+
66
111
  end
67
112
  end
@@ -0,0 +1,62 @@
1
+ module SelfSysteem
2
+ class InstanceVariablesBuilder
3
+ include ActionView::Helpers::NumberHelper
4
+
5
+ attr_reader :controller, :relevant_instance_varaibles, :instance_variable_objects
6
+
7
+ def initialize(controller)
8
+ @controller = controller
9
+ end
10
+
11
+ def call
12
+ build_variables
13
+ self
14
+ end
15
+
16
+ def build_variables
17
+ @relevant_instance_varaibles = controller
18
+ .instance_variable_names.reject {|v| v[/@_/] || v == "@marked_for_same_origin_verification"}
19
+ @instance_variable_objects = {}
20
+ relevant_instance_varaibles.each do |v|
21
+ iv_val = controller.instance_variable_get(v)
22
+ if iv_val.class.name.match(/ActiveRecord::AssociationRelation|ActiveRecord::Associations::CollectionProxy/)
23
+ instance_variable_objects.merge!(v.to_s => { })
24
+ iv_val.each do |o|
25
+ instance_variable_objects[v.to_s].merge!(o.attributes.select {|k, v| k.to_s.match(/^id|_id/)})
26
+ end
27
+ elsif iv_val.respond_to?(:attributes)
28
+ instance_variable_objects.merge!({ v.to_s => iv_val.attributes.select {|k, v| k.to_s.match(/^id|_id/)} })
29
+ elsif iv_val.present? && iv_val.class.ancestors.select {|c| c.to_s.match(/ActiveModel|ActiveRecord/)}.present? && iv_val.is_a?(Symbol) != true
30
+ instance_variable_objects.merge!({ v.to_s => slice_hash(JSON.parse(iv_val.to_json), /^id|_id/) })
31
+ elsif iv_val.respond_to?(:instance_values)
32
+ instance_variable_objects.merge!({ v.to_s => iv_val.instance_values.select {|k, v| k.to_s.match(/^id|_id/)} })
33
+ else
34
+ instance_variable_objects.merge!({ v.to_s => iv_val.to_s })
35
+ end
36
+ end
37
+ end
38
+
39
+ def transform_hash(original, options={}, &block)
40
+ original.inject({}){|result, (key,value)|
41
+ value = if (options[:deep] && Hash === value)
42
+ transform_hash(value, options, &block)
43
+ else
44
+ value
45
+ end
46
+ block.call(result,key,value)
47
+ result
48
+ }
49
+ end
50
+
51
+ def slice_hash(hash, regex)
52
+ transform_hash(hash, :deep => true) {|hash, key, value|
53
+ hash[key] = value if (value.is_a?(Hash) || key.to_s.match(regex) )
54
+ }
55
+ end
56
+
57
+ def self.call(controller)
58
+ new(controller).call
59
+ end
60
+
61
+ end
62
+ end
@@ -1,3 +1,3 @@
1
1
  module SelfSysteem
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: self_systeem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Piccolo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-03 00:00:00.000000000 Z
11
+ date: 2014-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -69,6 +69,7 @@ files:
69
69
  - lib/generators/self_systeem/test_generator.rb
70
70
  - lib/self_systeem.rb
71
71
  - lib/self_systeem/affirmation_builder.rb
72
+ - lib/self_systeem/instance_variables_builder.rb
72
73
  - lib/self_systeem/version.rb
73
74
  - self_systeem.gemspec
74
75
  homepage: ''