From db0df44a929c9af96a40432b27fa6b664c03ee94 Mon Sep 17 00:00:00 2001 From: "E. P. Moffatt" Date: Mon, 6 Mar 2017 16:58:53 +0000 Subject: [PATCH 1/5] =?UTF-8?q?=E2=80=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jekylldocs/_includes/footerbar.html | 13 --- .../jekylldocs/assets/css/bootstrap.css | 6 +- .../jekylldocs/assets/img/Artboard 1.svg | 1 + .../jekylldocs/assets/img/Artboard 1@0.5x.png | Bin 0 -> 25022 bytes .../composer-website/jekylldocs/index.html | 85 ++++++++---------- 5 files changed, 41 insertions(+), 64 deletions(-) create mode 100644 packages/composer-website/jekylldocs/assets/img/Artboard 1.svg create mode 100644 packages/composer-website/jekylldocs/assets/img/Artboard 1@0.5x.png diff --git a/packages/composer-website/jekylldocs/_includes/footerbar.html b/packages/composer-website/jekylldocs/_includes/footerbar.html index e910e81731..dffc819ca4 100644 --- a/packages/composer-website/jekylldocs/_includes/footerbar.html +++ b/packages/composer-website/jekylldocs/_includes/footerbar.html @@ -6,16 +6,6 @@ diff --git a/packages/composer-website/jekylldocs/assets/css/bootstrap.css b/packages/composer-website/jekylldocs/assets/css/bootstrap.css index a2041bcdf6..8be745e994 100644 --- a/packages/composer-website/jekylldocs/assets/css/bootstrap.css +++ b/packages/composer-website/jekylldocs/assets/css/bootstrap.css @@ -4340,7 +4340,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { background-image: none; } } -@media (min-width: 768px) { +@media (min-width: 100px) { .navbar-nav { float: left; margin: 0; @@ -4475,10 +4475,10 @@ select[multiple].input-group-sm > .input-group-btn > .btn { } .navbar-right { float: right !important; - margin-right: -15px; + margin-right: 0px; } .navbar-right ~ .navbar-right { - margin-right: 0; + margin-right: 0px; } } .navbar-default { diff --git a/packages/composer-website/jekylldocs/assets/img/Artboard 1.svg b/packages/composer-website/jekylldocs/assets/img/Artboard 1.svg new file mode 100644 index 0000000000..b8487e61b9 --- /dev/null +++ b/packages/composer-website/jekylldocs/assets/img/Artboard 1.svg @@ -0,0 +1 @@ +Artboard 1 \ No newline at end of file diff --git a/packages/composer-website/jekylldocs/assets/img/Artboard 1@0.5x.png b/packages/composer-website/jekylldocs/assets/img/Artboard 1@0.5x.png new file mode 100644 index 0000000000000000000000000000000000000000..3a626fdf733075c254959ca15fe1ee37241b4989 GIT binary patch literal 25022 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

asu*0RooDN78ODVDPiUSaR)8L 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 literal 0 HcmV?d00001 diff --git a/packages/composer-website/jekylldocs/index.html b/packages/composer-website/jekylldocs/index.html index f31daad42a..e4a1eca75b 100644 --- a/packages/composer-website/jekylldocs/index.html +++ b/packages/composer-website/jekylldocs/index.html @@ -86,27 +86,35 @@

-
-
-
-

Fabric Composer

+
+
+
+

Fabric Composer

+
+ +
+

A modern, Open Source programming model and toolset to accelerate building blockchain applications.

+
+ +
+ +
+ +
+
+ Conga Blocks: the Fabric Composer mascot!
- -
-

Build business networks, applications and integration with Hyperledger Fabric blockchain

+
+

The Problem

+

Traditionally blockchain development has been hard. It has required learning arcane terminology and working with low-level remote procedure call interfaces... not to mention learning a new programming language! That's why we created Fabric Composer.

+
+
+

Our Solution

+

Fabric Composer is a modern programming model and toolset that lets you use Javascript to develop applications that go from the web-browser all the way back to the blockchain. We also play well with others: Atom and VSCode editors, GitHub, npm, Travis CI, Jenkins, Docker...

+
- -
- - -
-
-
-

- Compose Something Now -

-
+
@@ -129,48 +137,27 @@

Learn Before You Leap

- +
+
- - - -
- - - - - - - - - - - + -
+
+ From 1924783842231436a5a493a60a63fb6e21127020 Mon Sep 17 00:00:00 2001 From: "E. P. Moffatt" Date: Tue, 7 Mar 2017 17:23:30 +0000 Subject: [PATCH 2/5] favicon improvement --- .../composer-website/jekylldocs/favicon.ico | Bin 5430 -> 15086 bytes 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 packages/composer-website/jekylldocs/favicon.ico diff --git a/packages/composer-website/jekylldocs/favicon.ico b/packages/composer-website/jekylldocs/favicon.ico old mode 100755 new mode 100644 index 248e7b283a2894a195de365308eba725d05113e7..4fcebaee6a3d18824129ea4d4767b8fa427a9613 GIT binary patch literal 15086 zcmd5@33!y%xgJ34QVS6TQNVzJAfPO=2xKyu%p{p4lRc1qpO6i*@B2#jjqGGk2#bOU zBD5|o+FJLE+I#EM_SVbQK6tfO5euR+|99W-pZSL&1PEFBbRG_8=3mZv&pGe+oo_jj z$)?Dr$=0lqp5857DY=j9`;N_^%GL!G6uyDfYTK_djy-s1 z@p$^3hhtK{h6D;9mUo;QQk2ZDm;n8_=|u)XNA7+_;l(!Hl6l9Gn2AP9wT=z zD*=4^Bi2HPcYiSvSZ=2c^m#A(_67EL99`A=uv`sgJ);#d7rf{~T!!QCeSQXU;kDS) zHM7@My_lG?q?vI7k%R#D5clggqP?2R`?BLm`*)M zEvT%~lKg@;5!(GiX`?E`yv!d9uF<@Mwif_*DeBMN1MO&MgA?T+cM%KAs;)#sseR4{ z{(w70zcljS$RBC`&1>dV`@sh&HGes|xXJYx!~49h=;NNzU>eOcXzM<-84T=a9NpFW zhyq8-e%6dDC)_E!Z5Kr(gppUED{a%+Q+NT^rN^1Vavk-lkl%q9riikU$l@AnCOy&-9(yA#ibR#wNJ|yZP#@hS51@%G(47$l6+dL+|*E%$t5;IrgJ?kr2 zi`TLKT44E^ImVH`1NU@1s{{7`bn;LOx?)GlIbzTy65ipp3I7NEbl`(NQ#tg90UCI# zli~|^lIJ#SDyVvtx}UQU*Pys=Aw|Tjrts+1lu@*lng$*eIn)at8OC6!tJ~*Oh;BXh z4CS{NM+fk+IW*!2_ojj`HQ>rm0f`QjJ_wEvK0A|gcP}9i@2$+K4^T$j z_i+6VrNZ`zPmKKyxiT93%%j?8E669zn>4O!AtiT(&=1@a-=h;&k;k^3RNi`ys=L0W z!n!|FL|hYToZPTKucL+@1IMK2x#staYZsE*PWcV^v2LUVVEi_~?;me((%~cF9e&L; z{~r#}5M;QZEr&e(wG>&Vq40dR9}N31<6!v=2wg`ZkyTXF^G~Yj{*G#UE{b(#+3(2B zYX^C4$9nCZC(3~|265e*=0i8x+!DXv81VPLTTlIOc2Z(VJb46ZD89w%s{Lc8|GN&) z#D2A&!ejPOUGMiIZXSbS9G9r5{!irP6HnXyHc|879D_`-Ok@6cPZs`Do>YIbkaS7m zv>mov`aalhkeiY0hc2G~kPYB_G-a2+1>6@*^Dm7dzvd%yb_t-k}_XqQR?MC?fu^01RmJWU6>b{j++(RiL>p80E_);7P%R_O)pRoo$lwG>mus=*9 ze^{Q)?KVliufq@B-ge*t>;sEM{H#+NdgoHqt|ze;D(Kk^Bd5Njs?Kl7+c$|~lUADa z?qu;_!aKYk2|wFvA-WCFK^v)TkEO_OwnIxrJ9NFssfgGnDsKD>`G*vUdmQi6lgXdq zxTW9M;RpAb|Ls_V)V#-`C%1whkD2DzoKvpuVdSh0#QwZa93$f|XZ>Sm^G_QarN52B z<~pB8(*L)sKP9}wYZ1TbKVH@UjNfE$Vo%=PWNF&h*mmH1EVDbnDPRTur>?jKe{Cr9M zLfA&jufeZzQd4wJ6h)+llY^rJ!QOcvxYte?e%AXaX#>s_n5+>3qI`s)C~qM)X|>SU zXSC7Guu7Pvn*HO9qGi+wxn}w1aqvBfKN@E>>Cz&|Gr&`?QmK9g>>Sz>KjWQ$=1cZr zEkzV*1fK{uA+t7B==ohc_58M-(yLR1fN(n@t7M757>BQggrE1fxa23u+h>b74weaX z{LCMFM~6#FrLqa-K?yt8W5v(&&ANYQqa$sPbP{5-b_gve8%+KH+jDGJ?|Gq)cBF<2 zVNsieik5i>TqE#@ZKUGbMdTa!G{vVsaSeXR#E-Dw(!iU$%(0INKXCJY#XfI9f<_3A z^A{@imD14rJ;e62xi7%q`P$&S-BjFFKtVg)h4}Q9Li6D45!ZtG(z<^(RkbZJ@qZ%q zzsME%z~TAK6%Qf1Aw%eUqhmzeBaNf;H?5RZ8ZQKfD}}s@Mbvfp{_DnJ&{GDxd!qC| zbA|1NxO(P_v#>KSMriw0qlqiSvEJyn$f+}ZRClBbet(dli+f6_>3E1F9V*F#RF4}! za|Lz+#}xc`X@t;SfkO4c-J;Jf@%u(tZ+4wI#Xe?UOO6nz(+bHs%Z0Z64~Y6k!Y;}0 zSoy>ru4Y;Cn7UB!zgbwr}&Nuor^>600kLMb<%Q2YB{kthN&R2*|SR*v_81@X_ z3r0Kt{s{*EF{#su{B~-D@PuH2{aKEQjE5_u9UF717rG#`E**P@gOE|URA3*zqWRYT zBjP4UymfXInxhf?BE1CovI6sSBz-tqJY#u|=ZQ=6i}e(pp%cQQHw%ebkKfY&#U6G< zZKuLMqZ2s(#IdLYlfaeHj)~`uIaSz^N6u~<#7~sp0ON@92jdS>qrB;0%6dgcS2g`1_r;c_W zZ|6Bt#<1osr|Ky-JBsb)A7Jml4132JF~qxv+YKZA#&dV#c@^G!5q9cjj$v|p%%w?_ zVQw3I={ns?X_ZOj>gj@by7B`Q&e4cA{zzDFb`9@M$NQo1dCqWq>D9^9{d(Jk%QNHV zJ%u^z9pJ@w{r{rReDpsd`3!Cc?G>T^+xFmXRMMSKgYR^WdmN0L?Y+wVr4$(Dk2tOB zA6WBt^s@@~{e z#*6KC-ba5kAsahUK6c;kCge1xi~A;XVkG>0z4wiF%4y6X4^^aSy)RMP+@3=h{~P^}m4gVQ{+wxS8W=_&sZ~Q4sw=L^2uCd1HNAVfZbZ zA=ZNIF0sBWn0X zJF(`(L=~PC;3#wzD1Z z*4bb1jkFcQqt^Z8) z`QByZ?z#2P3WYijb1|-!#yn3&*@*K~hqmvqznIYGBMb~bbQHPv?~^(W=a0;DZ`^=5Pe{_yK0}UB;OD%<(4lNV>6`%PZ1n8ON%YNNfq%{6u~__fB#UH#XXYDd#qv*EdqtNp{4f?rd8 zsGI^LJ&+Ty6vxWB7@vS}ic08#EF>Y%v!s zE9KiF?Y}3?2GDLNKmyvh;JH=-{ zk9e~Ol{PFeVwfS$iGRq3FSl&AUpZ3$9LF^8)BHR4-+sD^QYzv}SKv(9N3;|L`IqEx zSK3O7NghJJ^O7m&nOXKGFnAj0fzMssj~v|C`p-Y^PBF#46kCgPJILb{ym(dqc%6Ce zeS=&nItWstvPzbUId;Cz{0|J@Oxr?ze$Z$&1DJzFqa8nwIqMl`irTFe5=wUn z%_k7MLHw)x^>)f`NDz|qHX*jl=Tolk1=88r*rX>#UCcQVzo3mjDy&rn@-1?cF233L z4KZsia$!ysogaXFQic9w&;-_Y`uQ(}kYj-Z&q`cn03?MjR!N5_0U2kDD*byg~mO_U6&*A0Bh&LCkfj zi;%QCMrb*8HTO4?A8me(aqNAyg)*vRgtUTnLel_pA6OH{ajX7W|FeA&SMMyu5F%D?p%r5rKxZxTB&*LmJTep@DTZ{v^C@?7-c z3|2vVCMD)7#5M5`zFz+;6-p}yXVurSc{(xYVu-0sP(H*MgKT@LiDI(?NaLvZ(ng_L zVZQ%C2RwlIUM*q?UzH)Iz&TNg-{xyOmhapS#}NxVa%fx7w$EYL;k>ePx_STn9sczl z@~v_O;$Fve$>HDEAFZMTSVKv^ZntmlSBwJ=l~QnQ;03jvdI0UOht8Wiyl?a0R$Hv@ zvzA*2YTdQ(B^K}0b6o3o)~qXr+@I7qt%MrmTMC)& zLR{^?fJcY9zV7Uk^z3MAx`J@Q`2wP|mPCa!NI(<cK78hvq}2obTv%+BgU6jPjHlwPCN)5`hy+lP9e5UY!a{L z;hz_^8P3k+RV+jQk+A*~Qbf+g7Doe$D%^QSwh{DPx}-<@Q8Ve6ODUgY^ktyLv<8q_l wclC1dUi9E%6V~B&={IVA<}7wUeuv-ve}}j9egFUf literal 5430 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 Date: Tue, 7 Mar 2017 22:47:30 +0000 Subject: [PATCH 3/5] Experimental build with Circle CI --- circle.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 circle.yml diff --git a/circle.yml b/circle.yml new file mode 100644 index 0000000000..82debd6c16 --- /dev/null +++ b/circle.yml @@ -0,0 +1,5 @@ +machine: + node: + version: 6.9.5 + + From d3e189973c52aec6f5dc615d7f5b6581ff9fe48a Mon Sep 17 00:00:00 2001 From: Matthew B White Date: Wed, 8 Mar 2017 09:35:18 +0000 Subject: [PATCH 4/5] Getting Started updates, issue & pr template candidates (#379) * Updating reference to commands in the getting started * Correction to the output of the composer cli examples * REST API updates * updates to the quickstart * Draft Issue template * Clean up the contributing notes * Test change * build * Abort the entire travis build * travis login * Travis login but different * traivs login another go * test loging * test loging * pushover notifications --- .travis.yml | 3 ++ PULL_REQUEST_TEMPLATE.md | 42 +++++++++++++++++++ .../scripts/getting-started.sh | 2 +- 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 PULL_REQUEST_TEMPLATE.md diff --git a/.travis.yml b/.travis.yml index b2424ec967..c50ffcd252 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,3 +39,6 @@ deploy: all_branches: true cache: false sudo: required +notifications: + pushover: + api_key: ayq7zvsxc641sfna65njkik1x9y25b diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..410e39e693 --- /dev/null +++ b/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,42 @@ + + +## Checklist +[ ] A link to the issue/user story that the pull request relates to +[ ] How to recreate the problem without the fix +[ ] Design of the fix +[ ] How to prove that the fix works +[ ] Automated tests that prove the fix keeps on working +[ ] Documentation - any JSDoc, website, or Stackoverflow answers? + + +## Issue/User story + + +## Steps to Reproduce + + +1. +2. +3. +4. + + +## Existing issues + +- [ ] [StackOverflow issues](http://stackoverflow.com/tags/fabric-composer) +- [ ] [GitHub Issues](https://github.com/fabric-composer/fabric-composer/issues) +- [ ] [Rocket Chat history](https://chat.hyperledger.org/channel/fabric-composer) + + + +## Design of the fix + + +## Validation of the fix + + +## Automated Tests + + +## What documentation has been provided for this pull request + \ No newline at end of file diff --git a/packages/composer-systests/scripts/getting-started.sh b/packages/composer-systests/scripts/getting-started.sh index ad6b24ab5e..a5039e387d 100755 --- a/packages/composer-systests/scripts/getting-started.sh +++ b/packages/composer-systests/scripts/getting-started.sh @@ -93,7 +93,7 @@ function onRegisterPropertyForSale(propertyForSale) { } EOF -composer archive create --inputDir . --archiveFile digitalproperty-network.bna +composer archive create --sourceType dir --sourceName . --archiveFile digitalproperty-network.bna composer network update --archiveFile digitalproperty-network.bna --enrollId WebAppAdmin --enrollSecret DJY27pEnl16d From 44a7fc8af98c18fc15696be50f810c5d6367f3fd Mon Sep 17 00:00:00 2001 From: Dan Selman Date: Wed, 8 Mar 2017 12:02:44 +0000 Subject: [PATCH 5/5] Added package.json handling to BusinessNetworkMetadata --- packages/composer-common/api.txt | 9 ++- packages/composer-common/changelog.txt | 5 +- .../lib/businessnetworkdefinition.js | 69 ++++++++++--------- .../lib/businessnetworkmetadata.js | 55 ++++++++++++++- .../test/businessnetworkdefinition.js | 7 +- .../test/businessnetworkmetadata.js | 14 +++- .../test/data/zip/test-archive/package.json | 3 +- 7 files changed, 114 insertions(+), 48 deletions(-) diff --git a/packages/composer-common/api.txt b/packages/composer-common/api.txt index 0fa2962f23..f5101d5f8e 100644 --- a/packages/composer-common/api.txt +++ b/packages/composer-common/api.txt @@ -2,7 +2,7 @@ class BaseException extends Error { + void constructor(string) } class BusinessNetworkDefinition { - + void constructor(String,String,String) + + void constructor(String,String,object,String) + String getIdentifier() + BusinessNetworkMetadata getMetadata() + String getName() @@ -16,8 +16,13 @@ class BusinessNetworkDefinition { + Serializer getSerializer() } class BusinessNetworkMetadata { - + void constructor(String) + + void constructor(object,String) + String getREADME() + + object getPackageJson() + + string getName() + + string getDescription() + + string getVersion() + + string getIdentifier() } class Factory { + void constructor(ModelManager) diff --git a/packages/composer-common/changelog.txt b/packages/composer-common/changelog.txt index 073a974378..31b221a321 100644 --- a/packages/composer-common/changelog.txt +++ b/packages/composer-common/changelog.txt @@ -12,10 +12,9 @@ # Note that the latest public API is documented using JSDocs and is available in api.txt. # -Version 0.4.4 {7c78f7d15b222c507f9840f344f42bff} 2017-03-06 +Version 0.4.4 {0e331be906f2098a98a845e92efec2b9} 2017-03-08 +- Added package.json to BusinessNetworkMetadata - Added getBusinessNetworkMetadata to BusinessNetworkDefinition - -Version 0.4.4 {b64498dc085e58b975eebfce7430186a} 2017-02-22 - Added file name and file location to IllegalModelException Version 0.3.7 {120eb2d3b0e487c6e95696aadecec93a} 2017-01-24 diff --git a/packages/composer-common/lib/businessnetworkdefinition.js b/packages/composer-common/lib/businessnetworkdefinition.js index ea0f35b874..0329687e83 100644 --- a/packages/composer-common/lib/businessnetworkdefinition.js +++ b/packages/composer-common/lib/businessnetworkdefinition.js @@ -51,36 +51,49 @@ class BusinessNetworkDefinition { *

* @param {String} identifier - the identifier of the business network. The * identifier is formed from a business network name + '@' + version. The - * version is a semver valid version string. - * @param {String} description - the description of the business network - * @param {String} readme - the optional readme in markdown for the business network + * version is a semver valid version string. If package.json is passed this is ignored. + * @param {String} description - the description of the business network. If package.json is passed then this is ignored. + * @param {object} packageJson - the JS object for package.json (optional) + * @param {String} readme - the readme in markdown for the business network (optional) */ - constructor(identifier, description, readme) { + constructor(identifier, description, packageJson, readme) { const method = 'constructor'; LOG.entry(method, identifier, description); - this.identifier = identifier; - const atIndex = this.identifier.lastIndexOf('@'); + // if package.json is not present we generate one based on the metadata passed + if(!packageJson) { + const atIndex = identifier.lastIndexOf('@'); + let name = null; - if (atIndex >= 0) { - this.name = this.identifier.substring(0, atIndex); - } else { - throw new Error('Malformed business network identifier. It must be "name@major.minor.micro"'); - } + if (atIndex >= 0) { + name = identifier.substring(0, atIndex); + } else { + throw new Error('Malformed business network identifier. It must be "name@major.minor.micro"'); + } + + const version = identifier.substring(atIndex + 1); + if (!semver.valid(version)) { + throw new Error('Version number is invalid. Should be valid according to semver but found: ' + version); + } - this.version = this.identifier.substring(atIndex + 1); - if (!semver.valid(this.version)) { - throw new Error('Version number is invalid. Should be valid according to semver but found: ' + this.version); + packageJson = {}; + packageJson.name = name; + packageJson.version = version; + packageJson.description = description; + LOG.debug(method, 'Created package.json' + JSON.stringify(packageJson)); + } + else { + LOG.debug(method, 'Using package.json' + JSON.stringify(packageJson)); } - this.description = description; this.modelManager = new ModelManager(); this.aclManager = new AclManager(this.modelManager); this.scriptManager = new ScriptManager(this.modelManager); this.introspector = new Introspector(this.modelManager); this.factory = new Factory(this.modelManager); this.serializer = new Serializer(this.factory, this.modelManager); - this.metadata = new BusinessNetworkMetadata(readme); + + this.metadata = new BusinessNetworkMetadata(packageJson,readme); LOG.exit(method); } @@ -89,7 +102,7 @@ class BusinessNetworkDefinition { * @return {String} the identifier of this business network */ getIdentifier() { - return this.identifier; + return this.getMetadata().getIdentifier(); } /** @@ -105,7 +118,7 @@ class BusinessNetworkDefinition { * @return {String} the name of this business network */ getName() { - return this.name; + return this.getMetadata().getName(); } /** @@ -114,7 +127,7 @@ class BusinessNetworkDefinition { * to parse. */ getVersion() { - return this.version; + return this.getMetadata().getVersion(); } @@ -123,7 +136,7 @@ class BusinessNetworkDefinition { * @return {String} the description of this business network */ getDescription() { - return this.description; + return this.getMetadata().getDescription(); } /** @@ -211,10 +224,7 @@ class BusinessNetworkDefinition { return Promise.all(allPromises) .then(() => { LOG.debug(method, 'Loaded package.json'); - let packageName = packageJsonContents.name; - let packageVersion = packageJsonContents.version; - let packageDescription = packageJsonContents.description; - businessNetworkDefinition = new BusinessNetworkDefinition(packageName + '@' + packageVersion, packageDescription, readmeContents); + businessNetworkDefinition = new BusinessNetworkDefinition(null, null, packageJsonContents, readmeContents); LOG.debug(method, 'Loaded all model, JavaScript, and ACL files'); LOG.debug(method, 'Adding model files to model manager'); @@ -247,12 +257,7 @@ class BusinessNetworkDefinition { let zip = new JSZip(); - let packageFileContents = JSON.stringify({ - name: this.name, - version: this.version, - description: this.description - }); - + let packageFileContents = JSON.stringify(this.getMetadata().getPackageJson()); zip.file('package.json', packageFileContents); // save the README.md if present @@ -370,11 +375,9 @@ class BusinessNetworkDefinition { // parse the package.json let jsonObject = JSON.parse(packageJsonContents); let packageName = jsonObject.name; - let packageVersion = jsonObject.version; - let packageDescription = jsonObject.description; // create the business network definition - const businessNetwork = new BusinessNetworkDefinition(packageName + '@' + packageVersion, packageDescription, readmeContents); + const businessNetwork = new BusinessNetworkDefinition(null, null, jsonObject, readmeContents); const modelFiles = []; const modelFileNames = []; diff --git a/packages/composer-common/lib/businessnetworkmetadata.js b/packages/composer-common/lib/businessnetworkmetadata.js index bf2c974d29..67147c2878 100644 --- a/packages/composer-common/lib/businessnetworkmetadata.js +++ b/packages/composer-common/lib/businessnetworkmetadata.js @@ -21,7 +21,8 @@ const LOG = Logger.getLog('BusinessNetworkMetadata'); *

* Defines the metadata for a BusinessNeworkDefinition. This includes: *

    - *
  • README.md
  • + *
  • package.json
  • + *
  • README.md (optional)
  • *
*

* @class @@ -35,16 +36,24 @@ class BusinessNetworkMetadata { * Note: Only to be called by framework code. Applications should * retrieve instances from {@link BusinessNetworkDefinition} *

- * @param {String} readme - the README.md for the business network + * @param {object} packageJson - the JS object for package.json (required) + * @param {String} readme - the README.md for the business network (may be null) */ - constructor(readme) { + constructor(packageJson, readme) { const method = 'constructor'; LOG.entry(method, readme); + if(!packageJson || typeof(packageJson) !== 'object') { + throw new Error('package.json is required and must be an object'); + } + + this.packageJson = packageJson; + if(readme && typeof(readme) !== 'string') { throw new Error('README must be a string'); } + this.readme = readme; LOG.exit(method); } @@ -56,6 +65,46 @@ class BusinessNetworkMetadata { getREADME() { return this.readme; } + + /** + * Returns the package.json for this business network. + * @return {object} the Javascript object for package.json + */ + getPackageJson() { + return this.packageJson; + } + + /** + * Returns the name for this business network. + * @return {string} the name of the business network + */ + getName() { + return this.packageJson.name; + } + + /** + * Returns the description for this business network. + * @return {string} the description of the business network + */ + getDescription() { + return this.packageJson.description; + } + + /** + * Returns the version for this business network. + * @return {string} the description of the business network + */ + getVersion() { + return this.packageJson.version; + } + + /** + * Returns the identifier for this business network, formed from name@version. + * @return {string} the identifier of the business network + */ + getIdentifier() { + return this.packageJson.name + '@' + this.packageJson.version; + } } module.exports = BusinessNetworkMetadata; diff --git a/packages/composer-common/test/businessnetworkdefinition.js b/packages/composer-common/test/businessnetworkdefinition.js index 3a1342ad2f..917c886327 100644 --- a/packages/composer-common/test/businessnetworkdefinition.js +++ b/packages/composer-common/test/businessnetworkdefinition.js @@ -41,7 +41,7 @@ describe('BusinessNetworkDefinition', () => { }); it('should accept README', () => { - const bnd = new BusinessNetworkDefinition('id@1.0.0', 'description', 'readme'); + const bnd = new BusinessNetworkDefinition('id@1.0.0', 'description', null, 'readme'); bnd.getMetadata().getREADME().should.equal('readme'); }); }); @@ -97,6 +97,7 @@ describe('BusinessNetworkDefinition', () => { businessNetwork.getVersion().should.equal('0.0.1'); businessNetwork.getDescription().should.equal('A test business network.'); businessNetwork.getMetadata().getREADME().should.equal('This is a test'); + businessNetwork.getMetadata().getPackageJson().customKey.should.equal('custom value'); Object.keys(businessNetwork.modelManager.modelFiles).should.have.length(3); Object.keys(businessNetwork.scriptManager.scripts).should.have.length(2); businessNetwork.aclManager.getAclRules().should.have.length(5); @@ -141,8 +142,8 @@ describe('BusinessNetworkDefinition', () => { let readFile = fs.readFileSync(__dirname + '/data/zip/test-archive.zip'); return BusinessNetworkDefinition.fromArchive(readFile).then((businessNetwork) => { businessNetwork.should.be.BusinessNetworkDefinition; - businessNetwork.identifier.should.equal('test-archive@0.0.1'); - businessNetwork.description.should.equal('A test business network.'); + businessNetwork.getIdentifier().should.equal('test-archive@0.0.1'); + businessNetwork.getDescription().should.equal('A test business network.'); businessNetwork.getMetadata().getREADME().should.equal('This is a test'); Object.keys(businessNetwork.modelManager.modelFiles).should.have.length(3); Object.keys(businessNetwork.scriptManager.scripts).should.have.length(2); diff --git a/packages/composer-common/test/businessnetworkmetadata.js b/packages/composer-common/test/businessnetworkmetadata.js index 781d7bad87..d75a662bd0 100644 --- a/packages/composer-common/test/businessnetworkmetadata.js +++ b/packages/composer-common/test/businessnetworkmetadata.js @@ -21,16 +21,24 @@ describe('BusinessNetworkMetadata', () => { describe('#constructor', () => { + it('should throw if package.json not specified', () => { + (() => { + new BusinessNetworkMetadata(); + }).should.throw(/package.json is required/); + }); + it('should throw if readme not specified', () => { (() => { - new BusinessNetworkMetadata({}); + new BusinessNetworkMetadata({}, {}); }).should.throw(/README must be a string/); }); - it('should store README', () => { + it('should store package.json and README', () => { const readme = 'TEST README'; - let metadata = new BusinessNetworkMetadata(readme); + const packageJson = {name: 'Foo'}; + let metadata = new BusinessNetworkMetadata(packageJson,readme); metadata.getREADME().should.equal(readme); + metadata.getPackageJson().should.equal(packageJson); }); }); }); diff --git a/packages/composer-common/test/data/zip/test-archive/package.json b/packages/composer-common/test/data/zip/test-archive/package.json index 66875aae26..04a5b082fb 100644 --- a/packages/composer-common/test/data/zip/test-archive/package.json +++ b/packages/composer-common/test/data/zip/test-archive/package.json @@ -1,5 +1,6 @@ { "name": "test-archive", "version": "0.0.1", - "description": "A test business network." + "description": "A test business network.", + "customKey": "custom value" }