daengine 0.6.16 → 0.6.17

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: be941fa075d96ebe4ee85610fd0563907f8c1ff0
4
- data.tar.gz: dc26c4412fabc9f45338fac32dc0bf7bb81894d7
3
+ metadata.gz: fc3d0461ac1c9337ae22dbdf014261e342f8ff2d
4
+ data.tar.gz: db9e2cb957aed90668d113cde843e1cd66d05e3a
5
5
  SHA512:
6
- metadata.gz: b4c300c613aa619b193c91c603f372d48f2bc1fdf63fbe30f8fd802c1812854ce31ecab0de42b9761d96b4449c915e8afeadb623849755b7b457cd63cb46ef6a
7
- data.tar.gz: 6ebeafeab9bd53bec379713ffb22b916aaa788af04717002a33e8691a45b4a87b42306a9ad082c52bcf94c7db9e3a0037a5c37dfea674ed8dec93076cef1af77
6
+ metadata.gz: 3ec076eec326d72752ce4de5b7b2764257d7581ade1380ec116f23ef4594946b0b07dd9b64bdb72153e9b6e4bf2ac031f431a19112990e09f245624e1cf609f5
7
+ data.tar.gz: 772e62c3bc2a8141a54d416f5c70bbe9271736b7143605b7f3d4a73482ce70cb69d5c44e1cfe5942958e8f43c592fe5e7d461b772506f59b7bd8b68a4fcc1e55
@@ -0,0 +1,30 @@
1
+ class ContentFolderController < ApplicationController
2
+ respond_to :json
3
+
4
+ rescue_from 'Mongoid::Errors::DocumentNotFound' do |exception|
5
+ render json: {errors: [exception.message]}, status: 404
6
+ end
7
+
8
+ # GET /content_folder
9
+ # GET /content_folder.json
10
+ def index
11
+ content_folder = ContentFolder.last
12
+ if content_folder.nil?
13
+ render json: {}, status: :not_found
14
+ else
15
+ render json: content_folder
16
+ end
17
+ end
18
+
19
+ # POST /content_folder
20
+ # POST /content_folder.json
21
+ def create
22
+ content_folder = ContentFolder.new(params[:content_folder])
23
+ ContentFolder.delete_all # TODO: need to validate prior to delete
24
+ if content_folder.save
25
+ render json: content_folder, status: :created
26
+ else
27
+ render json: content_folder.errors, status: :unprocessable_entity
28
+ end
29
+ end
30
+ end
@@ -48,12 +48,12 @@ class DigitalAssetsController < ApplicationController
48
48
  end
49
49
 
50
50
  def updated_time
51
- ids = params[:ids]
52
- updated_time = Hash.new
53
- ids.each do |id|
54
- da = DigitalAsset.where(:digital_asset_id => id)
55
- updated_time[id] = da[0].doc_changed_at if da.present?
51
+ if(params[:ids].present?)
52
+ assets = DigitalAsset.where(:digital_asset_id.in => params[:ids])
53
+ else
54
+ assets = DigitalAsset.all
56
55
  end
56
+ updated_time = Hash[assets.map{|a| [a.digital_asset_id, a.doc_changed_at]}]
57
57
  render json: updated_time.to_json, status: :ok
58
58
  end
59
59
 
@@ -0,0 +1,49 @@
1
+ require 'mongoid'
2
+
3
+ class ContentFolder
4
+ include Mongoid::Document
5
+ #include Mongoid::Timestamps
6
+
7
+ field :folder_id, type: String
8
+ field :label, type: String
9
+ field :document_ids, type: Array, default: []
10
+
11
+ #recursively_embeds_many
12
+ embeds_many :child_folders, :class_name => "ContentFolder", :cyclic => true
13
+ accepts_nested_attributes_for :child_folders
14
+
15
+ key :folder_id
16
+
17
+ validates_presence_of :folder_id, :label
18
+ validate :validate_has_content
19
+
20
+ def validate_has_content
21
+ if child_folders.empty? && (document_ids.nil? || document_ids.empty?)
22
+ errors[:base] << 'Either child_folders or document_ids are required'
23
+ end
24
+ end
25
+
26
+ def self.lit_center_folder
27
+ find_folder(FolderIds::LIT_CENTER)
28
+ end
29
+
30
+ def self.merrill_lynch_folder
31
+ find_folder(FolderIds::MERRILL_LYNCH)
32
+ end
33
+
34
+ def self.plan_529_folder
35
+ find_folder(FolderIds::PLANS_529)
36
+ end
37
+
38
+ def self.find_folder(id)
39
+ root = ContentFolder.last
40
+ child_folders = root.nil? ? [] : Array(root.child_folders)
41
+ child_folders.find { |folder| id == folder.folder_id } unless child_folders.nil?
42
+ end
43
+ end
44
+
45
+ class ContentFolder::FolderIds
46
+ LIT_CENTER = 'lit_center'
47
+ MERRILL_LYNCH = 'merrill_lynch'
48
+ PLANS_529 = '529'
49
+ end
data/config/routes.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  Rails.application.routes.draw do
2
- resources :digital_assets, except: [:new, :edit], defaults: {format: 'json'} do
2
+ resources :digital_assets, except: [:new, :edit], defaults: {format: 'json'} do
3
3
  collection do
4
4
  get 'fund_docs'
5
5
  get 'search', to: 'digital_assets#search'
@@ -7,4 +7,6 @@ Rails.application.routes.draw do
7
7
  post 'updated_time'
8
8
  end
9
9
  end
10
+
11
+ resources :content_folder, only: [:index, :create], defaults: {format: 'json'}
10
12
  end
@@ -1,3 +1,3 @@
1
1
  module Daengine
2
- VERSION = "0.6.16"
2
+ VERSION = "0.6.17"
3
3
  end
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+ require 'rspec_api_documentation'
3
+ require 'rspec_api_documentation/dsl'
4
+ require 'securerandom'
5
+
6
+ resource 'Content Folder', :api => true do
7
+ get '/content_folder' do
8
+ context 'has a content folder' do
9
+ example 'returns the content folder' do
10
+ folder_id = 'folder id'
11
+ folder = ContentFolder.new(:folder_id => folder_id, :label => 'folder label', :document_ids => %w(id1 id2))
12
+ ContentFolder.stub(:last).and_return(folder)
13
+
14
+ do_request
15
+ expect(status).to eq(200)
16
+ result = JSON.parse(response_body)
17
+ expect(result).not_to be_nil
18
+ expect(result['folder_id']).to eq(folder_id)
19
+ end
20
+
21
+ example 'returns 404 when the folder does not exist' do
22
+ ContentFolder.stub(:last).and_return(nil)
23
+
24
+ do_request
25
+ expect(status).to eq(404)
26
+ end
27
+ end
28
+ end
29
+
30
+ post '/content_folder' do
31
+ parameter :folder_id, 'folder id', :require => true, :scope => 'content_folder'
32
+ parameter :label, 'folder label', :require => true, :scope => 'content_folder'
33
+ parameter :document_ids, 'array of document ids associated with folder', :require => true, :scope => 'content_folder'
34
+ parameter :child_folders, 'array of child folder hashes', :require => true, :scope => 'content_folder'
35
+
36
+ context 'successful' do
37
+ folder_id = 'folder id'
38
+ label = 'label'
39
+ document_ids = %w(id1 id2)
40
+ child_folders = nil
41
+
42
+ let(:folder_id) { folder_id }
43
+ let(:label) { label }
44
+ let(:document_ids) { document_ids }
45
+ let(:child_folders) { [{:folder_id => 'child folder id', :label => 'child label', :document_ids => document_ids}] }
46
+
47
+ example 'stores the content folder and returns the content folder instance' do
48
+ do_request
49
+ expect(status).to eq(201)
50
+ result = JSON.parse(response_body)
51
+ expect(result).not_to be_nil
52
+ end
53
+ end
54
+
55
+ context 'missing required values' do
56
+ folder_id = 'folder id'
57
+ label = 'label'
58
+ document_ids = nil
59
+ child_folders = nil
60
+
61
+ let(:folder_id) { folder_id }
62
+ let(:label) { label }
63
+ let(:document_ids) { document_ids }
64
+ let(:child_folders) { child_folders }
65
+
66
+ example 'returns status 422 when missing document id and child_folders' do
67
+ do_request
68
+ expect(status).to eq(422)
69
+ end
70
+ end
71
+ end
72
+ end
data/spec/factories.rb CHANGED
@@ -37,4 +37,22 @@ FactoryGirl.define do
37
37
  fund_codes []
38
38
  display_on_website true
39
39
  end
40
+
41
+ factory :content_folder, aliases: [:child_folder] do
42
+ sequence(:folder_id) { |n| "id-content-folder-#{n}" }
43
+ label 'Folder Label'
44
+
45
+ trait :document_ids do
46
+ document_ids ['doc_id1', 'doc_id2']
47
+ end
48
+
49
+ factory :content_folder_with_child_folders do
50
+ sequence(:folder_id) { |n| "id-content-folder-#{n}" }
51
+ label 'Root Label'
52
+
53
+ child_folders { build_list(:content_folder, 1, document_ids: ['child_doc_id']) }
54
+ end
55
+
56
+ factory :content_folder_with_document_ids, traits: [:document_ids]
57
+ end
40
58
  end
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe ContentFolder do
4
+
5
+ context 'fields' do
6
+ subject { FactoryGirl.build :content_folder }
7
+
8
+ let(:defined_fields) {
9
+ [:folder_id, :label, :document_ids, :child_folders]
10
+ }
11
+ it 'has all defined fields' do
12
+ defined_fields.each { |f| should respond_to(f) }
13
+ end
14
+ end
15
+
16
+ context 'validation' do
17
+ subject { FactoryGirl.build :content_folder_with_document_ids }
18
+ let(:basic_subject) { FactoryGirl.build :content_folder }
19
+ let(:subject_with_folders) { FactoryGirl.build :content_folder_with_child_folders }
20
+
21
+ required_fields = [:folder_id, :label]
22
+ required_fields.each do |f|
23
+ it "validates #{f} is required" do
24
+ should be_valid
25
+ subject.send("#{f}=", nil)
26
+ should be_invalid "should be invalid if #{f} is missing"
27
+ end
28
+ end
29
+
30
+ it 'cannot have empty child_folders AND document_ids' do
31
+ basic_subject.should be_invalid
32
+ end
33
+
34
+ it 'is valid when document_ids are present' do
35
+ subject.should be_valid
36
+ end
37
+
38
+ it 'is valid when child_folders are present' do
39
+ subject_with_folders.should be_valid
40
+ end
41
+ end
42
+
43
+ context 'selectors' do
44
+ subject { FactoryGirl.build :content_folder_with_document_ids }
45
+
46
+ # TODO: add tests for known ids
47
+ end
48
+
49
+ context 'db operations' do
50
+ let(:subject_with_folders) { FactoryGirl.build :content_folder_with_child_folders }
51
+
52
+ it 'saves and can be retrieved' do
53
+ id = subject_with_folders.folder_id
54
+ subject_with_folders.save
55
+ found = ContentFolder.find(id)
56
+ found.should_not be_nil
57
+ end
58
+ end
59
+
60
+ context 'folder retrieval' do
61
+ before do
62
+ ContentFolder.delete_all
63
+ root = FactoryGirl.build :content_folder_with_document_ids
64
+ lit_center = FactoryGirl.build :content_folder_with_document_ids, :folder_id => ContentFolder::FolderIds::LIT_CENTER
65
+ merrill_lynch = FactoryGirl.build :content_folder_with_document_ids, :folder_id => ContentFolder::FolderIds::MERRILL_LYNCH
66
+ plan_529 = FactoryGirl.build :content_folder_with_document_ids, :folder_id => ContentFolder::FolderIds::PLANS_529
67
+ other = FactoryGirl.build :content_folder_with_document_ids, :folder_id => 'abcdefg'
68
+ root.child_folders = [lit_center, merrill_lynch, plan_529, other]
69
+ root.save
70
+ end
71
+
72
+ it 'should return the lit center folder' do
73
+ result = ContentFolder.lit_center_folder
74
+ result.should_not be_nil
75
+ result.folder_id.should == ContentFolder::FolderIds::LIT_CENTER
76
+ end
77
+
78
+ it 'should return the merrill lynch folder' do
79
+ result = ContentFolder.merrill_lynch_folder
80
+ result.should_not be_nil
81
+ result.folder_id.should == ContentFolder::FolderIds::MERRILL_LYNCH
82
+ end
83
+
84
+ it 'should return the 529 folder' do
85
+ result = ContentFolder.plan_529_folder
86
+ result.should_not be_nil
87
+ result.folder_id.should == ContentFolder::FolderIds::PLANS_529
88
+ end
89
+
90
+ it 'should return nil for an unknown folder' do
91
+ result = ContentFolder.find_folder('zyxw')
92
+ result.should be_nil
93
+ end
94
+ end
95
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: daengine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.16
4
+ version: 0.6.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - sbhatia
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-26 00:00:00.000000000 Z
12
+ date: 2014-03-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -147,8 +147,10 @@ executables:
147
147
  extensions: []
148
148
  extra_rdoc_files: []
149
149
  files:
150
+ - app/controllers/content_folder_controller.rb
150
151
  - app/controllers/digital_assets_controller.rb
151
152
  - app/helpers/digital_assets_helper.rb
153
+ - app/models/content_folder.rb
152
154
  - app/models/content_service_resource.rb
153
155
  - app/models/digital_asset.rb
154
156
  - app/models/service_digital_asset.rb
@@ -177,6 +179,7 @@ files:
177
179
  - Gemfile
178
180
  - spec/factories.rb
179
181
  - spec/spec_helper.rb
182
+ - spec/acceptance/content_folder_controller_spec.rb
180
183
  - spec/acceptance/digital_assets_spec.rb
181
184
  - spec/controllers/digital_assets_controller_spec.rb
182
185
  - spec/dummy/config.ru
@@ -236,6 +239,7 @@ files:
236
239
  - spec/mock_data/digitalAssets/TEST_FINRA_DOC.doc
237
240
  - spec/mock_data/taxonomy/taxonomy.xml
238
241
  - spec/mock_data/taxonomy/taxonomyengine.yml
242
+ - spec/models/content_folder_spec.rb
239
243
  - spec/models/digital_asset_spec.rb
240
244
  - spec/models/service_digital_asset_spec.rb
241
245
  - spec/service/digital_asset_lookup_service_spec.rb
@@ -268,6 +272,7 @@ summary: Daengine GEM.
268
272
  test_files:
269
273
  - spec/factories.rb
270
274
  - spec/spec_helper.rb
275
+ - spec/acceptance/content_folder_controller_spec.rb
271
276
  - spec/acceptance/digital_assets_spec.rb
272
277
  - spec/controllers/digital_assets_controller_spec.rb
273
278
  - spec/dummy/config.ru
@@ -327,6 +332,7 @@ test_files:
327
332
  - spec/mock_data/digitalAssets/TEST_FINRA_DOC.doc
328
333
  - spec/mock_data/taxonomy/taxonomy.xml
329
334
  - spec/mock_data/taxonomy/taxonomyengine.yml
335
+ - spec/models/content_folder_spec.rb
330
336
  - spec/models/digital_asset_spec.rb
331
337
  - spec/models/service_digital_asset_spec.rb
332
338
  - spec/service/digital_asset_lookup_service_spec.rb