motion-prime 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.gitignore +1 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile.lock +1 -1
- data/README.md +6 -1
- data/ROADMAP.md +1 -1
- data/Rakefile +0 -8
- data/files/Gemfile +2 -2
- data/files/Gemfile.lock +4 -4
- data/files/Rakefile +0 -2
- data/files/app/app_delegate.rb +1 -1
- data/files/app/config/base.rb +12 -13
- data/files/app/environment.rb +1 -6
- data/files/resources/Icon.png +0 -0
- data/lib/motion-prime.rb +6 -0
- data/motion-prime/app_delegate.rb +3 -0
- data/motion-prime/config/base.rb +14 -17
- data/motion-prime/config/config.rb +43 -3
- data/motion-prime/core_ext/kernel.rb +1 -1
- data/motion-prime/env.rb +25 -0
- data/motion-prime/prime.rb +5 -1
- data/motion-prime/services/logger.rb +24 -22
- data/motion-prime/styles/form.rb +3 -3
- data/{files/app → motion-prime}/styles/sidebar.rb +3 -3
- data/motion-prime/version.rb +1 -1
- data/motion-prime/views/styles.rb +15 -2
- data/spec/config/store_spec.rb +16 -0
- data/spec/helpers/init.rb +2 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZWVkMTljOTZkZDI3YThhODdjZGU3OWU4NWE1MzU2ZDY2ZmU1YTY2YQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZjExNDBjZmEwZWQ4MWU3NmE5MGJhNmVkNDVmMWUyYmNkN2E3M2JmMg==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YWE1ZDk0YjZhZTZmYTA0ODg5NzIwYTBjZmU5NzA5OWM4YzVmMzZhOGQzODI1
|
10
|
+
ZDkwNGRhYmE0YjA3NmYyMjBiMzYzZThlMjQyYjVhZGQ4YzAwN2QzOTZiZmE3
|
11
|
+
MTJhMjIwYzBjMDYzOTRkNWIzYmE4YWRhNmI3ZTAwNWY2NmEzNWQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZTgzMDY0MjA4MGJjYmYxMTA4NDYzOGQ2NTI1MTgzOGNiZTNiMmFkMTA4NWQ5
|
14
|
+
MTkyYzQ1OTIwMGM2ODliZTkwZTYwMTNiZjJkYTE3NzliZDhiNzQwZTM2MjFk
|
15
|
+
NjQ4NTA0YTExMmVhYjNiNGNhNjY2MmM2OTllMGEwMWE1Y2QxNTQ=
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -14,7 +14,12 @@ MotionPrime is yet another framework written on RubyMotion for creating really f
|
|
14
14
|
|
15
15
|
$ prime new myapp
|
16
16
|
|
17
|
-
### 3.
|
17
|
+
### 3. Setup application
|
18
|
+
|
19
|
+
$ bundle install
|
20
|
+
$ rake pod:install
|
21
|
+
|
22
|
+
### 4. Run application
|
18
23
|
|
19
24
|
$ rake
|
20
25
|
|
data/ROADMAP.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
=== 0.6.0
|
2
|
-
* add configuration initializer.
|
3
2
|
* add cleanup for section events
|
4
3
|
* add computed_options.get(), this will allow to make sure that options is computed.
|
5
4
|
* add dsl for push notifications
|
6
5
|
* add some extensions/middleware system, at least for networking.
|
7
6
|
* create "display_network_error" extension.
|
7
|
+
* add different templates. some templates should be more like final app.
|
8
8
|
|
9
9
|
=== 0.7.0
|
10
10
|
* add testing framework
|
data/Rakefile
CHANGED
@@ -21,12 +21,4 @@ require 'motion-redgreen'
|
|
21
21
|
|
22
22
|
Motion::Project::App.setup do |app|
|
23
23
|
app.name = 'Prime'
|
24
|
-
app.pods do
|
25
|
-
pod 'NanoStore', '~> 2.7.7'
|
26
|
-
pod 'SDWebImage'
|
27
|
-
pod 'SVPullToRefresh'
|
28
|
-
pod 'MBAlertView'
|
29
|
-
pod 'RESideMenu', git: 'https://github.com/feklistov/RESideMenu.git'
|
30
|
-
pod 'MBProgressHUD', '~> 0.8'
|
31
|
-
end
|
32
24
|
end
|
data/files/Gemfile
CHANGED
@@ -5,10 +5,10 @@ gem 'motion-support', '~> 0.2.4'
|
|
5
5
|
gem 'sugarcube', '~> 1.3.7', require: 'sugarcube-classic'
|
6
6
|
gem 'bubble-wrap', '~> 1.3.0'
|
7
7
|
|
8
|
-
gem 'motion-prime', '~> 0.5.0
|
8
|
+
gem 'motion-prime', '~> 0.5.0', path: '../'
|
9
9
|
|
10
10
|
# add reside menu for sidebar support
|
11
|
-
gem 'prime_reside_menu', '~> 0.1.
|
11
|
+
gem 'prime_reside_menu', '~> 0.1.3'
|
12
12
|
|
13
13
|
# or add sliding menu for sidebar support
|
14
14
|
# gem 'prime_sliding_menu', '~> 0.1.0'
|
data/files/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../
|
3
3
|
specs:
|
4
|
-
motion-prime (0.5.0
|
4
|
+
motion-prime (0.5.0)
|
5
5
|
bubble-wrap
|
6
6
|
cocoapods
|
7
7
|
methadone
|
@@ -50,7 +50,7 @@ GEM
|
|
50
50
|
multi_json (1.8.2)
|
51
51
|
nap (0.6.0)
|
52
52
|
open4 (1.3.0)
|
53
|
-
prime_reside_menu (0.1.
|
53
|
+
prime_reside_menu (0.1.3)
|
54
54
|
cocoapods
|
55
55
|
motion-cocoapods
|
56
56
|
motion-require
|
@@ -67,7 +67,7 @@ PLATFORMS
|
|
67
67
|
DEPENDENCIES
|
68
68
|
bubble-wrap (~> 1.3.0)
|
69
69
|
motion-cocoapods (~> 1.4.0)
|
70
|
-
motion-prime (~> 0.5.0
|
70
|
+
motion-prime (~> 0.5.0)!
|
71
71
|
motion-support (~> 0.2.4)
|
72
|
-
prime_reside_menu (~> 0.1.
|
72
|
+
prime_reside_menu (~> 0.1.3)
|
73
73
|
sugarcube (~> 1.3.7)
|
data/files/Rakefile
CHANGED
data/files/app/app_delegate.rb
CHANGED
@@ -6,7 +6,7 @@ class AppDelegate < Prime::BaseAppDelegate
|
|
6
6
|
|
7
7
|
def setup_navigation_styles
|
8
8
|
bar_appearance = UINavigationBar.appearance
|
9
|
-
bar_appearance.barTintColor =
|
9
|
+
bar_appearance.barTintColor = :app_dark.uicolor
|
10
10
|
|
11
11
|
settings = {
|
12
12
|
UITextAttributeFont => Prime::Config.font.name.uifont(17),
|
data/files/app/config/base.rb
CHANGED
@@ -1,15 +1,14 @@
|
|
1
|
-
Prime::Config.
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
Prime::Config.configure do |config|
|
2
|
+
config.colors do |colors|
|
3
|
+
colors.base = 0x3aa9b6
|
4
|
+
colors.dark = 0x41929c
|
5
|
+
end
|
5
6
|
|
6
|
-
|
7
|
-
api.base = "http://example.com"
|
8
|
-
api.client_id = ""
|
9
|
-
api.client_secret = ""
|
10
|
-
end
|
7
|
+
config.font.name = "Ubuntu"
|
11
8
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
config.api do |api|
|
10
|
+
api.base = "http://example.com"
|
11
|
+
api.client_id = ""
|
12
|
+
api.client_secret = ""
|
13
|
+
end
|
14
|
+
end
|
data/files/app/environment.rb
CHANGED
data/files/resources/Icon.png
CHANGED
Binary file
|
data/lib/motion-prime.rb
CHANGED
@@ -1,4 +1,10 @@
|
|
1
1
|
require 'motion-require'
|
2
|
+
require 'motion-support'
|
3
|
+
require 'sugarcube-common'
|
4
|
+
require 'bubble-wrap'
|
5
|
+
require 'bubble-wrap/reactor'
|
6
|
+
require File.expand_path('../../motion-prime/env.rb', __FILE__)
|
7
|
+
require File.expand_path('../../motion-prime/prime.rb', __FILE__)
|
2
8
|
|
3
9
|
Motion::Require.all(Dir.glob(File.expand_path('../../motion-prime/**/*.rb', __FILE__)))
|
4
10
|
|
@@ -7,6 +7,9 @@ module MotionPrime
|
|
7
7
|
attr_accessor :window
|
8
8
|
|
9
9
|
def application(application, willFinishLaunchingWithOptions:opts)
|
10
|
+
MotionPrime::Config.configure!
|
11
|
+
MotionPrime::Styles.define!
|
12
|
+
Prime.logger.info "Loading Prime application with env: #{Prime.env}"
|
10
13
|
application.setStatusBarStyle UIStatusBarStyleLightContent
|
11
14
|
application.setStatusBarHidden false
|
12
15
|
end
|
data/motion-prime/config/base.rb
CHANGED
@@ -1,21 +1,18 @@
|
|
1
1
|
motion_require './config.rb'
|
2
|
-
MotionPrime::Config.
|
3
|
-
if
|
4
|
-
model.store_type = :memory
|
2
|
+
MotionPrime::Config.configure do |config|
|
3
|
+
if MotionPrime.env.test?
|
4
|
+
config.model.store_type = :memory
|
5
5
|
else
|
6
|
-
model.store_type = :file
|
6
|
+
config.model.store_type = :file
|
7
|
+
end
|
8
|
+
config.font.name = "Ubuntu"
|
9
|
+
config.colors do |colors|
|
10
|
+
colors.base = 0x424242
|
11
|
+
colors.error = 0xef471f
|
12
|
+
end
|
13
|
+
config.api do |api|
|
14
|
+
api.base = "http://example.com"
|
15
|
+
api.client_id = ""
|
16
|
+
api.client_secret = ""
|
7
17
|
end
|
8
|
-
end
|
9
|
-
MotionPrime::Config.font.name = "Ubuntu"
|
10
|
-
MotionPrime::Config.color do |color|
|
11
|
-
color.base = 0x424242
|
12
|
-
color.error = 0xef471f
|
13
|
-
end
|
14
|
-
MotionPrime::Config.sidebar do |sidebar|
|
15
|
-
sidebar.background_image = "images/sidebar/background.png".uiimage
|
16
|
-
end
|
17
|
-
MotionPrime::Config.api do |api|
|
18
|
-
api.base = "http://example.com"
|
19
|
-
api.client_id = ""
|
20
|
-
api.client_secret = ""
|
21
18
|
end
|
@@ -22,6 +22,10 @@ module MotionPrime
|
|
22
22
|
end
|
23
23
|
alias :blank? :nil?
|
24
24
|
|
25
|
+
def present?
|
26
|
+
!blank?
|
27
|
+
end
|
28
|
+
|
25
29
|
def has_key?(key)
|
26
30
|
!self[key].is_a?(self.class)
|
27
31
|
end
|
@@ -35,6 +39,39 @@ module MotionPrime
|
|
35
39
|
@base_config ||= self.new()
|
36
40
|
@base_config.send(name.to_sym, *args, &block)
|
37
41
|
end
|
42
|
+
|
43
|
+
def configure(&block)
|
44
|
+
@configure_blocks ||= []
|
45
|
+
@configure_blocks << block
|
46
|
+
end
|
47
|
+
|
48
|
+
def configure!
|
49
|
+
@configure_blocks ||= []
|
50
|
+
@base_config ||= self.new()
|
51
|
+
@configure_blocks.each do |block|
|
52
|
+
block.call(@base_config)
|
53
|
+
end
|
54
|
+
setup_models
|
55
|
+
setup_colors
|
56
|
+
end
|
57
|
+
|
58
|
+
def setup_models
|
59
|
+
MotionPrime::Store.connect
|
60
|
+
end
|
61
|
+
|
62
|
+
def setup_colors
|
63
|
+
return unless @base_config
|
64
|
+
colors = @base_config.colors.to_hash.inject({}) do |res, (color, value)|
|
65
|
+
unless color == :prefix
|
66
|
+
unless @base_config.colors.prefix.nil?
|
67
|
+
res[:"#{@base_config.colors.prefix}_#{color}"] = value
|
68
|
+
end
|
69
|
+
res[:"app_#{color}"] = value
|
70
|
+
end
|
71
|
+
res
|
72
|
+
end
|
73
|
+
Symbol.css_colors.merge!(colors)
|
74
|
+
end
|
38
75
|
end
|
39
76
|
|
40
77
|
def method_missing(name, *args, &block)
|
@@ -42,10 +79,13 @@ module MotionPrime
|
|
42
79
|
yield self[name]
|
43
80
|
else
|
44
81
|
name = name.to_s
|
45
|
-
if /(.+)
|
46
|
-
|
82
|
+
if /(.+)\=$/.match(name)
|
83
|
+
store($1, args[0])
|
84
|
+
elsif /(.+)\?$/.match(name)
|
85
|
+
value = self[$1]
|
86
|
+
value.present? && !!value
|
47
87
|
else
|
48
|
-
|
88
|
+
self[name]
|
49
89
|
end
|
50
90
|
end
|
51
91
|
end
|
data/motion-prime/env.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module MotionPrime
|
2
|
+
class Env
|
3
|
+
def env
|
4
|
+
ENV['PRIME_ENV'] || ENV['RUBYMOTION_ENV'] ||
|
5
|
+
(defined?(RUBYMOTION_ENV) && RUBYMOTION_ENV) ||
|
6
|
+
'development'
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_s
|
10
|
+
env
|
11
|
+
end
|
12
|
+
|
13
|
+
def inspect
|
14
|
+
env
|
15
|
+
end
|
16
|
+
|
17
|
+
def method_missing(name, *args, &block)
|
18
|
+
if /(.+)?$/.match(name.to_s)
|
19
|
+
env == name.to_s.gsub('?', '')
|
20
|
+
else
|
21
|
+
false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/motion-prime/prime.rb
CHANGED
@@ -12,7 +12,11 @@ module MotionPrime
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.env
|
15
|
-
|
15
|
+
@env ||= MotionPrime::Env.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.logger
|
19
|
+
@logger ||= MotionPrime::Logger.new
|
16
20
|
end
|
17
21
|
end
|
18
22
|
::Prime = MotionPrime unless defined?(::Prime)
|
@@ -6,31 +6,33 @@ module MotionPrime
|
|
6
6
|
|
7
7
|
class_attribute :level
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
end
|
9
|
+
def initialize
|
10
|
+
@default_level = Config.logger.level.nil? ? :info : Config.logger.level
|
11
|
+
end
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
def error(*args)
|
14
|
+
pp(*args) if LOGGER_ERROR_LEVEL <= current_level
|
15
|
+
end
|
17
16
|
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
def info(*args)
|
18
|
+
pp(*args) if LOGGER_INFO_LEVEL <= current_level
|
19
|
+
end
|
20
|
+
|
21
|
+
def debug(*args)
|
22
|
+
pp(*args) if LOGGER_DEBUG_LEVEL <= current_level
|
23
|
+
end
|
21
24
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
25
|
+
def current_level
|
26
|
+
current_level = self.class.level || @default_level
|
27
|
+
case current_level.to_s
|
28
|
+
when 'error'
|
29
|
+
LOGGER_ERROR_LEVEL
|
30
|
+
when 'info'
|
31
|
+
LOGGER_INFO_LEVEL
|
32
|
+
when 'debug'
|
33
|
+
LOGGER_DEBUG_LEVE
|
34
|
+
else
|
35
|
+
2
|
34
36
|
end
|
35
37
|
end
|
36
38
|
end
|
data/motion-prime/styles/form.rb
CHANGED
@@ -41,7 +41,7 @@ MotionPrime::Styles.define :base_form do
|
|
41
41
|
line_break_mode: :word_wrap,
|
42
42
|
number_of_lines: 0,
|
43
43
|
size_to_fit: true,
|
44
|
-
text_color:
|
44
|
+
text_color: :app_error,
|
45
45
|
font: proc { MotionPrime::Config.font.name.uifont(12) }
|
46
46
|
|
47
47
|
# available options for input:
|
@@ -105,9 +105,9 @@ MotionPrime::Styles.define :base_form do
|
|
105
105
|
|
106
106
|
style :field_input_with_errors,
|
107
107
|
layer: {
|
108
|
-
border_color:
|
108
|
+
border_color: :app_error
|
109
109
|
},
|
110
|
-
text_color:
|
110
|
+
text_color: :app_error
|
111
111
|
|
112
112
|
style :switch_field_input,
|
113
113
|
top: 10,
|
@@ -1,13 +1,13 @@
|
|
1
1
|
Prime::Styles.define :sidebar do
|
2
2
|
style :screen,
|
3
|
-
background_color:
|
3
|
+
background_color: :app_dark
|
4
4
|
|
5
5
|
style :table,
|
6
6
|
top: 150,
|
7
7
|
left: 0,
|
8
8
|
width: 320,
|
9
9
|
bottom: 0,
|
10
|
-
background_color:
|
10
|
+
background_color: :app_dark,
|
11
11
|
separator_color: :clear
|
12
12
|
|
13
13
|
style :table_cell,
|
@@ -20,4 +20,4 @@ Prime::Styles.define :sidebar do
|
|
20
20
|
width: 320,
|
21
21
|
font: proc { :system.uifont(20) },
|
22
22
|
size_to_fit: true
|
23
|
-
end
|
23
|
+
end
|
data/motion-prime/version.rb
CHANGED
@@ -39,8 +39,21 @@ module MotionPrime
|
|
39
39
|
include HasNormalizer
|
40
40
|
|
41
41
|
def define(*namespaces, &block)
|
42
|
-
|
43
|
-
|
42
|
+
@definition_blocks ||= []
|
43
|
+
namespaces = Array.wrap(namespaces)
|
44
|
+
if namespaces.any?
|
45
|
+
namespaces.each do |namespace|
|
46
|
+
@definition_blocks << {namespace: namespace, block: block}
|
47
|
+
end
|
48
|
+
else
|
49
|
+
@definition_blocks << {namespace: false, block: block}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def define!
|
54
|
+
@definition_blocks.each do |definition|
|
55
|
+
block = definition[:block]
|
56
|
+
self.new(definition[:namespace]).instance_eval(&block)
|
44
57
|
end
|
45
58
|
end
|
46
59
|
|
data/spec/config/store_spec.rb
CHANGED
@@ -35,6 +35,22 @@ describe MotionPrime::Config do
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
describe ":key_name?" do
|
39
|
+
it "returns true if there is value and it's not false" do
|
40
|
+
@config.foo = true
|
41
|
+
@config.foo?.should == true
|
42
|
+
end
|
43
|
+
|
44
|
+
it "returns false if there is value and it's false" do
|
45
|
+
@config.foo = false
|
46
|
+
@config.foo?.should == false
|
47
|
+
end
|
48
|
+
|
49
|
+
it "returns false if there is no value" do
|
50
|
+
@config.foo?.should == false
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
38
54
|
describe "class methods" do
|
39
55
|
it "should allow to set value for class" do
|
40
56
|
MotionPrime::Config.foo.nil?.should == true
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion-prime
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Iskander Haziev
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-01-
|
12
|
+
date: 2014-01-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -204,7 +204,6 @@ files:
|
|
204
204
|
- files/app/sections/sidebar/action.rb
|
205
205
|
- files/app/sections/sidebar/table.rb
|
206
206
|
- files/app/styles/home.rb
|
207
|
-
- files/app/styles/sidebar.rb
|
208
207
|
- files/resources/Default-568h@2x.png
|
209
208
|
- files/resources/Default.png
|
210
209
|
- files/resources/Default@2x.png
|
@@ -240,6 +239,7 @@ files:
|
|
240
239
|
- motion-prime/elements/text_field.rb
|
241
240
|
- motion-prime/elements/text_view.rb
|
242
241
|
- motion-prime/elements/view_with_section.rb
|
242
|
+
- motion-prime/env.rb
|
243
243
|
- motion-prime/helpers/has_authorization.rb
|
244
244
|
- motion-prime/helpers/has_class_factory.rb
|
245
245
|
- motion-prime/helpers/has_normalizer.rb
|
@@ -290,6 +290,7 @@ files:
|
|
290
290
|
- motion-prime/styles/_mixins.rb
|
291
291
|
- motion-prime/styles/base.rb
|
292
292
|
- motion-prime/styles/form.rb
|
293
|
+
- motion-prime/styles/sidebar.rb
|
293
294
|
- motion-prime/support/_key_value_store.rb
|
294
295
|
- motion-prime/support/_padding_attribute.rb
|
295
296
|
- motion-prime/support/mp_button.rb
|
@@ -313,6 +314,7 @@ files:
|
|
313
314
|
- spec/config/store_spec.rb
|
314
315
|
- spec/delegate/delegate_spec.rb
|
315
316
|
- spec/helpers/delegates.rb
|
317
|
+
- spec/helpers/init.rb
|
316
318
|
- spec/helpers/models.rb
|
317
319
|
- spec/helpers/screens.rb
|
318
320
|
- spec/models/associations_spec.rb
|
@@ -353,6 +355,7 @@ test_files:
|
|
353
355
|
- spec/config/store_spec.rb
|
354
356
|
- spec/delegate/delegate_spec.rb
|
355
357
|
- spec/helpers/delegates.rb
|
358
|
+
- spec/helpers/init.rb
|
356
359
|
- spec/helpers/models.rb
|
357
360
|
- spec/helpers/screens.rb
|
358
361
|
- spec/models/associations_spec.rb
|