Skip to content

Commit

Permalink
Merge pull request #49 from OneraHub/ft-mdajson
Browse files Browse the repository at this point in the history
export analysis in pushable json format
  • Loading branch information
relf committed Sep 23, 2020
2 parents 6b28b8d + d8c999f commit a22c4ed
Show file tree
Hide file tree
Showing 10 changed files with 116 additions and 5 deletions.
2 changes: 2 additions & 0 deletions app/controllers/api/v1/exports_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ def new
Rails.logger.warn "CMDOWS export warning: #{e}"
end
send_data content, filename: filename, type: "application/xml"
elsif format == "mdajson"
json_response mda, :ok, serializer: AnalysisAttrsSerializer
else
json_response({ message: "Export format #{format} not knwon" }, :bad_request)
end
Expand Down
19 changes: 19 additions & 0 deletions app/lib/whats_opt/mdajson_generator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# frozen_string_literal: true

require "json"

module WhatsOpt
class MdajsonGenerator

def initialize(mda)
@mda = mda
end

def generate
as_json = AnalysisAttrsSerializer.new(@mda).as_json

as_json.to_json
end

end
end
5 changes: 4 additions & 1 deletion app/models/analysis.rb
Original file line number Diff line number Diff line change
Expand Up @@ -659,9 +659,12 @@ def ensure_ancestry_for_sub_analyses
def self.create_nested_analyses(mda_attrs)
# Rails.logger.info "################ CREATE NESTED #{mda_attrs["name"]}"
subs = []
# create sub analyses
# manage metamodel and sub analyses
if mda_attrs["disciplines_attributes"]
mda_attrs["disciplines_attributes"].each.with_index do |disc, i|
# when creating an analysis from params, just disable metamodel
# and set a regular discipline instead
disc["type"] == Discipline::DISCIPLINE if disc["type"] == Discipline::METAMODEL
if disc["sub_analysis_attributes"]
subs << self.create_nested_analyses(disc["sub_analysis_attributes"])
disc.delete("sub_analysis_attributes")
Expand Down
19 changes: 19 additions & 0 deletions app/serializers/analysis_attrs_serializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# frozen_string_literal: true

class AnalysisAttrsSerializer < ActiveModel::Serializer
attributes :name, :disciplines_attributes

def disciplines_attributes
object.disciplines.map { |disc|
if disc.type == Discipline::ANALYSIS
{
"name" => disc.name,
"type" => disc.type,
"sub_analysis_attributes": AnalysisAttrsSerializer.new(disc.sub_analysis)
}
else
DisciplineAttrsSerializer.new(disc)
end
}.compact
end
end
7 changes: 7 additions & 0 deletions app/serializers/discipline_attrs_serializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# frozen_string_literal: true

class DisciplineAttrsSerializer < ActiveModel::Serializer
attributes :name, :type

has_many :variables, key: :variables_attributes
end
23 changes: 19 additions & 4 deletions db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,13 @@
t.index ["ancestry"], name: "index_analyses_on_ancestry"
end

create_table "analyses_design_projects", id: false, force: :cascade do |t|
t.integer "design_project_id", null: false
t.integer "analysis_id", null: false
t.index ["analysis_id", "design_project_id"], name: "index_analysis_id_design_project_id"
t.index ["design_project_id", "analysis_id"], name: "index_design_project_id_analysis_id"
end

create_table "analysis_disciplines", force: :cascade do |t|
t.integer "discipline_id"
t.integer "analysis_id"
Expand Down Expand Up @@ -80,6 +87,15 @@
t.text "values"
end

create_table "components", force: :cascade do |t|
t.integer "discipline_id"
t.boolean "has_derivatives", default: false
t.boolean "is_implicit", default: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["discipline_id"], name: "index_components_on_discipline_id"
end

create_table "connections", force: :cascade do |t|
t.integer "from_id"
t.integer "to_id"
Expand Down Expand Up @@ -208,9 +224,9 @@
end

create_table "parameters", force: :cascade do |t|
t.text "init"
t.text "lower"
t.text "upper"
t.string "init", default: ""
t.string "lower", default: ""
t.string "upper", default: ""
t.integer "variable_id"
end

Expand Down Expand Up @@ -295,7 +311,6 @@
t.index ["discipline_id"], name: "index_variables_on_discipline_id"
end

add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
add_foreign_key "analysis_disciplines", "analyses"
add_foreign_key "analysis_disciplines", "disciplines"
end
28 changes: 28 additions & 0 deletions test/controllers/api/v1/exports_controller_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# frozen_string_literal: true

require "test_helper"

class Api::V1::ExportsControllerTest < ActionDispatch::IntegrationTest
setup do
@auth_headers = { "Authorization" => "Token " + TEST_API_KEY }
@mda = analyses(:cicav)
end

test "should dump analysis as json" do
get api_v1_mda_exports_new_url(@mda, format: :mdajson), as: :json, headers: @auth_headers
assert_response :success
resp = JSON.parse(response.body)
expected = sample_file("cicav_mda.json").read.chomp
assert_equal expected, resp.to_json.to_s
end

test "should dump nested analysis as json" do
mda = analyses(:outermda)
get api_v1_mda_exports_new_url(mda, format: :mdajson), as: :json, headers: @auth_headers
assert_response :success
resp = JSON.parse(response.body)
expected = sample_file("outer_mda.json").read.chomp
assert_equal expected, resp.to_json.to_s
end

end
1 change: 1 addition & 0 deletions test/fixtures/cicav_mda.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"CICAV","disciplines_attributes":[{"name":"__DRIVER__","type":"null_driver","variables_attributes":[{"name":"obj","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"x1","io_mode":"out","shape":"1","type":"Float","active":true,"parameter_attributes":{"init":"3.14","lower":"1","upper":"10"},"distributions_attributes":[]},{"name":"y2","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"z","io_mode":"out","shape":"(2,)","type":"Float","active":true,"parameter_attributes":{"init":"3.14","lower":"1","upper":"10"},"distributions_attributes":[]}]},{"name":"Geometry","type":"analysis","variables_attributes":[{"name":"obj","io_mode":"out","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"x1","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"ya","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"yg","io_mode":"out","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"z","io_mode":"in","shape":"(2,)","type":"Float","active":true,"distributions_attributes":[]}]},{"name":"Aerodynamics","type":"analysis","variables_attributes":[{"name":"y2","io_mode":"out","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"ya","io_mode":"out","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"yg","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"z","io_mode":"in","shape":"(2,)","type":"Float","active":true,"distributions_attributes":[]}]},{"name":"Propulsion","type":"analysis","variables_attributes":[]}]}
1 change: 1 addition & 0 deletions test/fixtures/outer_mda.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"OUTER","disciplines_attributes":[{"name":"__DRIVER__","type":"null_driver","variables_attributes":[{"name":"x1","io_mode":"out","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"x2","io_mode":"out","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"y","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"y1","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"y2","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"z","io_mode":"out","shape":"1","type":"Float","active":true,"distributions_attributes":[]}]},{"name":"Disc","type":"analysis","variables_attributes":[{"name":"x1","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"y1","io_mode":"out","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"y2","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"z","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]}]},{"name":"InnerMdaDiscipline","type":"mda","sub_analysis_attributes":{"name":"INNER","disciplines_attributes":[{"name":"__DRIVER__","type":"null_driver","variables_attributes":[{"name":"x2","io_mode":"out","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"y","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"y1","io_mode":"out","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"y2","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"z","io_mode":"out","shape":"1","type":"Float","active":true,"distributions_attributes":[]}]},{"name":"PlainDiscipline","type":"analysis","variables_attributes":[{"name":"x2","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"y","io_mode":"out","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"y1","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"y2","io_mode":"out","shape":"1","type":"Float","active":true,"distributions_attributes":[]},{"name":"z","io_mode":"in","shape":"1","type":"Float","active":true,"distributions_attributes":[]}]}]}},{"name":"VacantDiscipline","type":"analysis","variables_attributes":[]}]}
16 changes: 16 additions & 0 deletions test/lib/whats_opt/mdajson_generator_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# frozen_string_literal: true

require "test_helper"

class MdajsonGeneratorTest < ActiveSupport::TestCase
def setup
@mda = analyses(:cicav)
@jsongen = WhatsOpt::MdajsonGenerator.new(@mda)
end

test "should generate mda json" do
content = @jsongen.generate
expected = sample_file("cicav_mda.json").read.chomp
assert_equal expected, content
end
end

0 comments on commit a22c4ed

Please sign in to comment.