her 0.5.5 → 0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +8 -8
  2. data/.gitignore +1 -1
  3. data/README.md +78 -63
  4. data/UPGRADE.md +21 -0
  5. data/lib/her/model.rb +2 -1
  6. data/lib/her/model/associations.rb +17 -54
  7. data/lib/her/model/associations/association.rb +46 -0
  8. data/lib/her/model/associations/belongs_to_association.rb +34 -0
  9. data/lib/her/model/associations/has_many_association.rb +43 -0
  10. data/lib/her/model/associations/has_one_association.rb +33 -0
  11. data/lib/her/model/attributes.rb +19 -19
  12. data/lib/her/model/base.rb +5 -0
  13. data/lib/her/model/http.rb +17 -21
  14. data/lib/her/model/orm.rb +11 -35
  15. data/lib/her/model/parse.rb +4 -12
  16. data/lib/her/model/paths.rb +3 -2
  17. data/lib/her/model/relation.rb +113 -0
  18. data/lib/her/version.rb +1 -1
  19. data/spec/model/associations_spec.rb +48 -4
  20. data/spec/model/introspection_spec.rb +1 -1
  21. data/spec/model/orm_spec.rb +21 -102
  22. data/spec/model/parse_spec.rb +36 -7
  23. data/spec/model/paths_spec.rb +3 -3
  24. data/spec/model/relation_spec.rb +89 -0
  25. data/spec/spec_helper.rb +1 -0
  26. data/spec/support/macros/her_macros.rb +17 -0
  27. data/spec/support/macros/request_macros.rb +19 -0
  28. metadata +13 -37
  29. data/examples/grape-and-her/.env.default +0 -3
  30. data/examples/grape-and-her/Procfile +0 -2
  31. data/examples/grape-and-her/README.md +0 -27
  32. data/examples/grape-and-her/api/Gemfile +0 -11
  33. data/examples/grape-and-her/api/Rakefile +0 -14
  34. data/examples/grape-and-her/api/app/api.rb +0 -49
  35. data/examples/grape-and-her/api/app/models/organization.rb +0 -7
  36. data/examples/grape-and-her/api/app/models/user.rb +0 -9
  37. data/examples/grape-and-her/api/app/views/organizations/_base.rabl +0 -2
  38. data/examples/grape-and-her/api/app/views/organizations/index.rabl +0 -3
  39. data/examples/grape-and-her/api/app/views/organizations/show.rabl +0 -3
  40. data/examples/grape-and-her/api/app/views/users/_base.rabl +0 -8
  41. data/examples/grape-and-her/api/app/views/users/index.rabl +0 -3
  42. data/examples/grape-and-her/api/app/views/users/show.rabl +0 -3
  43. data/examples/grape-and-her/api/config.ru +0 -5
  44. data/examples/grape-and-her/api/config/boot.rb +0 -17
  45. data/examples/grape-and-her/api/config/unicorn.rb +0 -7
  46. data/examples/grape-and-her/api/db/migrations/001_create_users.rb +0 -11
  47. data/examples/grape-and-her/api/db/migrations/002_create_organizations.rb +0 -8
  48. data/examples/grape-and-her/consumer/Gemfile +0 -23
  49. data/examples/grape-and-her/consumer/app/assets/stylesheets/application.scss +0 -190
  50. data/examples/grape-and-her/consumer/app/assets/stylesheets/reset.scss +0 -53
  51. data/examples/grape-and-her/consumer/app/consumer.rb +0 -74
  52. data/examples/grape-and-her/consumer/app/models/organization.rb +0 -13
  53. data/examples/grape-and-her/consumer/app/models/user.rb +0 -13
  54. data/examples/grape-and-her/consumer/app/views/index.haml +0 -9
  55. data/examples/grape-and-her/consumer/app/views/layout.haml +0 -20
  56. data/examples/grape-and-her/consumer/app/views/organizations/index.haml +0 -25
  57. data/examples/grape-and-her/consumer/app/views/organizations/show.haml +0 -11
  58. data/examples/grape-and-her/consumer/app/views/users/index.haml +0 -33
  59. data/examples/grape-and-her/consumer/app/views/users/show.haml +0 -9
  60. data/examples/grape-and-her/consumer/config.ru +0 -20
  61. data/examples/grape-and-her/consumer/config/boot.rb +0 -30
  62. data/examples/grape-and-her/consumer/config/unicorn.rb +0 -7
  63. data/examples/grape-and-her/consumer/lib/response_logger.rb +0 -18
@@ -1,25 +0,0 @@
1
- %h2 Create new organization
2
-
3
- %form{ url: "/organizations", method: 'post' }
4
- - if @organization.response_errors.any?
5
- %ul.errors
6
- %p The organization could not be created:
7
- %ul
8
- - @organization.response_errors.each do |error|
9
- %li= error
10
-
11
- %p
12
- %label{ for: 'name' } Name
13
- %input{ type: 'text', name: 'organization[name]', value: @organization.name, id: 'name' }
14
- %p
15
- %button{ type: 'submit' } Create
16
-
17
- %hr
18
- %h3 Current organizations
19
- - if @organizations.any?
20
- %ul.records
21
- - @organizations.each do |organization|
22
- %li
23
- %a{ href: "/organizations/#{organization.id}" }= organization.name
24
- - else
25
- %p.no-records There are currently no organizations.
@@ -1,11 +0,0 @@
1
- %h1= @organization.name
2
-
3
- %h2 Users
4
- %ul.details
5
- - @organization.users.each do |user|
6
- %li
7
- %a{ href: "/users/#{user.id}" }= user.fullname
8
-
9
- %hr
10
- .back
11
- %p Back to <a href="/organizations">organizations</a>
@@ -1,33 +0,0 @@
1
- %h2 Create new user
2
-
3
- %form{ url: "/users", method: 'post' }
4
- - if @user.response_errors.any?
5
- .errors
6
- %p The user could not be created:
7
- %ul
8
- - @user.response_errors.each do |error|
9
- %li= error
10
-
11
- %p
12
- %label{ for: 'email' } Email
13
- %input{ type: 'email', name: 'user[email]', value: @user.email, id: 'email' }
14
- %p
15
- %label{ for: 'fullname' } Full Name
16
- %input{ type: 'text', name: 'user[fullname]', value: @user.fullname, id: 'fullname' }
17
- %p
18
- %label{ for: 'organization_id' } Organization
19
- %select{ name: 'user[organization_id]', id: 'organization_id' }
20
- - Organization.all.each do |organization|
21
- %option{ value: organization.id }= organization.name
22
- %p
23
- %button{ type: 'submit' } Create
24
-
25
- %hr
26
- %h3 Current users
27
- - if @users.any?
28
- %ul.records
29
- - @users.each do |user|
30
- %li
31
- %a{ href: "/users/#{user.id}" }= user.fullname
32
- - else
33
- %p.no-records There are currently no users.
@@ -1,9 +0,0 @@
1
- %h1= @user.fullname
2
-
3
- %ul.details
4
- %li <strong>Email:</strong> #{@user.email}
5
- %li <strong>Organization:</strong> <a href="/organizations/#{@user.organization_id}">#{@user.organization.name}</a>
6
-
7
- %hr
8
- .back
9
- %p Back to <a href="/users">users</a>
@@ -1,20 +0,0 @@
1
- require File.expand_path('../config/boot', __FILE__)
2
-
3
- map "/assets" do
4
- sprockets = Sprockets::Environment.new.tap do |s|
5
- s.append_path File.join(File.dirname(__FILE__), 'app', 'assets', 'stylesheets')
6
- s.append_path File.join(File.dirname(__FILE__), 'app', 'assets', 'images')
7
-
8
- Sprockets::Helpers.configure do |config|
9
- config.environment = s
10
- config.prefix = "/assets"
11
- config.digest = true
12
- end
13
- end
14
-
15
- run sprockets
16
- end
17
-
18
- map "/" do
19
- run Consumer
20
- end
@@ -1,30 +0,0 @@
1
- # Bundler setup
2
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
3
- require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
4
- Bundler.require(:default, ENV['RACK_ENV']) if defined? Bundler
5
-
6
- # Require libraries
7
- Dir[File.expand_path('../../lib/**/*.rb', __FILE__)].each do |file|
8
- dirname = File.dirname(file)
9
- file_basename = File.basename(file, File.extname(file))
10
- require "#{dirname}/#{file_basename}"
11
- end
12
-
13
- # Configure Her
14
- Her::API.setup :url => "http://0.0.0.0:3100" do |c|
15
- c.use Faraday::Request::UrlEncoded
16
- c.use Her::Middleware::DefaultParseJSON
17
- c.use ResponseBodyLogger, $logger
18
- c.use Faraday::Response::Logger, $logger
19
- c.use Faraday::Adapter::NetHttp
20
- end
21
-
22
- # Require models
23
- Dir[File.expand_path('../../app/models/**/*.rb', __FILE__)].each do |file|
24
- dirname = File.dirname(file)
25
- file_basename = File.basename(file, File.extname(file))
26
- require "#{dirname}/#{file_basename}"
27
- end
28
-
29
- # Application setup
30
- require File.expand_path('../../app/consumer', __FILE__)
@@ -1,7 +0,0 @@
1
- if ENV["RACK_ENV"] == "development"
2
- worker_processes 1
3
- else
4
- worker_processes 4
5
- end
6
-
7
- timeout 30
@@ -1,18 +0,0 @@
1
- require 'stringio'
2
- require 'logger'
3
-
4
- class ResponseBodyLogger < Faraday::Response::Middleware
5
- def initialize(app, logger)
6
- @app = app
7
- @logger = logger
8
- end
9
-
10
- def on_complete(env)
11
- @logger.info ""
12
- @logger.info env[:body]
13
- @logger.info "\n"
14
- end
15
- end
16
-
17
- $strio = StringIO.new
18
- $logger = Logger.new($strio).tap { |logger| logger.formatter = proc { |severity, datetime, progname, msg| "#{msg}\n" } }