daengine 0.6.16 → 0.6.17

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.
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